2017-10-28 128 views
1

列給定的矩陣Z [N,M]:檢查多少1是在基質中的#minizinc

0 0 0 0 0 
0 0 1 0 0 
0 0 0 0 0 
1 0 0 0 0 
0 0 1 0 0 

我想檢查多少個「1」,也有在不同的列的矩陣。因此,在這種情況下給定k = 1,問題應該是不可滿足的,因爲在列中有2個「1」,所以「數目1」> k。我試過這種方式,但它不起作用:

constraint forall(i in n, j in m) forall(k in n) k<=(Z[i,j]\/Z[k,j]) 

我在哪裏錯了?

在這種情況下,我有這個變數我該怎麼辦?

int b; 
int: k; 
set of int: PEOPLE = 1..p;  
set of int: STOPS = 1..s; 
array [1..b, PEOPLE, STOPS] of var bool: Z; 


Z[1] 
0 0 0 0 0 
0 0 1 0 0 
0 0 0 0 0 
1 0 0 0 0 
0 0 1 0 0 

Z[2] 
0 1 0 0 0 
0 0 0 0 0 
0 1 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

p = 5; 
s =5; 
k=1; 
b=2; 

因此,在這種情況下,結果應該是:

Z[1]: 1 0 1 0 0 , the number of "1" is 2, "2 > K" 
Z[2]: 0 1 0 0 0, the number of "1" is 1, "1<=K" 
UNSATISFIABLE 
+2

是的約束條件是每列最多可以有一個? – hakank

+0

不,以上面我寫的約束條件是我試圖總結每列的「1」,然後計算有多少「1」。因爲第一列只有「1」,第三列只有「1」,所以我想要結果2。然後將此數字與「k」進行比較。 –

+1

你認爲解決方案會是什麼?考慮到你的描述,它只會給出錯誤(「UNSATISFIED」),因爲約束只是檢查約束。另外,你能顯示完整的代碼嗎?該約束有幾個語法錯誤。 爲了強制一列中1的個數最多爲k,您可以執行: forall(j in 1..n)(sum([Z [i,j] | i in 1..m])< = k) 如果你想顯示每列中的1的數量,你必須定義一個長度爲m的數組,其中包含第j列的總和...... – hakank

回答

1

我只是解決了這種方式:

array [1..b, STOPS] of var bool: M; 
constraint forall (m in 1..b) (forall (j in STOPS) ( M[m,j]= exists([Z[m,i,j] | i in PEOPLE ]))); 
constraint forall (m in 1..b) (let { 
      var int: s = sum (j in STOPS)(M[m,j]>0); 
     } in 
      s <= t ); 

謝謝大家的答案:)

相關問題