Python Pyomo约束声明

Python Pyomo约束声明,python,model,constraints,pyomo,Python,Model,Constraints,Pyomo,begginer对pyomo说,我有一个问题需要对我的约束进行编码 以下是我的输入数据: S = ['E', 'L'] #shits N = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #employee ID D = [1,2,3] #days R = {(1, 'D'): 1, (1, 'N'): 1, (2, 'D'): 1, (2, 'N'): 1, (3, 'D'): 2, (3, 'N'):3} # cover requirement {(day,shif

begginer对pyomo说,我有一个问题需要对我的约束进行编码

以下是我的输入数据:

S = ['E', 'L'] #shits
N = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #employee ID
D = [1,2,3] #days
R = {(1, 'D'): 1,
 (1, 'N'): 1,
 (2, 'D'): 1,
 (2, 'N'): 1,
 (3, 'D'): 2,
 (3, 'N'):3} # cover requirement {(day,shift):number of employees required}
我是这样做的:

model.N = Set(initialize = N)
model.S = Set(initialize = S)
model.D = Set(initialize = D)

model.N_S_D = Set(within = model.N * model.S * model.D,
                 initialize = [(n, s, d) for n in model.N for s in model.S for d in model.D])
决策变量声明:

model.x = Var(model.N_S_D, within=Binary, initialize=0)
约束声明,其中约束为

(在我的模型中,r是r)


除了我得到错误的约束之一:
namererror:name'd'未定义之外,所有单元格都工作正常。给出这个错误,我想知道我的set声明
model.N\u S\u D
是否正确。其次,我不清楚如何声明集合覆盖要求(
R
),以及我是否应该这样做?谢谢

您的代码中有几个问题

  • 你的班次不匹配。(见下文我的发言)
  • 当您看到“for each”表示法时,您需要为集合或组合集合的每个元素创建一个约束…您要求和的内容需要在求和表达式中,并且您需要循环“for eaches”是一种很好的思考方式。。。我想你疯了
  • 您没有正确地表达
    sum()
    表达式。您需要在求和的对象中定义索引的来源。我建议你在pyomo之外尝试一些关于
    sum()
    的练习题,以便更好地处理它
  • 将来,如果您将所有代码以工作(或至少产生错误)的格式粘贴到一个块中,以便有人可以直接复制并处理它,这将更有帮助
下面是两种不同的方法来回答你的问题。首先是使用
约束列表
的方法。备选方案使用了一个函数约束组合,我发现这更容易,但两者都可以。。。。只是不要同时包含这两个,因为它们是多余的。:)

生成:
我知道我不想对你说谢谢,但你的回答是如此详细和有益,我想这样做!非常感谢:)
model.C1 = ConstraintList()
for N in model.N_S_D:
    const_expr = sum(model.x[(d, s) == R[(d, s)]])
    model.C1.add(expr = const_expr)
from pyomo.environ import *

S = ['D', 'N'] #shifts
N = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #employee ID
D = [1, 2, 3] #days
R = {   (1, 'D'): 1,
        (1, 'N'): 1,
        (2, 'D'): 1,
        (2, 'N'): 1,
        (3, 'D'): 2,
        (3, 'N'): 3} # cover requirement {(day,shift):number of employees required}


model = ConcreteModel('shift schedule')
model.N = Set(initialize = N)
model.S = Set(initialize = S)
model.D = Set(initialize = D)

model.N_S_D = Set(within = model.N * model.S * model.D,
                 initialize = [(n, s, d) for n in model.N for s in model.S for d in model.D])

model.x = Var(model.N_S_D, within=Binary)  #, initialize=0)

model.C1 = ConstraintList()
shift_day_combos = [(s, d) for s in model.S for d in model.D]
for s, d in shift_day_combos:
    const_expr = sum(model.x[(n, s, d)] for n in model.N) == R[(d, s)]
    model.C1.add(expr = const_expr)

# alternate approach...

def cover_requirement(model, s, d):
    return sum(model.x[n, s, d] for n in model.N) == R[d,s]

model.C2 = Constraint(model.S, model.D, rule=cover_requirement)

model.pprint()
...
2 Constraint Declarations
    C1 : Size=6, Index=C1_index, Active=True
        Key : Lower : Body                                                                                                        : Upper : Active
          1 :   1.0 : x[0,D,1] + x[1,D,1] + x[2,D,1] + x[3,D,1] + x[4,D,1] + x[5,D,1] + x[6,D,1] + x[7,D,1] + x[8,D,1] + x[9,D,1] :   1.0 :   True
          2 :   1.0 : x[0,D,2] + x[1,D,2] + x[2,D,2] + x[3,D,2] + x[4,D,2] + x[5,D,2] + x[6,D,2] + x[7,D,2] + x[8,D,2] + x[9,D,2] :   1.0 :   True
          3 :   2.0 : x[0,D,3] + x[1,D,3] + x[2,D,3] + x[3,D,3] + x[4,D,3] + x[5,D,3] + x[6,D,3] + x[7,D,3] + x[8,D,3] + x[9,D,3] :   2.0 :   True
          4 :   1.0 : x[0,N,1] + x[1,N,1] + x[2,N,1] + x[3,N,1] + x[4,N,1] + x[5,N,1] + x[6,N,1] + x[7,N,1] + x[8,N,1] + x[9,N,1] :   1.0 :   True
          5 :   1.0 : x[0,N,2] + x[1,N,2] + x[2,N,2] + x[3,N,2] + x[4,N,2] + x[5,N,2] + x[6,N,2] + x[7,N,2] + x[8,N,2] + x[9,N,2] :   1.0 :   True
          6 :   3.0 : x[0,N,3] + x[1,N,3] + x[2,N,3] + x[3,N,3] + x[4,N,3] + x[5,N,3] + x[6,N,3] + x[7,N,3] + x[8,N,3] + x[9,N,3] :   3.0 :   True
    C2 : Size=6, Index=C2_index, Active=True
        Key      : Lower : Body                                                                                                        : Upper : Active
        ('D', 1) :   1.0 : x[0,D,1] + x[1,D,1] + x[2,D,1] + x[3,D,1] + x[4,D,1] + x[5,D,1] + x[6,D,1] + x[7,D,1] + x[8,D,1] + x[9,D,1] :   1.0 :   True
        ('D', 2) :   1.0 : x[0,D,2] + x[1,D,2] + x[2,D,2] + x[3,D,2] + x[4,D,2] + x[5,D,2] + x[6,D,2] + x[7,D,2] + x[8,D,2] + x[9,D,2] :   1.0 :   True
        ('D', 3) :   2.0 : x[0,D,3] + x[1,D,3] + x[2,D,3] + x[3,D,3] + x[4,D,3] + x[5,D,3] + x[6,D,3] + x[7,D,3] + x[8,D,3] + x[9,D,3] :   2.0 :   True
        ('N', 1) :   1.0 : x[0,N,1] + x[1,N,1] + x[2,N,1] + x[3,N,1] + x[4,N,1] + x[5,N,1] + x[6,N,1] + x[7,N,1] + x[8,N,1] + x[9,N,1] :   1.0 :   True
        ('N', 2) :   1.0 : x[0,N,2] + x[1,N,2] + x[2,N,2] + x[3,N,2] + x[4,N,2] + x[5,N,2] + x[6,N,2] + x[7,N,2] + x[8,N,2] + x[9,N,2] :   1.0 :   True
        ('N', 3) :   3.0 : x[0,N,3] + x[1,N,3] + x[2,N,3] + x[3,N,3] + x[4,N,3] + x[5,N,3] + x[6,N,3] + x[7,N,3] + x[8,N,3] + x[9,N,3] :   3.0 :   True

11 Declarations: N S D N_S_D_domain_index_0 N_S_D_domain N_S_D x C1_index C1 C2_index C2