整数線形計画法の場合、ブールにキャスト


11

次の制約を整数線形プログラムで表現したいと思います。

y={0if x=01if x≠0.

私はすでに整数変数を持っていますが、ことが約束されています。上記の制約を整数線形計画法ソルバーでの使用に適した形式でどのように表現できますか?- 100 ≤ X ≤ 100x,y−100≤x≤100

これはおそらくいくつかの追加の変数を導入する必要があります。追加する必要がある新しい変数と制約は何ですか?1つの新しい変数できれいに実行できますか?二?

同様に、これは制約を強制する方法を尋ねています

y≠0 if and only if x≠0.

を暗示する制約がすでにある状況では および。0 ≤ Y ≤ 1|x|≤1000≤y≤1


(私の目標は、/cs//a/12118/755のエラーを修正することです。)


1
何を試しましたか?パターンが表示されるかどうかを確認するために、いくつかの例を試してみましたか?はいの場合、推測を試み、それを証明してみましたか?
— Brika

1
へえ!私が見るあなたがそこに何をしたか、@Brikaを。私が試したものを見ている好奇心あなたがいる場合、参照ここだけでなく、それが実際に間違っていた理由のこの説明。私の次の試みを見たい場合は、私の答えを見てください。私の古い質問を読んでいただきありがとうございます。それらが将来のために改善される可能性がある場合は、皆さんからの提案をお待ちしています。
— DW

それはとても良いことです。;)
— Brika

回答:


4

私は1つの余分バイナリ変数でそれを行うことができると思いδ∈{0,1}:

−100y≤x≤100y
0.001y−100.001δ≤x≤−0.001y+100.001(1−δ)

更新

これは、xが連続変数であることを前提としています。我々は制限する場合xする整数値、第2の制約は、に簡略化することができる:

y−101δ≤x≤−y+101(1−δ)


1
小さなプログラムで徹底的にテストして、これが正しいことを確認しました。解決策をありがとう!
— DW

@ErwinKalvelagen、より一般的な場合、たとえば、y = {a:x> 0、b:x <0}の場合、バイナリ変数デルタを使用してロジックを説明してください。
— Nick

1
@Nickバイナリ変数は、「OR」構造のモデル化に使用されます。質問の回答については、こちらをご覧ください。
— Erwin Kalvelagen、2016年

@ErwinKalvelagen、素晴らしい答え、私はあなたのアプローチを私の質問cs.stackexchange.com/questions/64794/…に適用しようとしました。
— Nick

1
@GonzaloSolera実際、私は間違っていましたは連続変数であると想定しました。実際、xが整数値の場合、提案どおりに0.001から1に移動できます。バツバツ
— Erwin Kalvelagen

1

以下は決して美しくはありませんが、動作します。してみましょう、N = 100、問題の特定のケースに。次に、次の制約があります。0≤バツ≤NN=100

  1. 0≤z1、z2、z≤1
  2. バツ−N(1−z1)≤0
  3. −バツ−Nz1≤−1
  4. −バツ−N(1−z2)≤0
  5. バツ−Nz2≤−1
  6. z1+z2−1≤z
  7. z≤z1
  8. z≤z2

直感は以下の通りです。。これは制約2および3でエンコードされます。同様に、制約4および5は z 2 = 1をエンコードしますz1=1⟺バツ≤0。最後の3つの制約は、発現 Z = Z 1 ∧ Z 2。z2=1⟺バツ≥0z=z1∧z2


これにはバグがあるようです。あなたはを意図していると思います。ただし、x = 100の場合はまだ間違っています。この場合はy = 1(z = 0)を強制したいのですが、方程式x − N zとして、すべての方程式を満たすz 1、z 2の選択肢はありません。2 ≤ - 1が必要X < Nを(すなわち、X ≤ 99)。したがって、このILPは次の場合に誤った結果を返します。z=1−yバツ=100y=1z=0z1、z2バツ−Nz2≤−1バツ<Nバツ≤99: y = 1が必要ですが、 y = 0です。他にも所望の範囲のX質問に記載されているようである - N ≤ X ≤ Nではなく 0 ≤ X ≤ N。バツ=99y=1y=0バツ−N≤バツ≤N0≤バツ≤N
— DW

1

t、あなたt=1バツ≥0あなた=1バツ≤0y=¬(t∧あなた)

0≤t、あなた、y≤11+バツ≤101t≤101+バツ1−バツ≤101あなた≤101−バツt+あなた−1≤1−y1−y≤t1−y≤あなた

バツ≤99バツ≤100バツ≥−99

@TLW、キャッチしてくれてありがとう!回答を編集してバグを修正しました。小さなプログラムで徹底的にテストしましたが、今は正しいはずです。
— DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.