Pyomo(Python)中创建双索引列表的技术咨询
在Pyomo中构建双索引列表的正确姿势
嗨,我明白你想要构建一个维度明确的双索引列表来存储Pyomo变量x[i,j]的值,已经搞定单索引的你,在双索引这里遇到了小困惑对吧?我来给你捋清楚怎么操作,还会避开常见的坑~
首先,避开浅拷贝的坑
你提到尝试过x = []*value(m.ph),这种方式其实有问题——它会创建一个包含value(m.ph)个同一个空列表引用的列表,之后修改任何一个子列表,所有子列表都会跟着变,这肯定不是你想要的。
方法1:先初始化明确维度的空列表,再填充值
如果你想先创建一个和Pyomo变量维度完全匹配的空二维列表,再逐个填充value(m.x[i,j]),可以这么做:
# 先获取两个维度的大小(假设m.ph和m.n是你的Pyomo Set) ph_dim = value(m.ph) n_dim = value(m.n) # 用列表推导式初始化二维列表,避免浅拷贝 # 这里range的范围和你单索引的逻辑一致,从0到n_dim(包含) x = [[0 for _ in range(n_dim + 1)] for _ in range(ph_dim + 1)] # 嵌套循环填充每个元素 for i in range(ph_dim + 1): for j in range(n_dim + 1): x[i][j] = value(m.x[i,j])
方法2:直接用列表推导式一次性生成
如果你的m.ph和m.n本身就是Pyomo的Set对象,其实可以直接遍历Set来生成列表,不用手动计算维度大小,更简洁也不容易出错:
# 外层遍历i的Set,内层遍历j的Set,直接取值 x = [[value(m.x[i,j]) for j in m.n] for i in m.ph]
这样生成的列表会自动和你Pyomo变量的索引维度完全对应,省去了手动计算维度的步骤。
验证一下
你可以打印一下x的结构,比如print(x),就能看到每个x[i][j]都正确存储了对应Pyomo变量的值,而且维度完全符合你的预期~
内容的提问来源于stack exchange,提问作者Manuel Duran Perez
相关产品推荐
相关产品推荐

