0

我有一个稍微修改过的nurse_sat版本
https://github.com/google/or-tools/blob/master/examples/python/nurses_sat.py
我有一个键值字典(day,nurse,shift) ) = BoolVar 我想让所有护士每次轮班的数量相同。

EG:假设我们有 30 天,每天有 3 个班次{0, 1, 2},我们有 3 名护士 {a,b,c}
我想让所有护士在 0、10 班做 10班次 2 和班次 3 的 10。

我试图实现这一目标的方式是:

fairshift = {}
for j in range(num_nurses):
 for k in range(num_shifts):
  fairshift[(j,k)] = sum(shifts[(i, j, k)] for i in range(num_days))

从理论上讲,这应该让我知道一名护士有多少特定的轮班。EG: fairshift[(0, 0)] 应该有护士 A 在一周内的 0 班次的数量。然后为了让他们平等,我做了这样的事情:

for k in range(num_shifts):
 solver.Add(min([fairshift[(j, k)] for j in range(num_nurses)]) == max([fairshift[(j,k)] for j in range(num_nurses)]))

因此,护士的最大 k 班次将等于最小的班次,如果 num_days 为 30,则他们都应该有 10 班 k 班次。

但是,我无法让它工作,我不确定为什么。为了有 IntVar 而不是 _SumArray,我做了这样的事情:

for j in range(num_nurses):
 for k in range(num_shifts):
  fairshift[(j,k)] = solver.NewIntVar(0, num_days, "%i,%i" % (j,k))
  solver.Add(fairshift[(j,k)] == sum(shifts[(i, j, k)] for i in range(num_days)))

在 min .== max 的情况下,它可以工作但给出错误的结果。我想我总结错了,但我不确定它是什么。

4

1 回答 1

2
fairshift = {}
for n in range(num_nurses):
  for s in range(num_shifts):
    sum_of_shifts[(n, s)] = model.NewIntVar(0, num_days, 'sum_of_shifts_%i_%i' % (n, s))
    model.Add(sum_of_shifts[(n, s)] == sum(shifts[(d, n, s)] for d in range(num_days)))


for s in range(num_shifts):
  min_fair_shift = model.NewIntVar(0, num_days, 'min_fair_shift_%i' % s)
  max_fair_shift = model.NewIntVar(0, num_days, 'max_fair_shift_%i' % s)
  model.AddMinEquality(min_fair_shift, [sum_of_shifts[(n, s)] for n in range(num_nurses)])
  model.AddMaxEquality(max_fair_shift, [sum_of_shifts[(n, s)] for n in range(num_nurses)]) 

  model.Add(max_fair_shift - min_fair_shift <= 1)
于 2018-11-18T17:24:55.923 回答