简体   繁体   English

在 pyomo 中使用索引集

[英]Use indexed sets in pyomo

I have a flow calculation problem that is from the pyomo website.我有一个来自 pyomo 网站的流量计算问题。 I altered some of the sets, because I need to test something for a different model. However, the altered version is not running and I cannot figure out why.我更改了一些设置,因为我需要为不同的 model 测试一些东西。但是,更改后的版本没有运行,我也不知道为什么。 The code is as follows:代码如下:

from pyomo.environ import AbstractModel, Param, minimize, Var, NonNegativeReals,\
    Objective, Constraint, SolverFactory, Set, summation, RangeSet

model = AbstractModel()

## Connections
# pipes
model.Pipes = Set()

## Nodes
# all nodes
model.Nodes = Set()
# Nodes or pipes that going out, e.g. from node a going out to b, c, d
model.NodesOut = Set(model.Nodes)
# Nodes or pipes that going in, e.g. in node a going e, f
model.NodesIn = Set(model.Nodes)

model.Flow = Var(model.Pipes, domain=NonNegativeReals)
model.FlowCost = Param(model.Pipes)

model.Demand = Param(model.Nodes)
model.Supply = Param(model.Nodes)

def Obj_rule(m):
    return summation(m.FlowCost, m.Flow)
model.Obj = Objective(rule=Obj_rule, sense=minimize)

def FlowBalance_rule(m, node):
    return m.Supply[node] \
        + sum(m.Flow[m.NodesIn[node][pipe]] for pipe in m.NodesIn[node]) \
        - m.Demand[node] \
        - sum(m.Flow[m.NodesIn[node][pipe]] for pipe in m.NodesOut[node]) \
        == 0
model.FlowBalance = Constraint(model.Nodes, rule=FlowBalance_rule)

dict_data = {
    None: {
        'Pipes': {None: ['AB', 'AC', 'CB']},
        'Nodes': {
            None: ['CityA', 'CityB', 'CityC']
        },
        'NodesIn': {
            'CityA': [],
            'CityB': ['AB', 'CB'],
            'CityC': ['AC',]
        },
        'NodesOut': {
            'CityA': ['AB', 'AC'],
            'CityB': [],
            'CityC': ['CB',]
        },
        'Demand': {
            'CityA': 0,
            'CityB': 1,
            'CityC': 1,
        },
        'FlowCost': {
            'AB': 1.4,
            'AC': 2.7,
            'CB': 1.6,
        },
        'Supply': {
            'CityA': 2,
            'CityB': 0,
            'CityC': 0,
        }
    }
}

I get the following error: IndexError: NodesIn[CityA] indices must be integers, not str.我收到以下错误:IndexError:NodesIn[CityA] 索引必须是整数,而不是 str。 I understand the error, but I do not understand why a string cannot be used.我明白这个错误,但我不明白为什么不能使用字符串。 Pyomo solves this pipe flow problem as follows: Pyomo 解决这个 pipe 流问题如下:

from pyomo.environ import AbstractModel, Param, minimize, Var, NonNegativeReals,\
    Objective, Constraint, SolverFactory, Set, summation, RangeSet

model = AbstractModel()

## Connections
# # all connections
model.Arcs = Set(dimen=2)

## Nodes
# all nodes
model.Nodes = Set()
# Nodes or pipes that going out, e.g. from node a going out to b, c, d
model.NodesOut = Set(model.Nodes)
# Nodes or pipes that going in, e.g. in node a going e, f
model.NodesIn = Set(model.Nodes)

model.Flow = Var(model.Arcs, domain=NonNegativeReals)
model.FlowCost = Param(model.Arcs)

model.Demand = Param(model.Nodes)
model.Supply = Param(model.Nodes)

def Obj_rule(m):
    return summation(m.FlowCost, m.Flow)
model.Obj = Objective(rule=Obj_rule, sense=minimize)

def FlowBalance_rule(m, node):
    return m.Supply[node] \
        + sum(m.Flow[i, node] for i in m.NodesIn[node]) \
        - m.Demand[node] \
        - sum(m.Flow[node, j] for j in m.NodesOut[node]) \
        == 0
model.FlowBalance = Constraint(model.Nodes, rule=FlowBalance_rule)

dict_data = {
    None: {
        'Arcs': {None: [('CityA', 'CityB'), ('CityA', 'CityC'), ('CityC', 'CityB')]},
        'Nodes': {
            None: ['CityA', 'CityB', 'CityC']
        },
        'NodesIn': {
            'CityA': [],
            'CityB': ['CityA', 'CityC'],
            'CityC': ['CityA',]
        },
        'NodesOut': {
            'CityA': ['CityB', 'CityC'],
            'CityB': [],
            'CityC': ['CityB',]
        },
        'Demand': {
            'CityA': 0,
            'CityB': 1,
            'CityC': 1,
        },
        'FlowCost': {
            ('CityA', 'CityB'): 1.4,
            ('CityA', 'CityC'): 2.7,
            ('CityC', 'CityB'): 1.6,
        },
        'Supply': {
            'CityA': 2,
            'CityB': 0,
            'CityC': 0,
        }
    }
}

For my more complex problem, I would need to use the first version of the code (using the indexed set m.NodesIn).对于更复杂的问题,我需要使用代码的第一个版本(使用索引集 m.NodesIn)。

I have solved the problem for code I. The FlowBalance_rule has to be reformulated as follows:我已经解决了代码 I 的问题。FlowBalance_rule 必须重新表述如下:

def FlowBalance_rule(m, node):
    return m.Supply[node] \
        + sum(m.Flow[pipe] for pipe in m.NodesIn[node]) \
        - m.Demand[node] \
        - sum(m.Flow[pipe] for pipe in m.NodesOut[node]) \
        == 0
model.FlowBalance = Constraint(model.Nodes, rule=FlowBalance_rule)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM