公平轮班分配

2024-05-18 12:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对nurse_sat进行了稍微修改
https://github.com/google/or-tools/blob/master/examples/python/nurses_sat.py
我有一本字典,里面有(day,nurse,shift)=BoolVar的键值pares 我想让所有的护士每班都有相同的量。在

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

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

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))

理论上,这应该能告诉我一个护士有多少个特定的班次。E、 G:fairshift[(0,0)]应该是护士A一周中的0班。为了让他们平等,我做了这样的事情:

^{pr2}$

因此,一个护士的最大k班数等于最小值,如果num_days为30,他们都应该有10个轮班

但是,我不能让它工作,我不知道为什么。为了使用IntVar而不是unu summarray,我做了如下操作:

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的情况下,它可以工作,但给出错误的结果。我想我在总结一些错误,但我不确定是什么。在


Tags: infor错误rangedayssatnumshifts
1条回答
网友
1楼 · 发布于 2024-05-18 12:33:51
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)

相关问题 更多 >

    热门问题