Pyomo 中基于初始化集的二维参数

问题描述 投票:0回答:1

我有一个二维列表如下:

s = [
[0,0,9,6,8,1,6,2,3,9],
[0,0,0,3,1,1,2,5,7,8],
[3,10,0,2,6,4,0,4,8,3],
[7,10,10,0,9,0,2,3,10,7],
[1,10,8,9,0,9,6,6,8,8], 
[1,1,9,8,5,0,5,7,10,0],
[3,2,2,6,7,1,0,6,0,6],
[7,1,0,5,5,7,5,0,9,6],
[10,5,7,3,0,10,1,4,0,7],
[10,4,6,0,9,1,3,10,6,0]
]

现在,我想将此列表转换为

Pyomo
参数,或者是否可以直接使用此列表作为方程中的参数:

start[i] + p[i] + s[i,j] >= start[j]    for all i,j in J: i < j

我尝试的是定义我的列表,然后添加一个参数:

m.PAIRS_1 = Set(initialize = m.J * m.J, dimen=2, filter=lambda m, j, k : j < k)
m.setup   = Param(initialize = m.PAIRS_1, default = s)

但是当我运行模型时,出现以下错误:

KeyError: "Cannot treat the scalar component 'setup' as an indexed component"

我想知道我该如何解决这个问题?

optimization pyomo mixed-integer-programming
1个回答
0
投票

我会尝试这个。我假设

s
始终是方阵(否则您的
start
变量会出现问题)。

import pyomo.environ as pyo

s = [
[0,0,9,6,8,1,6,2,3,9],
[0,0,0,3,1,1,2,5,7,8],
[3,10,0,2,6,4,0,4,8,3],
[7,10,10,0,9,0,2,3,10,7],
[1,10,8,9,0,9,6,6,8,8], 
[1,1,9,8,5,0,5,7,10,0],
[3,2,2,6,7,1,0,6,0,6],
[7,1,0,5,5,7,5,0,9,6],
[10,5,7,3,0,10,1,4,0,7],
[10,4,6,0,9,1,3,10,6,0]
]

m = pyo.ConcreteModel()

m.I = pyo.Set(initialize=range(len(s)))

m.IJ_subset = pyo.Set(within=m.I * m.I, 
    initialize=[(i, j) for i in m.I for j in m.I if i < j])

def s_initializer(m, i, j):
    return s[i][j]
m.setup = pyo.Param(m.I, m.I, initialize=s_initializer)

m.p = pyo.Param(m.I, initialize = 1.5)

m.start = pyo.Var(m.I, domain=pyo.NonNegativeReals)

def start_constraint(m, i, j):
    return m.start[i] + m.p[i] >= m.start[j]
m.C1 = pyo.Constraint(m.IJ_subset, rule=start_constraint)

m.pprint()
© www.soinside.com 2019 - 2024. All rights reserved.