Microsoft Solver Foundation中的决策矩阵
本文关键字:决策矩阵 Foundation Solver Microsoft | 更新日期: 2023-09-27 18:24:42
我正在尝试使用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变量,也可以使用索引Decision对象,如Nathan Brixius的博客中所述。
可能有更好的方法,但我会为参数向量Y[i]
中的每个元素定义一个Sum
约束。参数向量或其元素可以定义为Decision变量,也可以将它们声明为Term对象,这可能更有效。
请注意,Microsoft似乎不再处理解算器基础。因此,寻找其他解算器可能是有意义的。我个人最喜欢的是MiniZinc,但这当然取决于要解决的问题类型。有些人更喜欢谷歌或工具。