表母 |使用索引集创建简单模型

Pyomo | Creating simple model with indexed set

我在 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 的函数,因为它会求和不允许再次使用的值(例如,如上所述,“Cars”车辆类型的“New sail”)。似乎唯一的方法是参考 set_dict 并对其进行循环和求和?

我需要创建一个抽象模型,所以我希望能够以pyomo原生方式写出这个模型,而不是依赖额外的字典和其他对象来传递右边dimensions/sets进入模型。

知道我该怎么做吗?

你没有说你的数据是什么形式,但下面的一些变体应该有效。我不是 AbstractModels 的超级粉丝,但数据的每种格式都应该有一些适应性来构建 稀疏集 这是你想要做的来表示 [=11 的合法组合=] x C.

通过在您的约束中添加成员资格测试,您仍然可以根据需要对 VC 求和。

import pyomo.environ as pyo

m = pyo.AbstractModel()

### SETS
m.V = pyo.Set()
m.C = pyo.Set()
m.VC = pyo.Set(within = m.V*m.C)

### VARS
m.select = pyo.Var(m.VC, domain=pyo.Binary)

### CONSTRAINTS
def constr(m,v):
    return sum(m.select[v,c] for c in m.C if (v,c) in m.VC) == 2
m.Constraint = pyo.Constraint(m.V, rule= constr)