Python 如何约束pyomo中的一些变量?

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

我正在使用pyomo研究一个优化问题(状态任务网络)。我正在使用Github笔记本中描述的基本示例

我将问题简化为减少任务和状态的数量,如下所示:

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(但需要同时进行)
需要添加的关键规则是:反应3只能由反应器1和反应器2同时执行。(如果反应器1对反应3起作用,则反应器2必须同时对反应3起作用,且作用时间必须相同

我试图修改提议的限制,以限制一个单位只能分配给一项任务。我添加了类似“I!=x”的内容,因此此规则仅适用于不同的任务

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