現在、アルゴリズムのコースを受講していますが、ブルートフォース検索とバックトラッキングの正確な定義を理解するのに苦労しています。私が理解しているように、次のことが当てはまります。
{1, 2}
に制限され、選択肢4は{3, 4, 5}
に制限されますなど)。検索の「実行ツリー」が形成されます。基本的に、私が疑問に思っているのは、これが正確であるかどうかだけです。そうでない場合は、いくつかの説明をいただければ幸いです。前もって感謝します。
短い答え:質問を正しく読んだら、あなたは正しいです。
あなたが言うように明示的な制約はドメイン各変数のsox私∈S私。 Sに注意してください私はコレクションとして記述する必要はありません。たとえば、Sと述べることができますは、25未満のすべての素数のセットです。
暗黙の制約一方、2つ以上で定義された述語です変数P(x1、バツ2、...、バツn)。たとえばx2<x3。ただし、より多くの変数(たとえば、3つ)に対して定義することもできます。
ブルートフォース検索はexplicitのみを取得します制約を考慮に入れる:Sから可能なすべての値を割り当てます私から変数x私およびこれはall変数用です。このような構成を構築した後、すべての暗黙の制約が満たされていることを確認します。
Bactracking一方、このプロセスを最適化することを目的としています。 暗黙的制約が定義されているすべての変数が割り当てられた瞬間から、その制約を検証します。制約が失敗すると、すぐに変数の1つに別の値が割り当てられます。利点は、たとえばブルートフォースがxに2を割り当てた場合です。1= 2および5からx2= 5、および暗黙の制約x1 > x2が失敗すると、xに値が割り当てられません3、バツ4、...これらの値のすべての構成で失敗することを確認するだけです。
もちろん、バックトラックにはいくつかの簿記が含まれます。特定の値が設定されたときにどの制約が「発火」するかを見つける必要があります。しかし、多くの制約プログラミング問題(たとえばSATなど)の場合、それを行うための効率的なアルゴリズムが存在します(監視されたリテラルなど)。さらに、Gecodeのような制約プログラミングライブラリにも、高速制約が最初に評価されるなどの高度なキューイングメカニズムがあります。