MS ソルバーを使用してビン パッキングの問題を解決しようとしていますが、ブール式でディシジョンを使用して項を作成する方法がわかりません。
私の問題の概要は次のとおりです。
ビンの数を最小限に抑えて、アイテムをビンに収めようとしています。すべてのビンは同じサイズです。
3 つの SKU (アイテムの種類) があるとします。梱包する SKU ごとに異なる量があり、各 SKU のサイズは異なります。
SKU サイズ 数量
- 100 94
- 50 50
- 25 27
ビンサイズ = 4200
はい、それは 1 次元のビン パッキング問題です。
3 つの SKU のすべてのアイテムを 5 つのビンに梱包する必要があることはわかっています。理論上の最小値は 3 つのビンです。このソリューションを改善して、MS ソルバーを使用して 4 つまたは 3 つのビンにまで減らすことはできますか?
ここに私の問題があります: MS ソルバー ライブラリを使用して、決定と制約を設定できますが、使用するビンの数を最小限に抑えるという目標を定義できないようです。
決定の 2D マトリックスを作成します。行数は 5 つのビンの最初の推測に対応し、3 列はビン内の各 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 です。
そして、実際、この用語は常に同じ値に評価されるため、解決策はありません。
これらの決定を使用して用語を作成するにはどうすればよいですか?