python - 为什么在模型可行的情况下我无法从 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].pi
或poolmarket.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 值。
我该如何解决这个问题?
提前致谢!
解决方案
推荐阅读
- wordpress - 如何在不同的托管 WP 中复制 ACP Pro 设置?
- pgp - 需要在 Kleopatra 中对 PGP 密钥“更改所有者信任”
- php - PHP:API返回二进制字符串,无法从中创建图像
- javascript - 如何使用 Javascript 重写链接之间的文本
- c# - ASP.NET Core 传递可枚举的对象以在控制器上获取操作
- node.js - Dynamodb 数据库查询中的时间戳比较未按预期工作
- rest - MultiPart PUT 请求在 Spring Boot 中不起作用
- winapi - 如何在 x86 程序集中按值传递结构
- kubernetes - minikube 无法在 mac 上启动
- java - 用 JOLT 通过字典替换数据值