我正在尝试使用 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/