diff --git a/pareto_analysis/pareto_analysis.py b/pareto_analysis/pareto_analysis.py index 3a8f51b5d3784703491f334332f20df20785f472..71d548b86bd2f204e3efc5f9b6dd037fb228a4de 100644 --- a/pareto_analysis/pareto_analysis.py +++ b/pareto_analysis/pareto_analysis.py @@ -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