我想縮短以下程序。只有成像有幾十個變量,而不僅僅是X
和Y
。問題是我需要爲每個變量分別定義域。我不喜歡它,因爲它使我的節目更長,更透明。如何縮短以下程序?
輸入:
?- Dom1 in 0..2, Dom2 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom2]), labeling([],[X,Y]).
結果:
X = 0,
Y = 0,
Dom1 = 2,
Dom2 = 0 ? ;
X = 0,
Y = 1,
Dom1 = 1,
Dom2 = 1 ? ;
X = 1,
Y = 0,
Dom1 = 1,
Dom2 = 1 ? ;
X = 1,
Y = 1,
Dom1 = 0,
Dom2 = 2 ? ;
no
起初,我以爲我會簡單地解決它通過寫
?- Dom1 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom1]), labeling([],[X,Y]).
,但它不工作,因爲DOM1相結合(這是clpfd中發生什麼的適當術語?)與一個值,因此唯一的結果是:
X = 0,
Y = 1,
Dom1 = 1 ? ;
X = 1,
Y = 0,
Dom1 = 1 ? ;
no
謝謝!
啊哈,'ins'大大縮短了程序,但我仍需要許多'Dom'變量。我想它不能再縮短。我正在解決一個時間表問題,我需要'global_cardinality'約束來說一個時間段最多可以包含任何課程或一課。 –
2013-05-12 19:19:35
關於時間表格,對每個預定的課程使用一個有限域變量可能會更好,然後要求這些變量(每個課程包含時間段)爲「all_different/1」。這可能會減少變量的數量,因爲空時隙不會被分配給任何課程,也不需要它們自己的變量。 – mat 2013-05-12 21:24:31