Skip to content
Snippets Groups Projects
Commit 8dd713b6 authored by Christoph von Oy's avatar Christoph von Oy
Browse files

Made pareto analysis available to all entities

parent a0b67081
No related branches found
No related tags found
No related merge requests found
......@@ -21,53 +21,65 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
"""
import pyomo.environ as pyomo
from pyomo.opt import SolverStatus, TerminationCondition
from Model_Library.optimization_model import OptimizationModel
import matplotlib.pyplot as plot
import os
import pyomo.environ as pyo
from pyomo.opt import SolverStatus, TerminationCondition
def pareto_analysis(entity, strategy):
if len(strategy) != 2:
raise ValueError('Pareto analysis can only be done with two strategies!')
model = OptimizationModel(entity._name, entity._dynamic)
entity._topology.build_model(model, strategy)
model.collect_objectives()
def pareto_analysis(prosumer, model, strategy_names):
model = model.block
strategy_names = list(strategy.keys())
strategy_name_1 = strategy_names[0]
strategy_name_2 = strategy_names[1]
solver = pyomo.SolverFactory("gurobi")
solver = pyo.SolverFactory("gurobi")
solver.options['MIPGap'] = 0.01
solver.options['Presolve'] = 2
solver.options['TimeLimit'] = 200
payoff = [[0.0, 0.0], [0.0, 0.0]]
f1 = getattr(model, 'f' + strategy_name_1)
O1 = getattr(model, 'O' + strategy_name_1)
f2 = getattr(model, 'f' + strategy_name_2)
O2 = getattr(model, 'O' + strategy_name_2)
f1 = getattr(model, 'f_' + strategy_name_1)
O1 = getattr(model, 'O_' + strategy_name_1)
f2 = getattr(model, 'f_' + strategy_name_2)
O2 = getattr(model, 'O_' + strategy_name_2)
O2.deactivate()
solver.solve(model)
payoff[0][0] = pyomo.value(f1)
model.cp11 = pyomo.Constraint(expr = f1 == payoff[0][0])
payoff[0][0] = pyo.value(f1)
model.cp11 = pyo.Constraint(expr = f1 == payoff[0][0])
O1.deactivate()
O2.activate()
solver.solve(model)
payoff[0][1] = pyomo.value(f2)
payoff[0][1] = pyo.value(f2)
model.del_component(model.cp11)
solver.solve(model)
payoff[1][1] = pyomo.value(f2)
model.cp22 = pyomo.Constraint(expr = f2 == payoff[1][1])
payoff[1][1] = pyo.value(f2)
model.cp22 = pyo.Constraint(expr = f2 == payoff[1][1])
O2.deactivate()
O1.activate()
solver.solve(model)
payoff[1][0] = pyomo.value(f1)
payoff[1][0] = pyo.value(f1)
r2 = payoff[1][1] - payoff[0][1]
g2 = 4
i2 = 0
number_of_solutions = 0
model.s2 = pyomo.Var(bounds = (0, None))
model.e2 = pyomo.Param(mutable = True)
model.s2 = pyo.Var(bounds = (0, None))
model.e2 = pyo.Param(mutable = True)
model.del_component(model.cp22)
if O2.sense == pyomo.maximize:
if O2.sense == pyo.maximize:
factor = -1
else:
factor = 1
model.cp2 = pyomo.Constraint(expr = f2 + factor * model.s2 == model.e2)
model.cp2 = pyo.Constraint(expr = f2 + factor * model.s2 == model.e2)
O1.deactivate()
model.O = pyomo.Objective(expr = f1 + 0.001 * (model.s2 / r2), sense = O1.sense)
model.O = pyo.Objective(expr = f1 + 0.001 * (model.s2 / r2), sense = O1.sense)
f1_list = []
f2_list = []
pareto_rsl = dict()
......@@ -75,21 +87,19 @@ def pareto_analysis(prosumer, model, strategy_names):
model.e2 = payoff[0][1] + (i2 / g2) * r2
solver_result = solver.solve(model)
if solver_result.solver.status == SolverStatus.ok and solver_result.solver.termination_condition == TerminationCondition.optimal:
f1_list.append(pyomo.value(f1))
f2_list.append(pyomo.value(f2))
pareto_rsl[number_of_solutions] = (pyomo.value(model.x1), pyomo.value(model.x2))
f1_list.append(pyo.value(f1))
f2_list.append(pyo.value(f2))
pareto_rsl[number_of_solutions] = (pyo.value(f1), pyo.value(f2))
number_of_solutions += 1
i2 += 1
else:
i2 = g2 + 1
if not os.path.exists('output_files/'):
os.makedirs('output_files/')
if not os.path.exists('output_files/' + prosumer.name + '/'):
os.makedirs('output_files/' + prosumer.name + '/')
if not os.path.exists('output_files'):
os.makedirs('output_files')
fig, ax = plot.subplots(figsize = (16, 9))
ax.plot(f1_list, f2_list, 'o-.', linewidth = 0.5)
plot.title('Pareto-Front')
plot.grid(True)
plot.xlabel(strategy_name_1)
plot.ylabel(strategy_name_2)
plot.savefig('output_files/' + prosumer.name + '/pareto_front.png')
\ No newline at end of file
plot.savefig('output_files/' + entity._name + '_pareto_front.png')
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment