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
是的約束條件是每列最多可以有一個? – hakank
不,以上面我寫的約束條件是我試圖總結每列的「1」,然後計算有多少「1」。因爲第一列只有「1」,第三列只有「1」,所以我想要結果2。然後將此數字與「k」進行比較。 –
你認爲解決方案會是什麼?考慮到你的描述,它只會給出錯誤(「UNSATISFIED」),因爲約束只是檢查約束。另外,你能顯示完整的代碼嗎?該約束有幾個語法錯誤。 爲了強制一列中1的個數最多爲k,您可以執行: forall(j in 1..n)(sum([Z [i,j] | i in 1..m])< = k) 如果你想顯示每列中的1的數量,你必須定義一個長度爲m的數組,其中包含第j列的總和...... – hakank