Pyomo 具体模型中的稀疏集
Sparse sets in Pyomo Concrete Model
我想在 pyomo 的 ConcreteModel 中创建一个稀疏集。这是一个最小的例子:
import pyomo
import pyomo.environ as pe
m = pe.ConcreteModel
m.P = pe.Set(initialize=['A', 'B', 'C'])
m.Q = pe.Set(initialize=[1, 2, 3, 4, 5, 6, 9, 10, 11])
D1 = {'A': [1, 2, 3], 'B': [9, 10, 11], 'C': [4, 5, 6]}
m.E = pe.Set(initialize=D1)
m.x = pe.Var(m.Q)
m.obj = pe.Objective(expr=1, sense=pe.minimize)
def constraint_rule(m: pe.ConcreteModel, p: str):
return sum(m.x[i] for i in m.E[p]) <= 1
m.add_constraint = pe.Constraint(m.P, rule=constraint_rule)
opt = pe.SolverFactory('gurobi')
opt.solve(m)
当我 运行 这个模型时,我收到以下消息:
TypeError: valid_problem_types() missing 1 required positional argument: 'self'
这是集合构造的问题吗m.E
?
您收到该错误是因为您没有创建 pyomo.environ.ConcreteModel
的实例,而是使用了它的别名。您需要在 m = pe.ConcreteModel()
中使用括号
现在,我假设您想像这样表达您的约束:
x[1] + x[2] + x[3] <= 1
x[9] + x[10] + x[11] <= 1
x[4] + x[5] + x[6] <= 1
使用实际创建的集合。然后你需要创建 model.E
一个 model.P
的子集,因为当前值依赖于 model.P
的每个值。那么你需要修改如下:
m.E = pe.Set(m.P, initialize=D1)
实际模型是这样的:
import pyomo
import pyomo.environ as pe
m = pe.ConcreteModel()
m.P = pe.Set(initialize=['A', 'B', 'C'])
m.Q = pe.Set(initialize=[1, 2, 3, 4, 5, 6, 9, 10, 11])
D1 = {'A': [1, 2, 3], 'B': [9, 10, 11], 'C': [4, 5, 6]}
m.E = pe.Set(m.P, initialize=D1)
m.x = pe.Var(m.Q)
m.obj = pe.Objective(expr=1, sense=pe.minimize)
def constraint_rule(m: pe.ConcreteModel, p: str):
return sum(m.x[i] for i in m.E[p]) <= 1
m.add_constraint = pe.Constraint(m.P, rule=constraint_rule)
opt = pe.SolverFactory('gurobi')
opt.solve(m)
这将为您提供以下解决方案:
>>>m.x.display()
x : Size=9, Index=Q
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 : None : 1.0 : None : False : False : Reals
2 : None : 0.0 : None : False : False : Reals
3 : None : 0.0 : None : False : False : Reals
4 : None : 1.0 : None : False : False : Reals
5 : None : 0.0 : None : False : False : Reals
6 : None : 0.0 : None : False : False : Reals
9 : None : 1.0 : None : False : False : Reals
10 : None : 0.0 : None : False : False : Reals
11 : None : 0.0 : None : False : False : Reals
我假设你明白这只会生成一个可行的解决方案,因为 OF 是一个常数
我想在 pyomo 的 ConcreteModel 中创建一个稀疏集。这是一个最小的例子:
import pyomo
import pyomo.environ as pe
m = pe.ConcreteModel
m.P = pe.Set(initialize=['A', 'B', 'C'])
m.Q = pe.Set(initialize=[1, 2, 3, 4, 5, 6, 9, 10, 11])
D1 = {'A': [1, 2, 3], 'B': [9, 10, 11], 'C': [4, 5, 6]}
m.E = pe.Set(initialize=D1)
m.x = pe.Var(m.Q)
m.obj = pe.Objective(expr=1, sense=pe.minimize)
def constraint_rule(m: pe.ConcreteModel, p: str):
return sum(m.x[i] for i in m.E[p]) <= 1
m.add_constraint = pe.Constraint(m.P, rule=constraint_rule)
opt = pe.SolverFactory('gurobi')
opt.solve(m)
当我 运行 这个模型时,我收到以下消息:
TypeError: valid_problem_types() missing 1 required positional argument: 'self'
这是集合构造的问题吗m.E
?
您收到该错误是因为您没有创建 pyomo.environ.ConcreteModel
的实例,而是使用了它的别名。您需要在 m = pe.ConcreteModel()
现在,我假设您想像这样表达您的约束:
x[1] + x[2] + x[3] <= 1
x[9] + x[10] + x[11] <= 1
x[4] + x[5] + x[6] <= 1
使用实际创建的集合。然后你需要创建 model.E
一个 model.P
的子集,因为当前值依赖于 model.P
的每个值。那么你需要修改如下:
m.E = pe.Set(m.P, initialize=D1)
实际模型是这样的:
import pyomo
import pyomo.environ as pe
m = pe.ConcreteModel()
m.P = pe.Set(initialize=['A', 'B', 'C'])
m.Q = pe.Set(initialize=[1, 2, 3, 4, 5, 6, 9, 10, 11])
D1 = {'A': [1, 2, 3], 'B': [9, 10, 11], 'C': [4, 5, 6]}
m.E = pe.Set(m.P, initialize=D1)
m.x = pe.Var(m.Q)
m.obj = pe.Objective(expr=1, sense=pe.minimize)
def constraint_rule(m: pe.ConcreteModel, p: str):
return sum(m.x[i] for i in m.E[p]) <= 1
m.add_constraint = pe.Constraint(m.P, rule=constraint_rule)
opt = pe.SolverFactory('gurobi')
opt.solve(m)
这将为您提供以下解决方案:
>>>m.x.display()
x : Size=9, Index=Q
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 : None : 1.0 : None : False : False : Reals
2 : None : 0.0 : None : False : False : Reals
3 : None : 0.0 : None : False : False : Reals
4 : None : 1.0 : None : False : False : Reals
5 : None : 0.0 : None : False : False : Reals
6 : None : 0.0 : None : False : False : Reals
9 : None : 1.0 : None : False : False : Reals
10 : None : 0.0 : None : False : False : Reals
11 : None : 0.0 : None : False : False : Reals
我假设你明白这只会生成一个可行的解决方案,因为 OF 是一个常数