AC-1、AC-2、および AC-3 アルゴリズムを説明できる人はいますか? それらを理解し、コードで実装する必要があります。でも、まずは本当によく理解したいのですが、難しすぎて私には理解できません。何か助けてください。ところで、私はバックトラックにあまり慣れていません。私はそれについてのビデオを読んだり見たりしようとしましたが、それでも同じです! ありがとう、
1 に答える
バックトラッキングと AC-3 について簡単に説明します。しかし、これについてさらに詳しく読みたい場合は、次の本を読む必要があります。
人工知能: 最新のアプローチ : スチュアート ラッセルとピーター ノーヴィグ 2003 プレンティス ホール
この本は、AC-3 とバックトラッキングのすべてを説明する制約充足問題 (CSP) に関する章です。
最初に理解する必要があるのは、CSP とは何かです。CSP には以下が含まれます。
- 値を検索する変数 {A、B、C} のセット。
- 各変数 Da、Db、Dc のドメインには、変数が取り得る可能な値がそれぞれ含まれています。
- A > B + 2 および C < B のような制限のセット ...
CSP がある場合、すべての変数に値を割り当て、制限を尊重し続ける必要があります。CSP は、すべての変数が値を持ち、すべての制限を同時に尊重するときに解決されます。
バックトラッキングは、この問題の解決策を見つけることができるアルゴリズムです。したがって、空の状態 {} から開始します。これは、変数に値がないことを意味します。次に、変数セットから 1 つの変数を選択します (選択する変数を選択するために使用する順序は、アルゴリズムのパフォーマンスに影響を与える可能性があります。MRV - 残りの最小値など、これに使用できるヒューリスティックがいくつかあります)。ここで、最初に A を選択し、ドメイン Da から値を取得するとします (この値を選択する順序はヒューリスティックを使用する場合もあります)。Da = {1,2,3} と想像してください。1 を選択します。次に、A = 1 が制限に違反していないかどうかを確認します。違反していない場合、それは適切な帰属ではありません。そうでない場合は、A = 1 に設定しましょう。これで {A=1} の状態になります。では、これを続けましょう。B と値 1 を選択したとします。これは制限 A > に違反します。B + 2. 2 つのオプションがあります。B をテストする別の値がある場合は、それを試すことができます。そうでない場合、これは A = 1 が間違っていることを意味し、状態 {} に戻って A = 2 などを試す必要があります。
バックトラッキングの擬似コードは次のとおりです。
function backtracking (csp) return a solution or fails
return recursive_backtracking({}, csp) // {} is the initial state
function recursive_backtracking (state, csp) return a solution or fails
if state is complete then return state // all variable have a value
var <- selectNotAtributedVariable(csp)
for each value in orderValues(csp, var) // values of the domain of var
if var = value is consistent given the restrictions
add {var = value} to state
result = recursive_backtracking(state, csp)
if result != fail then return result
remove {var = value} from state
return fail
selectNotAtributedVariable と orderValues はヒューリスティックであることに注意してください (セットの最初の要素を返すだけかもしれません)。
AC-3 とは何ですか? なぜ、いつ使用するのでしょうか? 最初の AC-3 は、前処理ステップとして使用されます。次のように使用します。
function solveCSP(csp)
ac3(csp)
return backtracking(csp)
これはいつに答えます。基本的に、AC-3 は、バックトラッキング中に、帰属表示で発生する競合を検出し、それらを削除します。どのように?CSP 内の変数のドメインをカットする。したがって、2 つの変数が制限を共有する場合、両方の間に円弧があると言います。次の場合、A と B の間の弧は一致していると言えます。
- A->B は一貫しています: A が取ることができる各値 a には、制限に関して B が取ることができる値 b があります。
- そして B->A は一貫しています: B が取ることができる各値 b には、制限に関して A が取ることができる値 a があります。
次の制限 A > B および B > C があるとします。次の弧のセットがあります: {A->B, B->A, B->C, C->B} さて、AC-3上記のセット、A->B からアークを選択し、A が取ることができる a の値ごとに、制限に関して B が取ることができる値 b があるかどうかをチェックしようとします。その場合、A のドメインは同じままです。そうでない場合は、A のドメインから値 a を削除します。値がドメインから削除されるたびに、A の近隣を再確認する必要があります (この場合)。つまり、アーク B->A を再確認する必要があるということです (上のセットにあるからではありません)。
したがって、ここに疑似コードがあります:
function AC3(csp) returns csp possibly with the domains reduced
queue, a queue with all the arcs of the CSP
while queue not empty
(X,Y) <- getFirst(queue)
if RemoveConsistentValues(X,Y, csp) then
foreach Z in neighbor(X) - {Y}
add to queue (Z,X)
return csp
function RemoveConsistentValues(X, Y, csp) returns true if a value was removed
valueRemoved <- false
foreach x in domain(X, csp)
if there's no value of domain(Y, csp) that satisfies the restriction between X and Y then
remove x from domain(X, csp)
valueRemoved <- true
return valueRemoved