簡體   English   中英

Pyomo:多目標優化

[英]Pyomo: Multi-objective optimization

我正在使用此代碼來解決多目標優化模型(電源調度)並嘗試在我的代碼中調整一個示例。

示例:https://stackoverflow.com/questions/50742999/multi-objective-optimization-example-pyomo。

我試圖直接跳過“低效的帕累托前沿”部分和 plot 的“有效的帕累托前沿”。

第一個選項卡可以正常運行並生成Cost_min、Cost_max、Emission_min、Emission_max。

from pyomo.environ import *
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import random

# create a model
model = AbstractModel()

# declare decision variables

model.N = Param(mutable=True)
model.J = RangeSet(model.N)
model.A = Param(model.J)
model.B = Param(model.J)
model.C = Param(model.J)
model.D = Param(model.J)
model.E = Param(model.J)
model.F = Param(model.J)
model.P_min = Param(model.J, within=PositiveReals)
model.P_max = Param(model.J, within=PositiveReals)
model.demand = Param(mutable=True)

# declare constraints

def Pbounds(model, j):
    return (model.P_min[j], model.P_max[j])
model.P = Var(model.J, bounds=Pbounds, domain=NonNegativeReals)

def P_LoadgenBalance(model):
    return sum(model.P[j] for j in model.J) >= model.demand
model.P_LoadgenBalance = Constraint(rule=P_LoadgenBalance)

# declare objective_cost

def obj_cost(model):
     return sum(model.A[j]* model.P[j] ** 2 + model.B[j] * model.P[j] + model.C[j] for j in model.J) 
model.cost= Objective(rule=obj_cost, sense=minimize)
# declare objective_emission
def obj_emission(model):
     return sum(model.E[j]* model.P[j] ** 2 + model.D[j] * model.P[j] + model.F[j] for j in model.J) 
model.emission= Objective(rule=obj_emission, sense=minimize)

# deactivate model.emission  calculate emission_max,cost_min

model.emission.deactivate()
instance = model.create_instance("E:\pycharm_project\PD\END-10units.dat")
opt = SolverFactory('Ipopt')
results = opt.solve(instance)
for i in instance.J:
    print(i,value(instance.P[i]))
print( 'cost = ' + str(value(instance.cost)) )
print( 'emission = ' + str(value(instance.emission)) )
emission_max = value(instance.emission)
cost_min = value(instance.cost)


# ## max emission  deactivate model.cost    calculate emission_min,cost_max

model.emission.activate()
model.cost.deactivate()
instance = model.create_instance("E:\pycharm_project\PD\END-10units.dat")
results = opt.solve(instance)


for i in instance.J:
    print(i,value(instance.P[i]))
print( 'cost = ' + str(value(instance.cost)) )
print( 'emission = ' + str(value(instance.emission)) )
emission_min = value(instance.emission)
cost_max = value(instance.cost)

運行此選項卡中的代碼后,未生成任何錯誤。 但是當輸出一個帕累托前沿時,這里只顯示一個點。

# ## apply normal $\epsilon$-Constraint

model.emission.deactivate()
model.cost.activate()
model.emission_value = Param(initialize=0, mutable=True)

def c_epsilon(model):
    return model.emission <= model.emission_value
model.C_epsilon = Constraint(rule=c_epsilon)
results = opt.solve(instance)

print('Each iteration will keep emission lower than some values between emission_min and emission_max, so ['       + str(emission_min) + ', ' + str(emission_max) + ']')

n = 5
step = int((emission_max - emission_min) / n)
steps = list(range(int(emission_min), int(emission_max), step)) + [emission_max]


# ## apply augmented $\epsilon$-Constraint

# max   emission + delta*epsilon <br>
#  s.t. emission - s = emission_value

model.del_component(model.cost)
model.del_component(model.emission)
model.del_component(model.C_epsilon)

model.delta = Param(initialize=0.00001)

model.s = Var(within=NonNegativeReals)

def obj_cost_1(model):
    return sum(model.cost+model.delta * model.s)
model.obj_cost_1 = Objective(rule=obj_cost_1, sense=maximize)

def C_e(model):
    return model.emission-model.s==model.emission_value
model.C_e= Constraint(rule=C_e)

cost_l = []
emission_l = []
for i in steps:
    model.emission_value = i
    results = opt.solve(instance)  
    cost_l.append(value(instance.cost))
    emission_l.append(value(instance.emission))
plt.plot(cost_l,emission_l,'o-.');
plt.title('efficient Pareto-front');
plt.grid(True);
plt.show()

結果如下所示。 我不知道為什么這不能 output 一個正確的帕累托圖。我不知道代碼的哪一步是錯誤的。

高效的 Pareto-front誰能幫我處理這段代碼? 謝謝。維維

幾件事.... :)

怎么了:

在循環內部,影響 model 的唯一因素是您將新值分配給model.e那是什么? 我認為這是一個錯字,您錯誤地只是聲明了一個名為e的新的未使用的 model 組件實例變量。 這就是為什么你沒有得到不同的值。 我認為您想更改為model.emission

此外,我不會在第一個 go 中嘗試 1000 個解決方案,只需嘗試 5 個。

應該清理什么:

您正在循環中實例化一個新的求解器。 沒有必要。 您不需要 1000 個不同的求解器,只需重新求解即可。 您已經有一個之前聲明的求解器。

為了清晰起見,在代碼中添加一些注釋不會讓你着火,並且有助於 T/S,以及一些重新組織。

此外, model.A model.B model.C... 如果可以的話,我會建議更清晰的變量名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM