Contraint逻辑编程调度

时间:2015-10-26 14:10:34

标签: prolog scheduling clp

我正试图在prolog中使用clp解决问题。问题如下:

基本上,一艘船载有许多集装箱,我们想卸下它们。容器被描述为谓词容器(I,N,D),其中I是容器标识符,N是卸载所需的人数,D是持续时间。示例可能如下所示:

容器(A,1,1)。
容器(B,2,2)。
容器(C,2,2)。
容器(d,3,3)。

容器也可以放在另一个容器之上,如:

在(A,C)。
上(B,C)。
上(C,d)。

容器a位于c之上,依此类推......

问题是尽量减少卸载容器的成本。费用定义为雇用的人数乘以所需时间。所有人都在整个卸货期间受雇。

我从问题开始遇到问题,因为我不熟悉prolog的clp部分。有没有人对如何解决问题有任何建议,或者你在哪里可以找到关于clp prolog如何工作的例子?

2 个答案:

答案 0 :(得分:3)

如果为每个作业的“开始”和“结束”声明时间变量,则cumulative / 2可以对整个过程进行建模,serialized / 2可以对on / 2约束进行建模:

...
Tasks =
    [task(SA,1,EA,1,_)
    ,task(SB,2,EB,2,_)
    ,task(SC,2,EC,2,_)
    ,task(SD,3,ED,3,_)],
cumulative(Tasks, [limit(MAX)]),

serialized([SA,SC,SD],[1,2,3]),
serialized([SB,SC,SD],[2,2,3]),
...

这已经产生了一个合理的解决方案,并且易于表达总时间的最小化。

...
labeling([min(max(EA,max(EB,max(EC,ED))))], [SA,SB,SC,SD]).

[SA,SB,SC,SD] = [0,0,2,4]

但是必须计算计划的成本,乘以所需的工作人员数和总持续时间。实际上,这是一个复杂的计算,因为它取决于任务的重叠。我们不能简单地在重叠任务上添加工作人员,因为不同持续时间的任务可能使用同一组工作人员。

我认为有一个诀窍'适用:极限迭代加深(MAX),从所需的绝对最小值开始(对于容器d,在这种情况下为3)。

修改

抱歉我错了序列化/ 2。应该用显式比较代替,比如

EA #=< SC,
...

答案 1 :(得分:2)

哦,所以我添加了

EA #=< SC,
EB #=< SC,
EC #=< SD,

解决方案似乎是正确的,所以这很好。但我觉得这应该更为一般。有没有办法生成:

EA #=< SC,
EB #=< SC, 
EC #=< SD,

通过调用使用:

的generate_constrains()之类的东西
on(A,C).
on(B,C).
on(C,D).

构建约束。