Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中使用Pyomo库的强对偶约束_Python_Optimization_Inverse_Pyomo - Fatal编程技术网

Python中使用Pyomo库的强对偶约束

Python中使用Pyomo库的强对偶约束,python,optimization,inverse,pyomo,Python,Optimization,Inverse,Pyomo,我正在实现一个逆优化问题,它不是使用KKT条件,而是应用强对偶定理(原始最优目标和对偶最优目标相等)。为此,需要制定原始问题和对偶问题。我有4台发电机,每个发电机有8个能量块(b)和一个固定需求。这是每小时的市场结算。 最主要的问题是很容易进行市场清算,使用库Pyomo: model = ConcreteModel() model.g1=Var(b, within=NonNegativeReals) model.g2=Var(b, within=NonNegativeReals) model.g

我正在实现一个逆优化问题,它不是使用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])
在这里,我必须将之前所写的对偶问题(2b-2e)中的约束条件作为约束条件,并应用强对偶约束条件,即:

最小值(目标函数原问题)=最大值(目标函数对偶问题)


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

好吧,我没有真正理解你的问题,我还不能评论,所以我发布了一个答案,希望它能帮助你

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

model.dual = Suffix(direction=Suffix.IMPORT)
然后,您可以在其他地方调用模型的实例,您可以通过以下方式获得模型内部约束的双重值:

dual_value = inst.dual[inst.constraint_name]
e、 g:

但是,ofc由于
con_g1max
是一个
约束列表
,因此需要将其索引指定给双重获取算法。比如:

inst.dual[inst.con_g1max[1]]

你所描述的不应该很难。例如,您可以使用
model.dual=后缀(direction=Suffix.IMPORT\u EXPORT)
后缀获得双值。我不会使用名为
lambda
的变量,因为编程中的
lambda
可能有非常不同的含义。我有点搞不懂当你提到方程式2a-2e和2b-2e时你的意思,因为它们在你的Pyomo公式中没有这样标记。
dual_value = inst.dual[inst.constraint_name]
dual_con_g1max = inst.dual[inst.con_g1max]
inst.dual[inst.con_g1max[1]]