web-dev-qa-db-ja.com

Excelソルバー:制約をゼロに定義ORより大きい

注文書を最適化するためのモデルを作成しています。

注文する金額は500以上でゼロ以上である必要があります。

ソルバーでこのような制約を定義するにはどうすればよいですか?

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

基本的に、ソルバーでORを表現できる必要がありますが、どうすればよいですか?

編集:次のリンクで、私が使用しているExcelファイルが表示される場合があります: ここをクリック

2
Nuno Nogueira

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

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

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

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


編集:

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

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

すべての場合において、結果はしばしば間違っていて、初期条件に依存していました。どうやらソルバーはそのようなものが好きではありません。

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

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

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

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

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

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

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

2

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

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

-MB + X <= 0(Bが0の場合、以前の拘束力0と組み合わせて)

B =バイナリ変数1

M =非常に大きな正の数(Xより大きくなる可能性があります)

X =連続変数

[編集]

あなたがこのようなことをしたいと思っていることを理解しています(シートファイルにもいくつか変更を加えましたが、ここで作業したExcelファイルを共有できません):

enter image description here

1
Karl