Python 如何约束pyomo中的一些变量?
我正在使用pyomo研究一个优化问题(状态任务网络)。我正在使用Github笔记本中描述的基本示例 我将问题简化为减少任务和状态的数量,如下所示:Python 如何约束pyomo中的一些变量?,python,optimization,pyomo,Python,Optimization,Pyomo,我正在使用pyomo研究一个优化问题(状态任务网络)。我正在使用Github笔记本中描述的基本示例 我将问题简化为减少任务和状态的数量,如下所示: Kodili = { # time grid 'TIME': range(0, H+1), # states 'STATES': { 'Feed_A' : {'capacity': 500, 'initial': 500, 'price': 0}, 'Product_1
Kodili = {
# time grid
'TIME': range(0, H+1),
# states
'STATES': {
'Feed_A' : {'capacity': 500, 'initial': 500, 'price': 0},
'Product_1': {'capacity': 500, 'initial': 0, 'price': 10}
},
# state-to-task arcs indexed by (state, task)
'ST_ARCS': {
('Feed_A', 'Reaction_1') : {'rho': 1.0},
('Feed_A', 'Reaction_2') : {'rho': 1.0},
('Feed_A', 'Reaction_3') : {'rho': 1.0},
},
# task-to-state arcs indexed by (task, state)
'TS_ARCS': {
('Reaction_1', 'Product_1') : {'dur': 2, 'rho': 1},
('Reaction_2', 'Product_1') : {'dur': 2, 'rho': 1},
('Reaction_3', 'Product_1') : {'dur': 2, 'rho': 1}
},
# unit data indexed by (unit, task)
'UNIT_TASKS': {
('Reactor_1', 'Reaction_1'): {'Bmin': 0, 'Bmax': 80, 'Cost': 1, 'vCost': 0, 'Tclean': 0},
('Reactor_1', 'Reaction_3'): {'Bmin': 0, 'Bmax': 20, 'Cost': 1, 'vCost': 0, 'Tclean': 0},
('Reactor_2', 'Reaction_2'): {'Bmin': 0, 'Bmax': 30, 'Cost': 1, 'vCost': 0, 'Tclean': 0},
('Reactor_2', 'Reaction_3'): {'Bmin': 0, 'Bmax': 50, 'Cost': 1, 'vCost': 0, 'Tclean': 0},
},
}
我的问题是,我只需要添加一个约束,强制某些单位在同一任务上同时运行
基本上,我需要添加的规则是:
- 反应器1可执行反应1(完成)
- 反应器2可执行反应2(完成)
- 反应器1和反应器2可以进行反应3(但需要同时进行)
for j in UNITS:
for t in TIME:
lts = 0
for i in I[j]:
for x in I[j]:
for tprime in TIME:
if i!=x and tprime >= (t-p[i]+1-UNIT_TASKS[(j,i)]['Tclean']) and tprime <= t:
lts += model.W[i,j,tprime]
model.cons.add(lts <= 1)
以单位表示的j的:
对于t及时:
lts=0
因为我在i[j]:
对于I[j]中的x:
对于tptime:
如果我=x和tprome>=(t-p[i]+1-UNIT_任务[(j,i)]['Tclean'])和tprome看起来你对tprome的限制是向后的。从链接来看,tprome应该是=t
,并且更新的链接不需要-它实际上与问题中的链接相同;一般来说,在这种情况下,最好更新问题本身(评论可能随时被删除)。
Reactor_1 Reactor_2
0 ('Reaction_1', 80.0)
1 ('Reaction_3', 50.0) <-- This couldn't be a solution
2 ('Reaction_1', 80.0)
3 ('Reaction_2', 30.0)
4 ('Reaction_1', 80.0)
5
Reactor_1 Reactor_2
0 ('Reaction_1', 80.0)
1 ('Reaction_3', 80.0) ('Reaction_3', 50.0) <-- Something like this must be the output for R3
2 ('Reaction_1', 80.0)
3 ('Reaction_2', 30.0)
4 ('Reaction_1', 80.0)
5