在 pyomo 中使用索引集
Use indexed sets in pyomo
我有一个来自 pyomo 网站的流量计算问题。我改变了一些设置,因为我需要为不同的模型测试一些东西。但是,更改后的版本不是 运行,我不明白为什么。代码如下:
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,
}
}
}
我收到以下错误:IndexError:NodesIn[CityA] 索引必须是整数,而不是 str。
我明白这个错误,但我不明白为什么不能使用字符串。 Pyomo 解决这个管道流问题如下:
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,
}
}
}
对于更复杂的问题,我需要使用代码的第一个版本(使用索引集 m.NodesIn)。
我已经解决了代码 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)
我有一个来自 pyomo 网站的流量计算问题。我改变了一些设置,因为我需要为不同的模型测试一些东西。但是,更改后的版本不是 运行,我不明白为什么。代码如下:
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,
}
}
}
我收到以下错误:IndexError:NodesIn[CityA] 索引必须是整数,而不是 str。 我明白这个错误,但我不明白为什么不能使用字符串。 Pyomo 解决这个管道流问题如下:
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,
}
}
}
对于更复杂的问题,我需要使用代码的第一个版本(使用索引集 m.NodesIn)。
我已经解决了代码 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)