2015-10-26 114 views
3

我試圖解決在序言中使用clp的問題。問題如下:Contraint邏輯編程計劃

基本上一艘船正在運載一些集裝箱,我們想卸載它們。容器被描述爲謂詞容器(I,N,D),其中I是容器標識符,N是卸載所需的人數,D是持續時間。示例可能如下所示:

container(a,1,1)。
集裝箱(b,2,2)。
集裝箱(c,2,2)。
集裝箱(d,3,3)。

容器也可以放在另一個的頂部,如:

上(A,C)。 (b,c)上的
。 (c,d)上的

容器是基於C的頂部等等...

的問題是,以儘量減少裝卸集裝箱的費用。成本被定義爲僱用的人數乘以所需時間。所有人都在整個卸貨期間被僱用。

我遇到了問題,因爲我不熟悉prolog的clp部分。有沒有人對如何解決這個問題有什麼建議,或者你可以找到有關clp prolog如何工作的例子?

+0

允許多少個堆棧?如果只有一個堆棧,那麼需要的人數將與需要最多人數的容器相同?如果有不止一個堆棧,那麼在每個堆棧上分別工作的人有多少「幫派」? – user27815

回答

3

如果你聲明的開始時間變量,每個作業結束,然後cumulative/2可以模擬整個過程,和serialized/2可以模擬開/ 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),從所需要的絕對最低起(3,集裝箱d,在這種情況下)。

編輯

對不起,我錯了約串行/ 2。應該明確的比較來代替,像

EA #=< SC, 
... 
2

歐凱,所以我加了

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

與解決方案似乎是正確的,那麼這就是好的。但我覺得這應該更一般。有沒有一種方法來產生:使用

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

通過調用類似generate_constrains():

on(A,C). 
on(B,C). 
on(C,D). 

並構建約束。