【发布时间】:2021-09-10 20:00:00
【问题描述】:
我在 pyomo 中创建简单模型时遇到问题。我想定义以下抽象模型:
尝试创建抽象模型
我定义
m.V = pyo.Set()
m.C = pyo.Set() # I first wanted to make this an indexed set in m.V, but this does not work as I cannot create variables with indexed sets (in next line)
m.Components = pyo.Var(m.V*m.C, domain=Binary)
现在我不知道如何添加约束。只需添加
Def constr(m,v):
return sum([m.Components[v,c] for c in m.C]) == 2
m.Constraint = Constraint(m.V, rule= constr)
将导致模型还将m.C 中不应属于m.V 的组件相加(例如,如果我通过m.V = ['Cars', 'Boats'],并且我想通过的'Boats' 组件之一是‘New sails’;上面的约束也会对m.Components[‘Cars’,’New sails’]施加约束,没有多大意义。
想出一个具体的例子
现在,如果我尝试以具体的方式解决这个问题并遵循例如Variable indexed by an indexed Set with Pyomo,我仍然遇到约束问题。例如。假设我想创建一个具有这种结构的模型:
set_dict = {‘Car’:[ ‘New wheels’, ’New gearbox’, ’New seats’],’Boat’: [’New seats’, ‘New sail’, ‘New rudder‘]}
然后我创建这些集合和变量:
m.V = pyo.Set(initialize=[‘Car’,’Boat’])
m.C = pyo.Set(initialize=[‘New wheels’, ’New gearbox’, ’New seats’, ‘New sail’, ‘New rudder‘])
m.VxC = pyo.Set(m.V*m.C, within = set_dict)
m.Components = pyo.Var(m.VxC, domain=Binary)
但现在我仍然看不到以 pyomo 原生方式添加约束的方法。我不能定义一个函数来对m.C 求和,因为它会对不允许的值求和(例如,如上所述,“汽车”车辆类型的“新帆”)。似乎唯一的方法是参考 set_dict 并循环和求和?
我需要创建一个 abstract 模型,所以我希望能够以 pyomo 原生方式写出这个模型,而不是依赖额外的字典和其他对象来传递正确的维度/集合进入模型。
知道我该怎么做吗?
【问题讨论】:
标签: python linear-programming pyomo