Python中Pyomo库的强对偶约束

2024-06-25 06:54:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个反优化问题,它不是使用KKT条件,而是应用强对偶定理(原始最优目标和对偶最优目标相等)。为此,需要对原问题和对偶问题进行阐述。我有4台发电机,每个有8个能量块(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):

^{pr2}$

一旦提出了原始问题和对偶问题,我要解决的真正问题是:

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(目标函数对偶问题)

我的问题是:最后一个约束是如何编写的??


Tags: in目标formodelvarconsumg4
1条回答
网友
1楼 · 发布于 2024-06-25 06:54:58

嗯,我真的不明白你的问题,我还不能发表评论,所以我贴了一个答案,希望能对你有所帮助。在

首先在pyomo中,就像@Qi Chen提到的,你可以访问由solver本身生成的双重值。为此,您需要在模型中添加以下内容:

model.dual = Suffix(direction=Suffix.IMPORT)

然后,您可以在其他地方调用模型实例,并且可以通过以下方式获得模型内部约束的双重值:

^{pr2}$

例如:

dual_con_g1max = inst.dual[inst.con_g1max]

但是,由于con_g1max是一个Constraint_List,所以需要将其索引赋给对偶获取算法。比如:

inst.dual[inst.con_g1max[1]]

相关问题 更多 >