我有一個問題可以歸結爲尋找一種將三角矩陣映射到跳過對角線的向量的方法。在跳過對角線的向量上映射上三角矩陣
基本上我需要使用Gecode庫
// implied constraints
for (int k=0, i=0; i<n-1; i++)
for (int j=i+1; j<n; j++, k++)
rel(*this, d[k], IRT_GQ, (j-i)*(j-i+1)/2);
向該MiniZinc(功能性)代碼
constraint
forall (i in 1..m-1 , j in i+1..m)
((differences[?]) >= (floor(int2float((j-i)*(j-i+1))/int2float(2))));
把這種C代碼和我需要在differences[?]
弄清楚的索引。
MiniZinc是一種功能/數學語言,沒有適當的循環。 因此,我必須映射那些觸及所有且僅接觸上三角矩陣的單元格的索引i和j,跳過其對角線,將k指向從0到任意值的單元格。
如果這是一個普通的三角矩陣(它不是),解決like this會做
index = x + (y+1)*y/2
我處理的矩陣是一個正方形n*n
矩陣指數從0到n-1,但爲n*m
矩陣提供更通用的解決方案將會很好。
下面是完整的Minizinc代碼
% modified version of the file found at https://github.com/MiniZinc/minizinc-benchmarks/blob/master/golomb/golomb.mzn
include "alldifferent.mzn";
int: m;
int: n = m*m;
array[1..m] of var 0..n: mark;
array[int] of var 0..n: differences = [mark[j] - mark[i] | i in 1..m, j in i+1..m];
constraint mark[1] = 0;
constraint forall (i in 1..m-1) (mark[i] < mark[i+1]);
% this version of the constraint works
constraint forall (i in 1..m-1 , j in i+1..m)
((mark[j] - mark[i]) >= (floor(int2float((j-i)*(j-i+1))/int2float(2))));
%this version does not
%constraint forall (i in 1..m-1, j in i+1..m)
% ((differences[(i-1) + ((j-2)*(j-1)) div 2]) >= (floor(int2float((j-i)*(j-i+1))/int2float(2))));
constraint alldifferent(differences);
constraint differences[1] < differences[(m*(m-1)) div 2];
solve :: int_search(mark, input_order, indomain, complete) minimize mark[m];
output ["golomb ", show(mark), "\n"];
感謝。
我對這個答案仍然很感興趣。我將再次使用這個非常公式來進行另一個項目。你可以看看代碼嗎?謝謝。 – Agostino 2015-01-12 21:29:33
對不起,長時間回覆。看看我的編輯。關鍵點:用T(i,j)= i +(j-1)*(j-2))/ 2來映射{(i,j)|。 1 <= i j(下三角形),但是我的代碼使用元組j> i(上三角形)。無論哪種方式將工作,但你問上部三角問題,所以我給了代碼。如果你想要下三角的代碼,隨時問。 –
2015-01-13 21:53:00
刪除列表理解。 var 0..n:differences = [mark [j] - mark [i] |的array [int]而不是var [int] i in 1..m,j in i + 1..m];''你只需要var 0..n的差陣[1 ..(m *(m-1))div 2]'。 – 2015-01-13 23:59:49