首页 > 解决方案 > 为什么在模型可行的情况下我无法从 Gurobipy 获得影子价格?

问题描述

我正在尝试解决点对点市场优化问题。由于不同参与者之间每笔交易的价格可能不同,我想画出每笔交易的价格。而且问题应该是一个连续模型,因为交易量可以在任何水平。

该模型已经可以正常运行,没有问题,我可以使用 like 获取每笔交易的交易金额model.variables.trade[t,k,y].x

但问题是当我尝试从相关约束中获取影子价格时,它显示:GurobiError: Unable to retrieve attribute 'Pi'

我不知道这个错误是怎么来的,因为模型已经可行,我所做的是获取一个已经存在的属性。

我的代码的相关部分如下所示:

def _build_constraints(self):
        m = self.model
        P_nm3 = self.variables.P_nm3
        agents = self.data.agents

        timewindow = self.data.timewindow           
        windowinterval = self.data.windowinterval      
        budget = self.data.budget
        P_n = self.variables.P_n

        self.constraints.pnmmatch = {}    
        ......

        for t in self.data.interval:
            for i in range(len(P_nm3[t])):
                for j in range(len(P_nm3[t][0])):
                    self.constraints.pnmmatch[t,i,j] = m.addConstr(
                            P_nm3[t][i][j],
                            gb.GRB.EQUAL,
                            -P_nm3[t][j][i]
                            )
        .......
poolmarket = marketclear()
poolmarket.optimize()

print(poolmarket.constraints.pnmmatch[0,1,6])
print(type(poolmarket.constraints.pnmmatch))

print(poolmarket.constraints.pnmmatch[0,1,6].pi)
shadow_price = poolmarket.model.getAttr(gb.GRB.Attr.Pi)

结果是:

<gurobi.Constr R1001>
<class 'dict'>
AttributeError: Unable to retrieve attribute 'pi'

两者都poolmarket.constraints.pnmmatch[0,1,6].pipoolmarket.model.getAttr(gb.GRB.Attr.Pi)不起作用。如果我评论关于 pi 的最后两行,模型工作得很好。

但是在一个更简单的类似模型中,约束是:

        for t in self.data.interval:
            for i in range(len(P_nm3[t])):
                for j in range(len(P_nm3[t][0])):
                    self.constraints.pnmmatch[t] = m.addConstr(
                            P_nm3[t][i][j],
                            gb.GRB.EQUAL,
                            -P_nm3[t][j][i]
                            )

然后我可以用poolmarket.constraints.pnmmatch[0].pi 命令绘制 pi 值。

我该如何解决这个问题?

提前致谢!

标签: pythonoptimizationgurobi

解决方案


推荐阅读