離散最適化コースノート (2) - 制約プログラミング

目次

1. 制約プログラミング

2. 制約の伝播

Case1: より多くの送金をする

3. 要素制約

Case2:マジックシリーズ

ケース 3: 安定した結婚生活

4. グローバル制約

Case4: 8 クイーン

Case5: 九公歌

 5. 対称性の破れ

Case6: バランス不完全ブロック設計 (BIBD)

Case7: シーンの割り当て

6. 冗長な制約    

Case2: Magicシリーズ(冗長制約の追加)

Case8: 車のシーケンスの問題

Case4: 8クイーン(デュアルモデル)

7. グローバル制約を実装する

Case9: バイナリナップザック(動的プログラム)

Case10: 全く異なる(マッチングアルゴリズム)

8. 制約のある検索戦略

Case11: オイラーナイト(先失敗主義)

Case4: 8 クイーン (変数/値のラベリング) 

Case12: ESDD 展開の問題 (ない) 

Case13: 完全二乗問題(値/変数のラベル付け)

Case14: 魔方陣問題(ドメイン分割)

Case8: 車のシーケンスの問題(ドメイン分割)

Case7: シーン割り当て(探索中に対称性が破れた場合)

Case14: 魔方陣問題(ランダム化と再起動)

9. グラフぬりえプログラミングの宿題


1. 制約プログラミング

(1) 制約のあるプログラミング

  • 制約を使用して各変数の値のセットを減らす
  • どのソリューションでも発生しない値を削除する
  • ヒューリスティックな解決策ではなく正確な解決策:満足のいく最適な解決策を見つけるのに十分な時間
  • キーポイント:制約を使用して検索スペースを絞り込み、どのソリューションにも現れない値を除外する方法

(2) 古典的な問題

  • 8 クイーン: 8*8 のチェス盤上に 8 つのチェスの駒を配置します。各 2 つの駒は同じ行、列、または対角線上にあってはなりません。
  • 地図の色付け: 地図に色を付けます。隣接する国が同じ色にならないようにします。

4 色定理: 4 色だけを使用する地図では、共通の国境を持つ国が異なる色になる可能性があります。 

(3) 制約の役割

  • 変数領域に実現可能な解があるかどうかを確認する(実現可能性チェック)
  • 実現可能な解がある場合、制約によって変数ドメイン内の特定の値が実現可能な解であるかどうかを決定できます (枝刈り)

ドメイン: 変数のドメインは可能な値のセットです、D(x)={1,2,3} 

2. 制約の伝播

(1) 制約の伝播処理

Case1: より多くの送金をする

Send More Money を例として制約伝播プロセスを説明し、次の式に従って各文字に対応する数値を見つけ、キャリーを表す 4 つの補助変数を導入します。モデルは次のとおりです。文字は 0 ~ 9 の値をとり、キャリーは 0 ~ 1 の値をとり、各文字は異なる数値を表します。S と M は最初であり、0 にすることはできません。各列には計算式があります。

 (1) 最初の 4 つの制約: 左の図は検索空間であり、最初の 4 つの制約に従って value[M]=carry[4]=1 が取得されます。

 (2)约束5:キャリー[3] + 値[S] + 値[M] = 値[O] + 10 * キャリー[4]

  • キャリー[3]は0~1、バリュー[S]は2~9、バリュー[M]=1、左の式は3~12
  • キャリー[4]=1、値[O]は0と2~9、右式は10~19
  • 左辺と右辺の交点を[10,11]とします。
  • 10 <= キャリー[3] + 値[S] + 1 <= 11、したがって 8 <= 値[S] <= 10
  • 10 <= value[O] + 10 * carry[4] <= 11、つまり 0 <= value[O] <= 1、つまり value[O]=0
  • 検索スペースを更新すると、文字の値が接続できなくなります

 (3)约束6:キャリー[2] + 値[E] + 値[O] = 値[N] + 10 * キャリー[3]

  • 値[O] = 0,0 <= キャリー[2] <= 1,2 <= 値[E] <= 9,2 <= 左边 <= 10
  • 2 <= value[N] + 10 * キャリー[3] <= 10、つまり -7 <= 10 * キャリー[3] <= 8、つまりキャリー[3] = 0

 (4) 制約 5 に戻ります: キャリー[3] + 値[S] + 値[M] = 値[O] + 10 * キャリー[4]

  •  キャリー[3] = 0、値[M] = キャリー[4] = 1、値[O] = 0、つまり値[S] = 9
  • 後者の制約から取得した値を前の制約に適用して、検索空間を再び狭めることができます。 

(2) 一般的な形式

 整数線形制約の場合、次の一般的な形式があります。

3. 要素制約

変数を含む式を使用して配列または行列にインデックスを付ける

Case2:マジックシリーズ

シーケンス S=(S0,S1,S2...Sn) で、S(i) が S に i が現れる回数を表す場合、S はマジック シリーズと呼ばれます。以下は Magic Series、S[0]=2 で、0 が 2 回出現することを示しています。

具体化: 制約を 0/1 変数に変換します。制約が確立されている場合、変数は値 1 をとり、そうでない場合は値 0 をとります。各 k に対して、0/1 変数 b[i] を導入します。series[i] = k の場合、b[i] = 1、それ以外の場合、b[i] = 0、series[k] はすべての値の合計です。 bの。

ケース 3: 安定した結婚生活

ジョージ、ヒュー、ウィル、クライブという名前の 4 人の男の子と、ジュリア、ハレ、アンジェリーナ、キーラという名前の 4 人の女の子がいて、それぞれの女の子 (男の子) がすべての男の子 (女の子) に対する好みレベルを持っているとします。たとえば、ハレの場合、男子のランキングはクライブ、ジョージ、ウィル、ヒューとなり、ヒューの場合、女子のランキングはアンジェリーナ、ハル、クライブ、ジョージとなります。結婚生活が安定するのはいつですか? ヒューとアンジェリーナを例に挙げると、もしアンジェリーナがヒューよりもジョージを好きなら、ジョージはアンジェリーナよりも自分の配偶者を好きでなければなりませんし、ヒューがアンジェリーナよりもジュリアを好きなら、ジュリアはヒューよりも自分の配偶者を好きでなければなりません。条件 結婚生活は安定している。次のようにモデル化されます

  • wrank[Men,Women] は男性に対する女性のランキングを表し、mrank[Women,Men] は女性に対する男性のランキングを表します。
  • 決定変数: 妻[男性]は男性の妻を表し、夫[女性]は女性の夫を表します
  • 制約 (一貫性): 各男性の場合、妻に対応する夫は自分自身、つまり夫[妻[m]] = m; 同様に、すべての女性の場合、夫に対応する妻は自分自身、つまり妻[夫[w] ] = w
  • 制約 (安定): 各 m について、m が妻よりも w を好む場合 (wrank[m,w] ​​< wrank[w,wife[m]])、w に関して、彼女は夫よりも m を好みます (mrank[w] ,夫[w]] < mrank[w,m])。各wについても同様です。

4. グローバル制約

グローバル制約は、不定数の変数間の関係を捉える制約です。

Case4: 8 クイーン

 たとえば、すべての変数が異なる値を持つ必要がある場合は、グローバル制約 all Different によって表現できます。8クイーン問題では、元のモデルは下図のように左側に表示されます。各列に値1が配置され、行は不確かです。すべての要素の行は異なります row[i] ≠ row [j]、上の対角線は同じ row[i] + i ≠ row[j] + j にすることはできません。また、下の対角線は同じ row[i] - i ≠ row[j] - j にすることはできません。以下の図の右側に示すようにグローバル制約に変換し、すべて異なる 1 つを使用して元の 3 つの制約を表します。

 (1)では、なぜグローバル制約が必要なのでしょうか? 

  • グローバル制約により、実現可能なソリューションをより迅速に検出できるようになります

 グローバル制約の観点から見ると、x1、x2、x3 は同じであってはならず、ドメイン内には 1 と 2 の値しか存在しないため、実行可能な解決策はありません。要素制約の観点から見ると、x1 ≠ x2、x2 ≠ x3、x3 ≠ x1 の 3 つの制約が含まれており、それぞれの制約に対して満足のいく解が見つかるため、実行可能解があると判断されます。つまり、グローバル制約と 3 要素制約は同じ意味を表現していますが、最終的な結果は異なります。制約プログラミングにおける制約の設定は非常に重要です。

  •  グローバル制約により、検索スペースのより多くのプルーニングが可能になります

 大域的制約の観点からは、x3 ≠ 2 が得られます。要素制約の観点から見ると、制約ごとに検索空間を狭めることはできません。

Case5: 九公歌

九公格モデルは次のとおりです。最初の制約は各行が繰り返されないことを表し、2 番目の制約は各列が繰り返されないことを表し、3 番目の制約は 3*3 ボックス要素が繰り返されないことを表します。

 制約条件に従って、最初に決定された位置を選択して 2 (非繰り返し) に置き、最終的に 2 つの位置だけを任意に選択して九公歌全体を完成させることができます。

(2) 最も単純なグローバル制約(テーブル制約) 

 5. 対称性の破れ

多くの問題は対称性を示しており、解空間の対称部分を探索することは役に立ちません。対称性には値の対称性と変数の対称性が含まれます。これらは対称性の破れを使用して解決できます。

Case6: バランス不完全ブロック設計 (BIBD)

バランス不完全ブロック設計 (BIBD)

  • 入力: (v、b、r、k、l)
  • 出力: v 行 b 列の 0/1 行列。行列の各行には r 個の 1 があり、各列には k 個の 1 があり、行列の内積は l、つまり任意の内積値です。 2 つの行ベクトルは l です

次の図は、BIBD 行列 (各行に 3 つの 1、各列に 3 つの 1 を持つ 7*7 行列) を示しており、2 行ごとの内積は 1 です。 BIBD 行列は一意ではないため、任意の値を交換します。 2行または2列であれば条件を満たすので、解はたくさんあります。この目的のために辞書式順序付けが導入されています。a = 0 1 1 0 0 1 0、b = 1 0 1 0 1 0 0の場合、a <= b、それ以外の場合、a = 1 1 1 0 0 1 0の場合、a >= b. すべての行とすべての列のサイズを変更して、適切な画像を取得します。

Case7: シーンの割り当て

俳優のグループがあります 俳優、一連のシーン シーン、撮影日 日数、料金 [俳優] は各俳優の 1 日の撮影料金を表し、各シーンには何人かの俳優が必要で、毎日最大 k 個のシーンを撮影できます。目標は、総コストを最小限に抑える日に各シーンを撮影するようにスケジュールを設定することです。次のモデルでは、shoot[Scenes] は決定変数を表し、 appeared[Scenes] は各シーンに出演する必要がある俳優を表します。 ) は、俳優が関与する必要がある各シーンを計算します。目的関数 Fee[a] * or(s in where[a]) (shoot[s]=d) は、すべての俳優の撮影料を計算します。最大 (all(i in Days) 5,Days,shoot) という制約により、1 日あたり k シーンの撮影が制限されます。

この問題の対称性は、1 日目のすべてのシーンと 2 日目のすべてのシーンを交換すると、解の目標値は同じ、つまり日によって差がなくなることです。値の対称性を解消するために、シーン 1 は初日のみ配置可能、シーン 2 は 1 日目と 2 日目に配置できると仮定します。このように、各シーンは、過去の日のみを考慮します。使用済みプラス新しい日。

6. 冗長な制約    

 冗長制約は、実行可能領域を変更せずに線形制約システムから省略できる制約であり、モデルが示さない解に関するプロパティを取得します。

  • セマンティックな冗長性: 除外できない解決策はありません
  • 計算上重要: 検索スペースの削減

Case2: Magicシリーズ(冗長制約の追加)

前の記事の Magic シリーズを例に挙げます。この問題には、マイニングできる隠れた制約がいくつかあります。変数の値は、この数値がシーケンス内に出現する回数を表すため、値は制限されます。たとえば、 series[4] = 17 になることは不可能です。sum(i in D) series[i] = n は、すべての数値の出現回数の合計がシーケンスの長さに等しくなることを示します。series[2] = 3 の場合、2 が 3 回出現したことを意味し、3 つの位置の値が 2、つまり 3 つの数字が 2 回出現したことを出現回数に応じて分類し、制約を次のようにすることもできます。 sum(i in D) i * series[i] = n として加算されます。これらの制約は実行可能領域に影響を与えることはできませんが、検索効率を高めることができます。

  • ソリューションのプロパティを表現し、他の制約の伝播を容易にする
  • よりグローバルな視点を提供し、既存の制約を組み込み、コミュニケーションを改善します

既存の制約を結合することは、サロゲート制約とも呼ばれます

  

Case8: 車のシーケンスの問題

一部の車種は流れ作業で生産する必要があり、車種ごとにエアコンやサンルーフなどのオプション(オプション)を装着してカスタマイズされます。組立ラインは移動しており、組立に時間がかかるため、各生産ユニットには生産能力の制約があり、たとえば、連続して到着する 5 台の車両のうち、サンルーフに組み立てられるのは最大 2 台です。車両シーケンスの問題は、車両オプションの各セットの需要制約と各生産ユニットの生産能力制約を満たすように、組立ライン上の車両の順序を決定することです。

モデルは次のとおりです。Slots は各車の位置を表し、Configs は車のタイプを表し、Options はアセンブリ オプションを表し、demand[Configs] は各タイプの車の需要を表し、nbCars は総需要を表し、lb[Options] はub[Options] は容量制約の上限と下限であり、requires[Options,Config] は車両のタイプごとに組み立てられるオプションです。

(1) 決定変数

  • lline[Slots]: 各スロットに配置される車のタイプ
  • setup[Options,Slots]: 0/1 変数、スロット [s] にオプションを必要とする車がある場合

(2) 制約事項

  • forall(c in Configs) sum(s in Slots) (line[s] = c) = demand[c]: 車の需要制約
  • forall(s スロット、o オプション) setup[o,s] = require[o,line[s]]: セットアップ変数を定義します
  • forall(o in Options, s in 1..nbCars-ub[o]+1) sum(j in s..s+ub[o]-1) setup[o,s] <= lb[o]: 容量制約: 各スロットの各オプションについて、オプションの各 ub[Options] カー アセンブリは最大 lb[Options] のみを持つことができます。

(3) 冗長性の制約

  • forall(o オプション、i 1..demand[o]) sum(s in 1..nbCars-i*ub[o]) setup[o,s] >= デマンド[o] - i*lb[o ] ]: 2/3 のオプション容量制約があると仮定すると、合計 12 両の車両を生産する必要があり、最後の 3 スロットには最大 2 両の車両を装備できます。つまり、少なくとも 10 両必要です。オプションを完成させるために前方にポジションを取り、後方から前方に押す場合も同じ考えです。

プロセスを説明するために次の例を取り上げます。2 つのテーブルのスロットとセットアップでは、クラス 1 が最初にスロット 1 に配置され、クラス 1 の需要が 1 であると仮定します。そのため、スロット テーブルの最初の行と最初の列は ❌ で埋められます。オプション 1 の容量制約は 1/3、オプション 3 の容量制約は 1/3、オプション 1 の容量制約は 1/2 であるため、オプション 1 とオプション 3 をセットアップ テーブルの 2 列目に処理することはできず、クラス 5 とクラス 6 をスロットの 2 列目に配置することはできません。テーブル、option3 はセットアップ テーブルの 3 列目で処理できません。また、option3 はスロット テーブル class5 の 3 列目に配置できません。スロット 2 にクラス 2 が配置され、スロット テーブルが更新されると仮定すると、冗長制約に従って、セットアップ テーブルのオプション 2 の 10 個の位置のうち少なくとも 6 個を配置する必要があるため、残りの内容は解放できます。

Case4: 8クイーン(デュアルモデル)

問題のモデルを構築するには多くの方法があります。たとえば、決定変数が異なります。2 つのモデルには補完的な利点がある可能性があります。どちらを選択するかは困難です。このモデルでは表現しやすい制約もありますが、表現が難しい制約もあります。デュアル モデルの重要性は、問題を複数のモデルで表現し、それらを制約で結び付けることです。クイーン問題では、各列を決定変数とみなすことができ、各行も決定変数とみなすことができます。(row[c] = r) <=> (col[r] = c) によって行と列の関係を見つけます。

7. グローバル制約を実装する

Case9: バイナリナップザック(動的プログラム)

ナップザック問題のグローバル制約については、動的プログラミング テーブルを使用して、実行可能な解決策と枝刈りを見つけることができます。

  • 前進フェーズ: x1 から開始し、x1 を選択した場合は実線を使用し、それ以外の場合は破線を使用し、すべての変数を横断します。
  • 逆方向フェーズ: グローバル制約には 10 ~ 12 の値が必要です。いくつかの線と点を削除すると、x4 はすべて実線になるため、x4=1 になります。

Case10: 全く異なる(マッチングアルゴリズム)

変数は 6 つあり、各変数には値のセットがあり、すべての変数の値が異なる解を求める必要があり、これを 2 部グラフに変換できます。下図に示すように、二部グラフの頂点 x は変数、頂点 v は値であり、各辺は各変数の値に対応します。

(1) 実現可能性: 2 部グラフの最大一致を求める. 最大一致 (最大一致) サイズが変数の数であれば、実現可能な解があります

交互パス: 一致するエッジと一致しないエッジが交互になることによって形成されるパス

拡張パス: 開始点が一致しない点である千鳥状のパス

最大の一致を見つける方法: 任意の一致から始めて、改善の余地がなくなるまでこの一致を改善します。マッチングを改善する方法: 2 部グラフを有向グラフに変換し、拡張パスを見つけます。次の図に示すように、最初の一致は下から上を指し、残りの辺は上から下を指します。拡張されたパスは、一致しない点 x から始まり、別のビット一致点 v で終わります。

  • 不一致点 x2 を選択し、交差点道路 x2-3-x5-4 を見つけ、辺の方向を変更して、新しい x2 を一致させます。
  • 不一致点 x1 を選択し、交差パス x1-2-x4-4-x5-5 を見つけ、エッジの方向を変更し、最大一致を見つけます。

深さ優先または最良優先を使用して拡張パスを検索でき、時間計算量は O(|X|+|E|) です。 

 (2) プルーン: 辺 (x,v) がどの最大一致にも現れない場合、x の定義域 D(x) から v を削除します。方法は 2 つあります。

単純なアプローチ: エッジ (x,v) を強制的に一致させます。つまり、他のすべてのエッジ (x,w) を削除し、最大一致を検索します。最大一致が変数の数より小さい場合、値 v は D(x) 削除から取得する必要があることを意味します。この方法は比較的非効率的です。

基本特性 (Berge、1970): 最大一致 M が与えられた場合、エッジは一致しない点から始まる偶数のインターリーブ パスまたは偶数のインターレース円に属し、このエッジはいくつかの最大一致 (すべてではない) に属します。したがって、エッジがこれら 2 つの条件を満たさない場合、このエッジはどの最大一致にも属さないことを意味し、対応する値は削除できます。

  • 一致する M が与えられた場合、2 部グラフを有向グラフにします。ただし方向は逆で、一致するエッジは上から下に、一致しないエッジは下から上に進みます。
  •  一致しない点から自由な頂点から開始する偶数の交互パスを検索します:P
  • 偶数交互サイクルの検索: C
  • M、P、C にないすべてのエッジを削除します

 下図に示すように、プルーニング後は、x4 は値 2 を取ることができず、x5 は値 3,4 を取ることができません。時間計算量は O((|X| + |V|) * |E|) です。

8. 制約のある検索戦略

制約を設定したら、解決策を見つけるための検索戦略が必要になります。

Case11: オイラーナイト(先失敗主義)

最初に失敗する原則: 失敗しやすい最も簡単な部分を最初に試し、簡単な部分に時間を費やさず、最も難しい部分に直接取り組みます。例えば、8人の女王のうち、選択肢の数が少ない国が優先されますし、グラフの色分け問題では隣国が多い国が優先されます。ナイトを使用すると、チェス盤上のすべての位置を 1 回だけ訪問できます。ナイト ナイトは、中国チェスの馬に似たチェスの駒で、3 行 2 列の「日」グリッドのみを移動できます。ファーストフェイルの原則に従って、ジャンプ可能な位置が最も少ないポイントから開始します。

Case4: 8 クイーン (変数/値のラベリング) 

2 つのステップ: 割り当てる変数を選択し、その変数の値を選択します。

元のプロセス: forall (R の r) はすべてのクイーンを反復します; tryall (R の v) はすべての値を非決定的に探索し、一度に 1 つの値のみを割り当てようとします。次のステップでは、再びこのステップに戻ります。 割り当て; row[r] = v は、制約空間に制約を追加します。

検索を絞り込んだ後:

  • 変数: forall(r in R) by row[r].getSize() 最初の失敗の原則に従って最小のドメインを持つ変数を選択します 新しい制約が追加されるたびに、各変数のドメインが変更され、各選択ファーストフェイルの原則を守ります。
  • value: tryall(v in R) bycol[v].getSize() 他の変数からできるだけ多くのドメインを削除する値を選択します。

Case12: ESDD 展開の問題 (ない) 

 一般化二次代入問題 (一般化二次代入モデル)

f はコンポーネント間の通信の頻度を表し、h はマシン間の距離を表します。x は各コンポーネントがどのマシン上にあるかを示す決定変数です。C はコンポーネントのコレクションです。分離制約、分離制約、コロケーション制約の 2 つの制約があります。コロケーションの制約。各コンポーネントをどのマシンに配置するかを決定することで、通信の負担を最小限に抑えます。

  • selectMax(i in C:!x[i].bound(),j in C)(f[i,j]): 最初に最大通信頻度のコンポーネントを選択します
  • tryall(n in N) by (min(l in x[j].memberOf(l)) h[n,l]) : 最小距離のマシンへの配置を試みます

Case13: 完全二乗問題(値/変数のラベル付け)

値/変数のラベル付けには、次回割り当てる値を選択する、この値をどの変数に割り当てるかを選択するという 2 つのステップがあります。

完全正方形問題では、サイズの異なる複数の正方形を大きな正方形の中に入れる必要があります

決定変数: 各正方形の左下隅の座標 x[Square] と y[Square]

制限:

  • 大きな正方形の頂点座標を超える座標はありません
  • 正方形は重なることができません
  • 冗長制約: 任意の直線 x=p (y=p) について、それが通過する正方形の辺の長さの合計は、大きな正方形の辺の長さに等しい

値/変数のラベル付けを使用して解を検索する方法: x 座標 p を選択し、すべての正方形を反復処理し、正方形 i を検討し、正方形 i を位置 p に配置するかどうかを決定します。すべての x 座標と y 座標に対して上記のプロセスを繰り返します。

Case14: 魔方陣問題(ドメイン分割)

正方形、各行、各列、対角線に同じ数字を埋めてください 数理モデルは左下のようになります この問題の解決策を探す場合、変数/値のラベル付けなどの戦略は使用できません規模が大きくなると、どのように配分するか 変数の選択が難しくなります。ドメイン分割では、変数を選択してそのドメインを複数のセットに分割します

Case8: 車のシーケンスの問題(ドメイン分割)

以前のモデルでは、各スロットにオプションを割り当て、すべてのオプションを調べて、スロットがそのオプションを受け入れるかどうかを決定します。スラック時間が最も少ないオプションから開始します。

Case7: シーン割り当て(探索中に対称性が破れた場合)

シーン割り当ての場合、対称性を崩すため、各シーンの利用可能日数が制限されます。シーンを選択して撮影日を割り当てるたびに、ヒューリスティックルールに従って既存の日と新しい日から特定の日が選択されます(撮影コストが最も小さい日を選択します)ので、対称性の破れの制約を動的に追加できます。検索プロセス中は、グラフに色を付けるときと同じように、ポイントが色付けされるたびに他のポイントのフィールドを更新する必要があり、色付けは動的に行われます。

Case14: 魔方陣問題(ランダム化と再起動)

明確な検索順序がない一部の問題については、最初にランダムな順序を試し、検索時間を設定し、制限時間内に解決策が見つからない場合は検索をリセットできます。次の検索プロセスは、ドメイン分割とランダム化を組み合わせて再起動します。

9. グラフぬりえプログラミングの宿題

 networkx を使用してグラフの色付けの問題を解決し、コードを作成するGitHub - bjibujibiuwang/Discrete-Optimization-Solution: The University of Melbourne Discrete Optimization Course

おすすめ

転載: blog.csdn.net/weixin_45526117/article/details/127637489