我正在研究医生调度应用程序,我们正在使用线性规划和像 cplex/lindo 这样的求解器来求解我们的模型。由于一些建模限制,我们需要为夜班生成二进制模式。
通常我们会生成一个月的时间表,所以让我们考虑一下我们需要为夜班生成 30 天的模式。
夜班有一些限制,比如如果一个人连续上夜班,那么医生接下来五天都不能工作。下面是一些约束的例子。
111000001111100000111110000011 Valid
111000001100000000111110000011 Valid
111010001111101000111110000011 Invalid
还有其他约束,例如模式中的数量应该小于某个定义的值,连续的数量应该小于某个定义的值等。
首先,我尝试了简单的算法,该算法从 0 开始并使用按位运算符并添加一个以获得下一个排列,如果无效则检查所有约束的下一个排列是否有效,获取下一个排列并忽略无效模式。由于此模式的长度为 30 位(2 30 = 1073741824),因此模式的数量很大,需要检查我的简单算法。我想找出所有有效模式需要超过 24 小时。
现在我的问题是
对于给定的问题,我应该使用哪种算法来找到所有排列并以时间有效的方式应用约束?
这个问题是一个精确的覆盖问题吗?我可以将诸如跳舞链接之类的算法应用于我面临的问题吗?
请提供一些链接以阅读您针对此问题提出的解决方案?