TL; DR版:有没有办法解决存在大个最佳解决方案的优化问题(解决方案,找到最好的客观价值)?也就是说,找到一个最佳解决方案非常快速(但显然高度依赖于问题的大小),但是存在许多这样的解决方案,以便求解器无休止地运行以试图找到更好的解决方案(无休止地因为它确实找到了其他可行的解决方案,但目标值等于当前的最佳值。
不是TL; DR版本: 对于大学项目,我需要实施一个调度程序,该调度程序应输出每年学习的每个大学课程的时间表。我提供了一些数据,就这个问题而言,它只是坚持一般但没有那么罕见的例子。
在许多部分,您都有必修课程和选修课程。有时,这些可选课程分为模块,学生需要选择其中一个模块。通常,他们必须选择两个模块,但有些组合比其他组合更频繁。显然,如果计算课程数量(强制性+选修课程)而不考虑细分为模块,那么您的课程恰好比需要安排的时间段更多。我的模型非常简单。我有限制说明每个课程应该安排在一个且只有一个时间段(2个小时),并且教授不应该同时提供两个课程。这些是严格的限制。问题是,在一个完美的世界中,我应该添加严格的约束条件,说明学生不能同时拥有两门课程。但是因为我没有足够的数据并且模块的每个组合都是可能的,所以没有必要为每个组合创建一个学生强制性+模块1 +模块2并且对每个学生应用硬约束,因为它与一个学生(强制性+所有选项)基本相同,并尝试适应严格的约束 - 这将失败。
这就是为什么我决定在优化问题中移动那些硬约束。我只是简单地定义我的目标函数,为每个学生最小化他/她同时安排的课程数量。
如果我只用一个学生(22个课程)和20个时段来运行这个简单模型,我的目标值应该是4(因为每2个课程嵌入2个时隙)。但是,使用Gurobi,轻松的目标是0(因为你可以在一个时间段内拥有一小部分课程)。因此,当求解器确实达到成本4的解时,它不能直接证明最优性。真正的麻烦在于,对于这个简单的情况,存在巨大数量的最佳解决方案(22!也许......)。因此,为了证明最优性,它将经历所有其他解决方案(其共享相同的目标),拼命地试图找到在松弛目标(0)和当前目标(4)之间具有较小间隙的解决方案。显然,这种解决方案并不存在......
您对我如何解决这个问题有任何想法吗?我想分析现有的数据库,并试图弄清楚哪些模块组合很可能发生,这样我就可以放回硬约束但看起来很危险(也许我会选择导致冲突的组合因此找不到任何解决方案或省略有效组合)。我使用的当前解决方案是设置时间阈值来停止优化...