我正在解决调度问题(此处简述: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!。这是要回溯的相当大的空间。而且从成本/优化以及约束满足的角度来看,每个排列都具有相同的成本/可满足性-变量的顺序无关紧要。
我可以以某种方式影响标签/搜索过程,以免打扰某些列表中的变量顺序吗?还是可以提供一些方法来重塑问题,使其能够以这种方式工作?
答案 0 :(得分:3)
您正在谈论的是建模中的对称性问题,并且有一个专门研究整个问题的领域。我要说的基本上是三种解决方法:
在您的情况下,我将从第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/3或gcc/2约束来执行各种条件。