Eclipse CLP标签:排除排列

时间:2019-04-26 07:00:24

标签: prolog clpfd eclipse-clp

我正在解决调度问题(此处简述:SWI Prolog CLP(FD) scheduling切换为ECLP)。

我能够快速获得一些解决方案,但现在我想加入一些优化任务。

问题/时间表行的一部分看起来像D1,D2,N1,N2,A0,A1,A2,..,A9,其中此变量的成本为C1,C1,C1,C1,C2,C2,C2,...,C2。因此,从这个角度来看,对A0..A9的分配的任何排列都具有相同的成本。但是,很显然,在标注过程中,求解器会回溯所有可能性。

简短说明:我只是在脑子里计算这个,但我认为仅针对此描述部分的搜索空间就像来自大小为15的域的大小为10的子集的数量 * 10!。这是要回溯的相当大的空间。而且从成本/优化以及约束满足的角度来看,每个排列都具有相同的成本/可满足性-变量的顺序无关紧要。

我可以以某种方式影响标签/搜索过程,以免打扰某些列表中的变量顺序吗?还是可以提供一些方法来重塑问题,使其能够以这种方式工作?

1 个答案:

答案 0 :(得分:3)

您正在谈论的是建模中的对称性问题,并且有一个专门研究整个问题的领域。我要说的基本上是三种解决方法:

  1. 使用不同的变量重新构建模型,从而本质上减少了表示等效解决方案的方式
  2. 添加对称破坏约束,以减少解决方案的总数,但每个等价类至少保留一个。通常,这是通过算术或词典顺序约束来完成的,它们有效地定义了解决方案的“规范”表示形式。
  3. 尝试使用系统提供的动态对称破坏技术,例如ldbs。这些通常会描述对称性,并尝试对此做些事情(但不要指望奇迹)。

在您的情况下,我将从第1点开始:您当前具有变量 A [I,D] = W ,尽管“变量D在类型D的I插槽I被工人W填满了”您所有的A插槽都等效。

您可以改为使用二进制变量 JobA [D,W] = 1 “工人W在D天完成了A类工作”,并附带了约束sum(JobA[D,*])#=10以确保您有10个插槽。

我可以想象的另一个模型是变量 Job [D,W] = T “工人W在D天完成T类型的工作”(将您的T类型编码为1..3)并使用occurrences/3gcc/2约束来执行各种条件。