Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制每天工作的范围数_C#_Or Tools - Fatal编程技术网

C# 限制每天工作的范围数

C# 限制每天工作的范围数,c#,or-tools,C#,Or Tools,我正在编写代码,以便为我的员工自动生成轮班。 我已经能够创建几个约束: 一天中的每个班次都分配给一名工人 每个工人每天工作不得超过8小时 每个工人每周应工作[分班次,最大班次]小时 每个工人不能同时在不同的房间工作 每个工人一天不能在超过两个不同的房间工作 到目前为止还不错;现在我面临着另一个约束,我真的无法思考如何编码:每个工人一天不能在超过2个不同的范围内工作。 我的意思是,我不希望一个人工作,例如08.30-10.30、12.30-13.30和16.30-18.30,但将分配的范围限制为两

我正在编写代码,以便为我的员工自动生成轮班。 我已经能够创建几个约束:

一天中的每个班次都分配给一名工人 每个工人每天工作不得超过8小时 每个工人每周应工作[分班次,最大班次]小时 每个工人不能同时在不同的房间工作 每个工人一天不能在超过两个不同的房间工作 到目前为止还不错;现在我面临着另一个约束,我真的无法思考如何编码:每个工人一天不能在超过2个不同的范围内工作。 我的意思是,我不希望一个人工作,例如08.30-10.30、12.30-13.30和16.30-18.30,但将分配的范围限制为两个


鉴于我有班次[numWorkers,numDays,NumShift],我如何安排这一约束条件?

如果您在两个小时[8AM shift,9AM shift]的每个时段都使用这些变量, 创建一个布尔值,如果第一个班次是开的,第二个班次是关的,则该布尔值为真

end_of_shift = model.NewBoolVar('')
model.AddBoolOr([first_shift.Not(), second_shift, end_of_shift])
model.AddImplication(end_of_shift, first_shift)
model.AddImplication(end_of_shift, second_shift.Not())

# then for each day and each worker: 
model.Add(sum(end_of_shifts) <= 2)

那么一个移位总是由1 | 2个移位组成?并且只限于1 | 2间房间?范围是否限于一个房间?@CasparKleijne:一个班次是1小时,在一个房间里,我每天可以有10个班次。我认为一个范围内的多班在一个单一的房间连接,而不是打破。我希望一个工人一天内不能有两个以上的破损范围。希望它是清楚的,但如果不是请问我!谢谢你我想关于非休息日的小时数/班次和范围+8的排列只有28个每天1个范围,给我们36个,可以加上这些吗?@CasparKleijne:我想还有很多排列:我有超过15个工人,每个范围可以从1小时到8小时不等,并且可以在工作日的不同时间传播……非常感谢Laurent,我知道应该有办法,但我没有对你的工具进行深入研究,真遗憾!:过了很长时间才回来。你帮我的那部分不是每次都有用。。。有时有效,有时无效。最后我意识到错在哪里:如果你白天有一个班次,最后一个班次没有一个班次的结束,所以没有考虑,我最终有了一个额外的、未计算的范围。为了克服这个问题,我添加了一个假移位,最后总是空的,现在一切都很完美!再次感谢各位: