Excelソルバー: 制約をゼロまたはより大きい値として定義する

Excelソルバー: 制約をゼロまたはより大きい値として定義する

発注書を最適化するモデルを作成しています。

注文する数量は 500 より大きいか、ゼロに等しくなければなりません。

Solver でこのような制約を定義するにはどうすればよいでしょうか?

バイナリ制約を試し、いくつかの異なる数式も試しましたが、何も機能しないようです。

基本的には、Solver で表現できるようにする必要がありますORが、どうすればよいでしょうか?

編集: 次のリンクで私が使用している Excel ファイルを確認できます。 ここをクリック

答え1

つまり、0 は許可され、1 は許可されず、499 は許可されず、501 は許可されるということですか? 非連続領域のようです。したがって、これは純粋な最適化問題ではなく、組み合わせ問題の一種でもあります。残念ながら、ソルバーではこれを処理できません。

次の 2 つのユースケースを個別に分析する必要があります。

  • 金額はゼロ(固定値、単純計算)
  • 金額が 500 以上です (制約 >= 500 を使用してソルバーで最適化します)。

次に、IF 式を使用してこれら 2 つのケースを比較します。


編集:

Karl の提案に従って「バイナリ」および「整数」制約を使用しようとしましたが、機能しませんでした。

  • バイナリ変数 0-1 と連続変数 >=500 を作成し、IF を使用して連続変数をコピーするか、購入値に 0 を書き込みます。
  • 0-1のバイナリ変数と500以上の連続変数を作成し、それらの積として購入を計算します。
  • 499以上の整数変数を作成し、IFを使用して購入値の499を0に置き換えます。

いずれの場合も、結果は間違っていることが多く、初期条件に依存していました。どうやらソルバーはそのようなことを好まないようです。

次に、上記の提案を 6 つの購入値すべてに適用し、たとえばすべての月のコストの合計を最適化するなどして、それらを個別に最適化することを考えました。しかし、それらは独立していないことがわかりました。開始在庫は前月に依存し、月の最適な購入は前月に購入が行われたかどうかに依存します。したがって、各月に単純な IF を追加することはできません。

私ができる最善のことは次のとおりです。

バイナリ変数 0-1 と連続変数 >=500 を追加し、IF を使用して各月の購入を計算しました。ただし、ソルバーを使用して最適化したのは連続変数のみです。バイナリ変数はパラメーターです。つまり、購入が行われる月を選択し、ソルバーを使用してこれらの購入の値を計算し、結果として得られる合計コストを記録します。

これを、購入と非購入のすべての組み合わせに対して繰り返す必要があります。これらの組み合わせの数は 2 6 =64 です。しかし、実際には、1 月に何も購入しないと、期末在庫がマイナスになり、これは許可されません。したがって、有効な組み合わせは 32 個しかありません。組み合わせインデックスからバイナリ値を計算する数式を追加し、インデックスを 32 回繰り返し、そのたびに手動でソルバーを起動し、各組み合わせの結果を「値のみとして」コピーしました。

その結果、最小コストは 4,625,00 ユーロとなり、この値に達するには 2 つの組み合わせがあります。

以下は、Solver のスクリーンショットとともに、Google ドキュメントにアップロードされたファイルです。

手動で Solver を複数回起動するのは面倒ですが、マクロを使用して自動化できると思います。

答え2

変数の値 (目的関数内) がバイナリであることを示す制約を追加して、バイナリ変数を作成します。目的関数内のこの変数の係数は 0 である必要があります。次に、通常どおりに次の制約を追加します。

-500B+X>=0 (500 を下回らない)

-MB+X<=0 (Bが0の場合、前の制約と組み合わせると0になります)

B= バイナリ変数1

M = 非常に大きい正の数 (X より大きい数)

X = 連続変数

[編集]

次のようなことをしたいのはわかります (私もあなたのシート ファイルにいくつか変更を加えましたが、ここで作業した Excel ファイルを共有することはできません)。

ここに画像の説明を入力してください

関連情報