哪种算法可以解决这种约束编程问题?

时间:2009-08-09 10:09:51

标签: algorithm performance constraint-programming

我需要解决工作影响问题,我想找到优选的有效算法来解决这个问题。

假设有些工人可以完成多种任务。我们还有一个必须每周完成的任务池。每项任务都需要一些时间。每项任务都必须由某人完成。每个工人必须每周工作N小时。

问题的第一部分似乎是约束编程算法的一个很好的候选者。

但这是复杂的问题:因为工人可以做不同的任务,他们也可能有偏好(或愿望)。如果一个人想要满足每个人的所有愿望,那么问题就没有解决方案(限制太多)。

所以我需要一个算法来解决这个问题。如果完美的车轮已经存在,我不想重新发明轮子。

算法必须公平(如果可以定义这个词),例如我应该能够添加一个约束,例如“尽量满足每个人至少一个愿望”。我不确定这个问题可以通过这里描述的Constraint Hierarchies方法来解决:Constraint Herarchies。事实上,我不确定“公平”和愿望可以通过这类算法的有效约束来表达。

是否有约束编程专家给我一些建议?我是否需要使用一些启发式方法开发新的轮子而不是使用有效的CP算法?

谢谢!

4 个答案:

答案 0 :(得分:7)

您的问题非常复杂,一般解决方案可能需要制定linear-integer问题。另一方面,如果您能够放宽某些要求,您可以使用更简单的方法。例如,bipartite matching允许您将多个工作程序安排到多个作业,甚至可以处理首选项,但无法强制执行一般的“公平”约束。参见例如这related SO questionVertex colouring具有强制执行作业分离约束的算法。

其他海报提到simplexjob shop scheduling。 Simplex是一种优化算法 - 它遍历解决方案空间,寻求最大化某些目标函数。制定目标函数当然可以完成,但不是微不足道的。像二分匹配一样,经典的作业车间调度可以模拟问题的某些方面,但不是全部。例如,没有优先约束。有一些扩展版本可以处理一些约束,例如在任务上设置时间限制。

如果您对现有实现感兴趣,则Python networkx库的实现为this matching algorithm。可能感兴趣的开源时间表程序的一个示例是Tablix

答案 1 :(得分:2)

我已经完成了时间表,这可以被认为是一种约束编程形式。您有硬(不可侵犯)约束和软约束(例如区间首选项)。

线性整数规划通常在超过30个变量后变得无用,这也可以说是单纯形。

通过特定领域的启发式算法优化,找到了解决方案。

使用的启发式算法包括simmulated annealinggenetic algorithmsmetaheuristic算法和类似算法,但最终结果是由定制的greedy search“智能”域提供的算法

基本上,你可以通过这里的一种启发式获得一些不错的结果,但主要的问题是能够辨别出问题是否过度约束。

一个很好的开源研究工具是HeuristicLab

答案 2 :(得分:2)

我同意这里提出的建议。然而,由于商业代码(Xpress,Cplex,Gurobi)或开源(Coin-Or / Cbc),现在实际上解决了非常大的MIP(混合整数规划问题)(远远超过30个变量!)。此外,诸如OPL Studio,GAMS,AMPL,Flop等花哨的建模语言允许编写简单的数学模型而不是使用API​​。

您可以利用NEOS服务器(http://neos.mcs.anl.gov/neos/solvers/index.html)来尝试非常不同的MIP。您以AMPL格式发送模型。尽管AMPL是免费的限制版本,但NEOS可以处理无限制的实例。

CP(COMET / OPL Studio)和本地搜索(COMET)也存在建模语言。

欢迎通过我的网站www.rostudel.com与我联系('联系'页面)

大卫

答案 3 :(得分:0)

这听起来像job shop scheduling