总体而言,问题很简单:安排一队员工为每人一人的保险,在任何一天,员工分成3个池,每个员工都有休假要求,每个员工都有每周最多2班,等等。
我讨厌手动这样做,因为它在我的组织已经完成了几个世纪。我喜欢像遗传算法那样做一些很酷的事情(例如[1] http://www.sersc.org/journals/IJAST/vol14/1.pdf)。
那里有可靠的开源/免费替代品吗?这听起来像是一个优化问题,我可以启动C ++,R等来插入一些优化库吗?
感谢
答案 0 :(得分:7)
这是一个优化问题。奇怪的是,它被称为调度问题。 :-D 根据数据的大小,您可能需要使用Metaheuristics,如遗传算法,蚂蚁群优化等,但我会从这里开始推广您自己的基于启发式的规则。
基本上,将规则定义为事物之间的关联(人A不能同时在度假和工作中)或时间表上的条件(在任何给定时间只有三个人)。然后创建一个计划,并逐个插入所有员工。如果在插入时规则被破坏,则不要插入并选择其他人员。
如果你这样做,这应该是一个有效但不太理想的时间表,你可以做一些很酷的事情,比如定义操作符(swap,move,3-swap),这会给你带来帮助邻域(通过应用运营商可以达到的所有有效时间表)。然后,您可以选择附近的最佳时间表,并重复。这是邻里血统。但是有很多基于社区的方法可供选择。我相信模拟退火在应用于调度问题时是很好的。
答案 1 :(得分:6)
您可以尝试OptaPlanner(之前称为Drools Planner),它基于Java和开源。
答案 2 :(得分:3)
您可能也对约束编程框架感兴趣,其中许多是开源的,例如Choco(Java),Gecode(C ++)以及其他已经用于这些类型的问题的框架虽然我同意ravloony的观点,但是如果他提到的那种风格的算法可能会解决你所描述的问题,那么可能是值得的。
答案 3 :(得分:0)
由于每天只有一个人,这似乎可以设置为整数/二进制编程问题。有许多包进行整数编程。无论您决定使用什么方法来解决这些问题,这些问题的棘手部分是找到一种指定问题约束的简明方法。在这种情况下,假期要求究竟是什么等等。