2014-02-27 36 views
1

我有一個任務列表,它們之間有一些相互依賴關係。 9個任務。 每個cpu組6個cpu 2。 有三個組p1,p2,p3。Minizinc中的ReifiedConstraint

cost p1=4 
COST p2=5 
COST P3=2 

給出了不同CPU在不同任務下的執行時間。 我們必須在任務之間傳輸數據。我們將使用點對點鏈接。 我們需要購買兩個cpu之間的點對點鏈接,它將花費我們1美元,我們可以稍後重複使用這些鏈接。

問題: 我想指定這些約束。 r1!=r4 <=> b14=1; b14是任務1和4之間通信的通信時間。 我還需要爲鏈接付費。 r1:分配給CPU任務1。

if r1!=r4 then cost[r1][r4]=1; 

任何人都可以告訴我如何在Minizinc中指定這兩個約束? 我不想使用如果然後約束,如果我可以使用reified的一切,它會更好。

回答

2

在MiniZinc中,當條件涉及決策變量時,不能使用「if condition then ... else ... endif」。相反reifications然後必須使用,他們使用說明「 - >」,「< - 」和「< - >」:

c1 -> c2 implication 
    c2 <- c1 implication (same as c1 -> c2) 
    c1 <-> c2 equivalence 

所以,兩個約束應該這樣寫(假設「R1」和「R4」是決策變量):

constraint 
    (r1 != r4 <-> b14=1) 
    /\ 
    (r1 != r4 -> cost[r1,r4] = 1) 
; 

始終把括號圍繞reifications用「約束」部分中不止一個約束工作時,否則解析器可以解釋的約束走錯了路。

而且,請注意,

cost[r1,r2] 

提到一個矩陣的元素都寫,如果你能使用的if/then/else語句/ ENDIF構建,那麼你可能應該這樣做,因爲平移物化爲通常成本更高。