我正在实现一个逆优化问题,该问题不使用 KKT 条件,而是应用强对偶定理(原始最优目标和对偶最优目标相等)。为此,需要制定原始问题和对偶问题。我有 4 个发电机,每个发电机有 8 个能量 block (b),并且有固定需求。这是每小时的市场清算。
主要问题是简单的市场清算,使用库 Pyomo
如下:
model = ConcreteModel()
model.g1=Var(b, within=NonNegativeReals)
model.g2=Var(b, within=NonNegativeReals)
model.g3=Var(b, within=NonNegativeReals)
model.g4=Var(b, within=NonNegativeReals)
model.obj = Objective(expr=
(sum(g1price[i]*model.g1[i] for i in b)+
sum(g2price[i]*model.g2[i] for i in b)+
sum(g3price[i]*model.g3[i] for i in b)+
sum(g4price[i]*model.g4[i] for i in b)))
model.con_power_balance=Constraint(
expr=
(sum(model.g1[i] for i in b)+
sum(model.g2[i] for i in b)+
sum(model.g3[i] for i in b)+
sum(model.g4[i] for i in b)- demand) == 0)
model.con_g1max=ConstraintList()
for i in b:
model.con_g1max.add(model.g1[i] <= gsize[i])
model.con_g2max=ConstraintList()
for i in b:
model.con_g2max.add(model.g2[i] <= gsize[i])
model.con_g3max=ConstraintList()
for i in b:
model.con_g3max.add(model.g3[i]< = gsize[i])
model.con_g4max=ConstraintList()
for i in b:
model.con_g4max.add(model.g4[i] <= gsize[i])
假设前面的方程被命名为 (1a-1f)。如果没有指定,则设置为默认值以最小化目标函数。由于原问题是一个最小化问题,所以它的对偶问题一定是一个最大化问题。但它等效于 max[F(x)] == min[-F(x)],这就是我所应用的。这是对偶问题(方程 2a-2e):
model = ConcreteModel()
model.mu_g1max=Var(b, within=NonNegativeReals)
model.mu_g2max=Var(b, within=NonNegativeReals)
model.mu_g3max=Var(b, within=NonNegativeReals)
model.mu_g4max=Var(b, within=NonNegativeReals)
model.mu_g1min=Var(b, within=NonNegativeReals)
model.mu_g2min=Var(b, within=NonNegativeReals)
model.mu_g3min=Var(b, within=NonNegativeReals)
model.mu_g4min=Var(b, within=NonNegativeReals)
model.lambda=Var(b, within=NonNegativeReals)
model.obj = Objective(expr=
(sum(gsize[i]*model.mu_g1max[i] for i in b)+
sum(gsize[i]*model.mu_g2max[i] for i in b)+
sum(gsize[i]*model.mu_g3max[i] for i in b)+
sum(gsize[i]*model.mu_g4max[i] for i in b))
model.con_g1_dual=ConstraintList()
for i in b:
model.con_g1_dual.add(model.lambda[i]+model.mu_g1min[i]-model.mu_g1max <= gsize[i])
model.con_g2_dual=ConstraintList()
for i in b:
model.con_g2_dual.add(model.lambda[i]+model.mu_g2min[i]-model.mu_g2max <= gsize[i])
model.con_g3_dual=ConstraintList()
for i in b:
model.con_g3_dual.add(model.lambda[i]+model.mu_g3min[i]-model.mu_g3max <= gsize[i])
model.con_g4_dual=ConstraintList()
for i in b:
model.con_g4_dual.add(model.lambda[i]+model.mu_g4min[i]-model.mu_g4max <= gsize[i])
一旦提出原始问题和对偶问题,我必须解决的真正问题如下:
model = ConcreteModel()
model.lambda=Var(b, within=NonNegativeReals)
model.obj = Objective(expr=
np.absolute(sum(model.lambda[i]-lambda_ini[i] for i in b*4)))
在这里,我必须将之前编写的对偶问题 (2b-2e) 中的约束作为约束,并应用强对偶约束:
min(目标函数原问题)= max(目标函数对偶问题)
这是我的问题:最后一个约束如何编写?
最佳答案
嗯,我不太明白你的问题,我还不能发表评论,所以我发布一个答案,希望它能对你有所帮助。
首先在pyomo中,就像@Qi Chen提到的那样,您可以访问由求解器本身生成的对偶值。为此,您需要在模型中添加以下内容:
model.dual = Suffix(direction=Suffix.IMPORT)
然后您可以在其他地方调用模型的实例,并且可以通过以下方式获取模型内部的约束的对偶值:
dual_value = inst.dual[inst.constraint_name]
例如:
dual_con_g1max = inst.dual[inst.con_g1max]
但是,由于 con_g1max
是一个 Constraint_List
,因此您需要将其索引提供给对偶获取算法。像:
inst.dual[inst.con_g1max[1]]
关于python - 在 Python 中使用 Pyomo 库的强对偶约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47380259/