我有一个二维列表如下:
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"
我想知道我该如何解决这个问题?
我会尝试这个。我假设
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()