我正在使用 MS Solver 尝试解决装箱问题,但我不知道如何在布尔表达式中使用我的决策来创建术语。
这是我的问题的概述:
我正在尝试将物品装入垃圾箱,尽量减少垃圾箱的数量。所有垃圾箱的大小都相同。
假设我有 3 个 SKU(项目类型)。我要打包的每个 SKU 的数量不同,每个 SKU 的尺寸也不同:
SKU 尺寸 数量
- 100 94
- 50 50
- 25 27
垃圾箱大小 = 4200
是的,这是一个一维装箱问题。
我知道我可以将我必须打包的 3 个 SKU 的所有物品放入 5 个箱子中,理论上最少是 3 个箱子。我可以改进这个解决方案并使用 MS Solver 减少到 4 个甚至 3 个 bin 吗?
这是我的问题:使用 MS Solver 库,我可以设置我的决策和约束,但我似乎无法定义最小化使用的 bin 数量的目标。
我创建了一个 2D 决策矩阵 - 行数对应于 5 个 bin 的第一次猜测,3 列是 bin 中每个 SKU 的数量。
我想尽量减少使用的垃圾箱数量,但我似乎无法让语法适合我的目标。这是我用来尝试创建目标的方法:
model.AddGoal("MinimumBins", GoalKind.Minimize, CalcBinsUsed(decisions, binCountFirstGuess, ctSizes));
...
private Term CalcBinsUsed(List<List<Decision>> decisions, int binCt, int skuCt )
{
Term binsUsed = 0;
for (int bin = 0; bin < binCt; bin++)
{
for (int sku = 0; sku < skuCt; sku++)
{
if (!ReferenceEquals(decisions[bin][sku], 0))
{
binsUsed += 1;
break;
}
}
}
return binsUsed;
}
我收到以下警告:'Object.ReferenceEquals' 始终为 false,因为它是使用值类型调用的。
而且,实际上我没有得到任何解决方案,因为该术语总是评估为相同的值。
如何使用这些决策创建术语?