c# - Microsoft Solver Foundation 中的决策矩阵

标签 c# matrix solver ms-solver-foundation

我正在尝试使用 Microsoft Solver Foundation 来优化具有二元决策变量矩阵的问题。这是我的决策矩阵的格式:

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

我还有一个参数向量,它依赖于 Xij 矩阵(向量的每个元素都是 Xij 的一列之和:

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

我知道我应该使用索引决策对象,但我很难做到这一点。有人可以帮助我吗?据我了解,有两种对决策进行索引的方法:

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

还有:

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

有什么区别?

最佳答案

我为 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;
    }

为了将这两个矩阵绑定(bind)在一起,我向 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# - Microsoft Solver Foundation 中的决策矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077055/

相关文章:

c# - 电话页面之间的转换

C# : return dbnull. 值或函数的 system.type?

matlab - matlab中矩阵中的分组元素

c++ - 如何在gecode中打印变量的值

python - 在具有复系数(第 4 度)的多项式上使用 sympy 求解器时出现错误

java - 在Java中递归生成随机对象

c# - 带等待的 ThreadAbortException

c# - 收集源代码更改列表,然后将其应用到 Roslyn

algorithm - 如何删除重复的矩阵(以数组表示)?

arrays - Swift - 在多维数组中搜索重复项 - 数独