制約充足問題
検索アルゴリズムでは、我々は、宛先ノードへの最初のノードからのパスに興味がある、と制約充足問題では、我々は唯一の目標を気にしてパスを気にしない、初期状態ではありません。
- 計画:アクションのシーケンス
- 同定:変数への代入
制約充足問題(CSPは)特定の問題に特化されています
我々は、特別な問題としてCSPを検索することができます。一般的な検索の問題があるために、国家が知られている、原子または不可分である 、内部構造のない「ブラックボックス」としてIS AS A州の代理CSPにしながら、特徴ベクトル。テストの目標は、探索問題で任意の関数を介して米国をすることができ、。 CSPでのテストのAセットです。目標の制約識別特徴ベクトル許容します。
私たちは、特徴ベクトルを詳しく見てみ、それはK AのSETである変数の各範囲のために、からなる(または機能)が機能を持ち、ドメイン、および私たちの目標は、素敵な制約のために割り当てのセットを見つけることです。私たちは、制約を満たし、そして残りが割り当てられる後者の変数の割り当ての一部に、ある利便性の完全な状態と部分的状態を定義します。典型的な問題のような地図のぬりえN-クイーンと。
制約グラフ
質問のためのCSP、我々は図の制約を使用して表すことができる方法は:バイナリ制約のために、それは2つの機能を置くことができるため、という問題N進制約がバイナリに変換します。私たちは、ドメインが制限されていることを前提としています。
最初のステップは、新しい変数の導入は、(バインド)Zは、例えば、3元の制約の追加は、我々は変数の出会いを導入しました
ドメインを満たすすべての可能な3タプルの集合である\(A + B = Cを\) 。(\ \ {(A_1、B_1、C _1)、(A_ 2、B _2、C_ 2)、... \}、ST A_ 1 + B_ 1 = C_ 1 ... \)
第二ステップ、新しい変数Z及びA、B、Cの間の結合の確立は、明らかに最初の要素は、ドメインAと三重項のZと同じであってもよいです。
(タプルの位置を元の変数にリンクされている)は、それぞれ、Z三元の変数との間の新しい制約を作成。
\ [(Z、A)\で\ {((A_1、B_1、C_1)A_1)、... \} \タグ{1} \\(Z、B)\で\ {((A_1、B_1、C_1 )B_1)、... \} \]
したがって、我々は、新しい変数を導入すると、3つのバイナリ制約によって、制約は三重良好な変換を入れている、複数の制約のために、同様の方法で行ってもよいです。
注:これは一時的に、理解できないことがあり、我々がしなければならない制約であるかを理解。問題をマップする最初のルック通常バイナリ制約は、例えば、それぞれの国の色は、赤、黄、青、制約は、Aが赤色充填場合、隣接Bはイエローのみ塗装することができることである意味又はようにできるものと青-その、変数の値を決定した後、変数の範囲は、別の変更です-そして今度は、私たちは制約を表現したかったですか?これは、一組の形取ることができる(\ {(R&LT、Y)、(R&LT、B)を... \} \)\。我々は、値A及びBは、それぞれ、タプル、セット内の要求された制約の組を構成すること、を理解する結合再。(私は明確な正式な表現の制約が存在しないという事実に混乱を理解しています。)この場合、我々は、AがAとZ式(1)は、2つ必要と制約のために設定されていると仮定し、さらに制約を見てこうしてZの範囲を減少させる、制約条件セットにタプルを構成し; B、Z値フィールドの値がさらに低減される場合、さらにセットが、実際には三重項のみ可能残り時間であります\((A、B、C = A + B)\) 、検出するために従うことができる、またはC割当制約が満たされます。
解決のCSP
私たちは、初期状態が空の代入、変数割り当てられていないの割り当ての後続機能で、割り当てられたオブジェクトの検出が完了状態を必要と制約に基づいて、CSPの標準検索処方を採用しました。もちろん、我々は唯一のリーフノードを調査し、その過程で、実際に制約チェックを行うことができ、前述の2として、我々は唯一の目標、当該注文の割り当て、気にしないでください。BFSまたはDFSが非効率的であることが注目されていますが、DFSでの枠組みを改善するために、このため、中間ノードを格納する必要はありませんかどうか。
バックトラックを検索するこれらの問題の両方のためのアルゴリズムが改善されました
- アイデア1:一定の順序で一度に1つの変数
- アイデア2:あなたが行くように制約をチェック
简言之:バックトラック= DFS +可変順序は+フェイルに-違反
二つのアイデアは、はるかに直感的なプレゼンテーションです。
質問は今、バックトラッキングを改善する方法です。
発注
明白な、評価の異なる順序が効率に影響を与えるだろう、それは、変数がその値が試されるべきか順序で次の割り当てられるべきである二つのカテゴリー:?に分けることができますか?
変数の順序のために、視覚的に、我々はこれらの制約は、より可変である(というか、バインドされている比較的小さなドメインは、重要性をリコールすることを選択します競合の可能性を避けるために、できるだけ早く、話すその変数値添加後)の変数のドメインを削減します。たとえば、問題を着色マップは、我々は一般的に、隣接する国の色の状態から色に開始します。定義:
変数順序付け:最小残りの値(MRV)
そのドメインが最も少ない法的左の値を持つ変数を選択してください。呼ばれ、「最も制約の変数」
「フェイルファスト」の順序
シーケンシャル割り当てのために、我々は、我々は確かに他の変数の値の減少の発生を回避することである変数より「可能性」、残りを与えたい、できるだけ早く(ただしバック)などのソリューションのセットを見つける必要があり、我々は定義
値の順序:最小値を制約(LSV)
変数の選択を考えると、少なくとも拘束値を選択します。つまり、残りの変数で最も少ない値を除外する1
それがこれを決定するために、いくつかの計算がかかることがあります!(例えば、フィルタリングを再実行)
注前者は、私たちは可能性のあるエラーの一部を(することができないようにすることができますことを、「プルーン」)、および可能性を高めるか、単にの解決策を見つける(ただし保証は、唯一の「速く見つける」と言うことができます)。我々は解決策のすべてを検索したい場合は、元の缶の助けは、計算を減らすが、後者は任意の助けを持っていませんでした。
フィルタリング:私たちは早期に避けられない障害を検出することはできますか?
MRVは、私たちは(そのような二つの隣接を埋めるために、同じ色のような)、単純なミスを避けることができますが、ここではこのような単純な制約を検出し、その後、我々は、事前にそれをエラーを見つけるために、より多くの計算を行うことができますか?これは、フィルタリングアイデアです。
で見てみましょうフォワードはチェック:割り当てに加えられた場合、制約Aに存在する違反AクロスOFF値を。我々は固定値(検索)を取る後、ドメインの隣接側に減少させること(推論)。もちろん、ここで我々は唯一の「楽しみ」のステップは、実際には、可変ドメインを減らすために、我々は、制約伝播である理由、に続けることができ制約伝播。定義を与えてみましょう:
Aシングルアークの一貫性
アーク\(X \ RIGHTARROW Y \)がある一貫した毎ためIFF \(X \)尾部にいくつか存在する\(yが\)制約に違反することなく割り当てることができるヘッドに
順方向のチェック:各新しい割り当てを指す弧の強制一貫性
アークの定義ことに注意してください\(X \ RIGHTARROW Y \)の還元はXようにいずれか一方である方法;範囲はXに還元するの後、我々はYを所定の/その範囲を減少させます値、Yは、少なくとも一つの制約を満たすことができます-それはXの値を満たしていない、我々はダウンしました。それは可変範囲縮小の円弧点Aを(実際にはすべての無向辺)を含むことがありますので、方向は、この定義によると、我々はフォワードは、A与えられ、時間をチェックしないことに注意してください。具体的なアルゴリズムは以下の通りであります:
より広範な解釈:フィルタリングでは、私たちが交互に検索し、推論、変数への代入後、アーク整合性チェックを行います。具体的には、\(X_I \)割り当てた後、我々は呼んで(AC-3 \)\、から(\(X - jが、X_I)\ ) 割り当てられていない変数で\(X - jが\) 、制約伝播始まる。実際には私たちは、変数の特定の範囲が変更されていたら、それらを結合するために隣人となり、キューを維持しました。
しかし、アークは後戻りすることなく、互換性を保証することはできません。ノードのみように、明らかに二つの色のそれぞれに割り当てられていない赤色と青色のない溶液が、良好なアーク一貫性エラーとすることができれば、例えば、三角形について、検索します。あなたは直接の解決策を取得したい場合は、私はと互換性K-紹介K-一貫性の概念:
- 1-整合(ノード整合性):各単一ノードのドメインは、そのノードの単項制約を満たす値を有します
- 2-Consistency (Arc Consistency): For each pair of nodes, any consistent assignment to one can be extended to the other
- K-Consistency: For each k nodes, any consistent assignment to k-1 can be extended to the k th node.
并给出强 k-相容 Strong k-consistency: also k-1, k-2, … 1 consistent,以及结论,对于一个 n 变量的 CSP 来说,strong n-consistency means we can solve without backtracking。这是显然的。
Structure: Can we exploit the problem structure?
这里问题的结果指的是约束图的结构。考虑极端情况:所有节点结构独立的,那么我们可以任意赋值;更为一般的,Independent sub-problems are identifiable as connected components of constraint graph。事实上,这样可分割的情况是很少见的(如澳大利亚地图着色),一个理想的可分问题能大大降低复杂度。注意到,我们可以用 Search 问题的通用复杂度来衡量 CSP,搜索树的深度显然是节点数,宽度为 domain 的大小;若一个 n 个节点的问题可分割成大小为 c 的若干子问题,则时间复杂度从 \(O(d^n)\) 降为 \(O({n \over c} d^c)\) ,变成了 n 的线性函数。
可分割为 sub-problems 的问题也是很少见的,一个更一般的情况是 Tree-Structured CSPs,对此我们有定理:
Theorem: if the constraint graph has no loops, the CSP can be solved in \(O(n d^2 )\) time
同样变为了 n 的线性函数。如何做到呢?1. 对约束树进行拓扑排序;2. 逆着拓扑排序,从孩子到父节点做弧相容检查(即对于\((Parent(X_j),X_j)\)进行检查);3. 然后顺着拓扑排序,从根节点到到叶节点进行赋值。注意到,进行这样一次弧相容检查之后,我们保障了对于父节点的任意取值,子节点都至少有一个值满足约束,也就保障了算法的正确性(解的存在性)。
树结构也太少见了,一个拓展是 Nearly Tree-Structured CSPs 。对其的思路是,选定一组变量,使得删去这些之后的节点构成一棵树,这样的话,我们只要遍历这组节点的所有可能赋值情况即可。
Conditioning: instantiate a variable, prune its neighbors' domains
Cycle Cutset conditioning: instantiate (in all ways) a set of variables such that the remaining constraint graph is a tree.
所以我们的任务是找到这样的 Cycle Cutset,若其大小为 c,则找到这个集合之后,搜索的时间复杂度为 \(O( (d^c ) (n-c) d^2)\)
Iterative Improvement
在上述 Backtracking 算法中,我们仍一个一个对变量进行赋值,但 CSP 只关心结果,因此一个自然的想法是直接从 complete state 出发,寻找解。Iterative Improvement 是一种 Local Search 方法。我们
- Take an assignment with unsatisfied constraints
- 然后 Operators reassign variable values。
具体来说,我们 1. Variable selection: randomly select any conflicted variable;2. Value selection: min-conflicts heuristic: Choose a value that violates the fewest constraints。这里第二步的变量选择使得冲突最少的那一个,可以认为是一种 heuristic \(h(n)=\) #total number of violated constraints。
这里体现的是 Local Search versus Systematic Search,相较于 BFS, DFS, IDS, Best-First, A* 等系统搜索算法(Keeps some history of visited nodes)来说,后者的一大特点就是不保留 history,然而,这在减少了存储负担的情况带来的问题则是失去了 complet 性质,容易陷入局部最优。
一些 Local Search 包括
- Hill climbing:在 neighbor 中找最优值,迭代,可能陷入局部最优
- Simulated annealing:结合了 random walk 和 hill climbing。在循环过程汇总,与 hill climbing 的不同在于,对于 next state 来说,若是较为「好的」则以概率 1 接受;若相较于前一个状态变差了不是直接拒绝而是以一定的概率 \(P(T)\) 接受(random walk)。接受的概率随着时间降低,也就是「模拟退火」的命名原因。具体的,接受概率为 T 的函数,如 \(\exp(\Delta E/T)\) 其中 \(\Delta E\) 可表为 next value - current value,而\(T\) 随着时间而降低,即从 random walk 逐渐变为 hill climbing。
- Local beam search:并行 k 个 hill climbing——对于 Systematic search 来说保留所有的历史,而前两种仅保留一个,都太极端了,Local beam search 每次保留 k 个 complete state 而它们的 successor 中找最好的(加入了 randomness)的 k 个后代进行下一次模拟。
- Genetic algorithm
另,对于连续函数来说,则要采用梯度下降方法 Gradient decent。
进一步阅读:《人工智能》chapter 4.1 – 4.2。