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​​ 是一个常数