我有一个稍微修改过的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 的情况下,它可以工作但给出错误的结果。我想我总结错了,但我不确定它是什么。