我正试图在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如何工作的例子?
答案 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).
构建约束。