簡體   English   中英

Microsoft Solver Foundation中的決策矩陣

[英]Decision matrix in 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對象,但是這樣做很麻煩。 誰能幫我。 我了解索引索引有兩種方法:

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

還有:

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

有什么不同?

我為Xij創建了2D數組,如下所示:

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元素視為整數一樣! 我究竟做錯了什么? 我不明白

是的,您可以使用C#數組定義非標量Decision變量,也可以按照Nathan Brixius的博客中所述使用索引的Decision對象。

可能會有更好的方法,但是我將為參數向量Y[i]每個元素定義一個Sum約束。 可以將參數向量或其元素定義為Decision變量,也可以將它們聲明為Term對象,這樣可能會更有效。

請注意, Microsoft似乎不再致力於 Solver Foundation 因此,尋找其他求解器可能很有意義。 我個人最喜歡的是MiniZinc ,但這當然取決於要解決的問題類型。 有些人更喜歡Google OR-Tools

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM