2014-09-27 65 views
1

我正在嘗試使用Microsoft Solver Foundation來優化二元決策變量矩陣的問題。這是我的決策矩陣的格式:Microsoft Solver Foundation中的決策矩陣

X[i,j] = { { x11, x12, ..., x1n }, { x21, x22, ..., x2n }, ... { xm1, xm2, ..., xmn }, };

我也有參數的載體,它是依賴於Xij矩陣(該矢量的每個元素是Xij的一列的總和:

Y[i] = { Sum(x11, x21, ..., xm1), Sum(x12, x22, ..., xm2), ..., Sum(x1n, x2n, ..., xmn) }

我知道,我應該與索引決定對象的工作,但我有麻煩這樣做,任何人都可以請幫助我,我知道有索引決策的方法有兩種:。

Decision Xij = new Decision(Domain.Any, "x", Some Set, Some other set);

,也有:

`Decision[,] = new Decsion [i, j];` 

有什麼區別?

+0

感謝您的回答。我試過c#數組來定義Decision變量。問題是,在這種情況下,我不能使用索引循環使用模型的靜態函數(例如Model.ForEach)進行決策。我得到這個錯誤:不能隱式地將類型Microsoft.SolverFoundation.Services.Term轉換爲'int' – 2014-09-28 19:36:45

+0

'模型。ForEach'僅適用於索引* Decision *變量。如果你使用數組,你可以簡單地寫一個'for()'循環來計算sum * Term *。這個總和* Term *可以放在一個約束中。 – 2014-09-29 11:34:29

回答

1

是的,你可以使用一個C#陣列,以限定變量或使用索引決策對象的非標量決策如Nathan Brixius' blog說明。

可能有更好的方法來做到這一點,但我會爲參數向量Y[i]中的每個元素定義一個Sum約束。參數向量或其元素可以定義爲決定變量,或者您可以聲明它們爲項目對象,這可能會更有效。

注意微軟似乎no longer be working求解基金會。所以,尋找其他求解者可能是有意義的。我個人最喜歡的是MiniZinc,但這當然取決於要解決的問題類型。有些人更喜歡Google OR-Tools

+0

感謝你,我設法在MSF中構建了我的決策矩陣,並且它工作正常。但由於限制了決策變量和約束的數量,我試圖將LpSolve dll添加到我的代碼中。我不斷收到這個錯誤,這不是「有效的程序集或COM組件」!這個錯誤來自哪裏? – 2014-10-18 17:56:49

2

我創建二維數組爲Xij如下:

static Decision[,] XijMatrix() 
    { 
     Decision[,] d = new Decision[int rows, int cols]; 
     for (int row = 0; row < rows; row++) 
      for (int col = 0; col < cols; col++) 
       d[row, col] = new Decision(Domain.Boolean, "X" + row + col); 

     return d; 
    } 

和另一個數組對YJ:

static Decision[,] YjMatrix() 
    { 
     Decision[,] d = new Decision[1, int cols]; 
     for (int col = 0; col < cols; col++) 
      d[0, col] = new Decision(Domain.Boolean, "Y" + col); 
     return d; 
    } 

和這兩個矩陣結合在一起,我添加制約moedl:

for (int i = 0; i < Yj.GetLength(1); i++) 
    { 
     model.AddConstraint("C" + i, Yj[0, i] == matColSum(Xij, i)); 
    } 

和matColSum用於添加列(i)的元素:

static Term matColSum(Decision[,] Xij, int i) 
    { 
     Term r = Xij[0, i]; 
     for (int row = 1; row < Xij.GetLength(0); row++) 
     { 
      r += Xij[row, i]; 
     } 
     return r; 
    } 

現在創建一個Xij矩陣,它在每一列中只有一個真值(1);就像matColSum將Xij和Yj元素視爲整數一樣!我究竟做錯了什麼?我不明白。

+0

您的決策變量是在Domain.Boolean中構造的。如果您希望它們是整數或浮點,請使用其他域。您也可以指定一個範圍,如Domain.RealRange(0.0,100.0)或Domain.IntegerRange(0,10)。 – 2014-10-01 16:13:47

+0

我想要的是Yj在Xij中取第j列的最大值。換句話說,如果j列中有一個或多個真值(或1s),那麼Yj應該等於1.這樣的事情是可能的嗎? – 2014-10-07 04:52:23

相關問題