【问题标题】:Pyomo | Creating simple model with indexed set皮莫 |使用索引集创建简单模型
【发布时间】: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


    【解决方案1】:

    你没有说你的数据是什么形式的,但下面的一些变化应该可以工作。我不是 AbstractModels 的忠实拥护者,但数据的每种格式都应该有一些适应性来构建 sparse sets,这就是你想要做的来表示 V x @987654322 的合法组合@。

    通过在约束中添加成员资格测试,您仍然可以根据需要对 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)
    

    【讨论】:

    • 这非常聪明,而且很有道理——谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2010-10-28
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2017-12-02
    相关资源
    最近更新 更多