Microsoft Solver Foundation中的决策矩阵

时间:2014-09-27 17:00:46

标签: c# matrix solver ms-solver-foundation msf

我正在尝试使用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];`

有什么区别?

2 个答案:

答案 0 :(得分:3)

我为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元素视为整数一样!我究竟做错了什么?我不明白。

答案 1 :(得分:1)

是的,您可以使用C#数组来定义非标量 Decision 变量,也可以使用索引 Decision 对象,如{{3}中所述}。

可能有更好的方法,但我会为参数向量Sum中的每个元素定义一个Y[i]约束。参数向量或其元素可以定义为 Decision 变量,或者您可以将它们声明为 Term 对象,这可能更有效。

请注意解决方案基础上的 Microsoft 似乎是Nathan Brixius' blog。因此,寻找其他求解器可能是有意义的。我个人最喜欢的是no longer be working,但这肯定取决于要解决的问题类型。有些人更喜欢MiniZinc