均一コスト探索(Uniform-Cost Search)とは
均一コスト
探索は、重み付きグラフにおける
探索アルゴリズムの一つです。この
アルゴリズムは、スタートノードからゴールノードまでの経路を
探索する際に、経路のコスト(重み)を考慮し、最もコストの低い経路を見つけることを目的としています。特に、グラフの各辺に異なるコストが設定されている場合に有効です。
均一コスト
探索は、
最良優先探索の一種であり、評価関数としてスタートノードからの累積コストを使用します。
探索はスタートノードから始まり、まだ訪れていないノードの中で最も累積コストが小さいノードを優先的に
探索します。このプロセスは、ゴールノードに到達するまで繰り返されます。
この
アルゴリズムでは、以下の要素が重要になります。
優先度付きキュー: 次に探索するノードを、累積コストの昇順で保持します。これにより、最もコストの低いノードが優先的に選択されます。
ノード展開: 現在のノードから接続する、まだ
探索していないノードを生成します。
コスト計算: あるノードから次のノードへの移動コストを計算し、累積コストを更新します。
訪問済みノード管理:
探索済みのノードを記録し、重複した
探索を防ぎます。
均一コスト
探索は、
幅優先探索の一般化とみなすことができます。
幅優先探索では、すべての辺のコストが等しいと仮定しているため、均一コスト
探索の特別なケースと言えます。均一コスト
探索では、辺のコストが異なる場合でも、最小コストの経路を
探索できます。
均一コスト
探索は、
ダイクストラ法と密接な関係があります。
ダイクストラ法は、グラフのすべてのノードに対して、スタートノードからの最小コスト経路を求める
アルゴリズムですが、これは均一コスト
探索をグラフ全体に適用した結果と考えることができます。さらに、
ダイクストラ法は、
Aアルゴリズムにおいて、ヒューリスティック関数を定数関数とした場合の特殊なケースとも言えます。
以下に、均一コスト
探索の擬似コードを示します。
function 均一コスト
[探索]
visited = 訪問済みノードを管理する集合
queue = ノード評価値で自動的に
ソートするノードの
優先度付きキュー
startNode の評価値 = 0
startNode を visited と queue に追加
while (queue が空ではない)
node = queue の先頭から取り出す
if (IS_GOAL(node)) then
return node
for each (child in EXPAND(node))
evalValue = node の評価値 + COST(node, child)
if (child が visited に含まれない) then
child の評価値 = evalValue
child を queue に追加
else if (evalValue < child の評価値) then
child の評価値 = evalValue
child を queue から削除して追加し直す
return
探索失敗
ここで、以下の関数が定義されています。
`COST(node1, node2)`: ノード `node1` から `node2` への辺のコストを返します。
`EXPAND(node)`: ノード `node` から展開できる隣接ノードの集合を返します。
`IS_GOAL(node)`: ノード `node` がゴールノードであるかを判定します。
均一コスト
探索は、辺のコストが非負の値である場合に、必ず最小コストの経路を発見することができます。これにより、正確な解を求める必要がある場合に、信頼性の高い
アルゴリズムとして利用することができます。
まとめ
均一コスト
探索は、グラフ
探索において、スタートノードからゴールノードへの最小コスト経路を効率的に
探索するための強力な
アルゴリズムです。特に、辺のコストが異なる場合にその真価を発揮し、経路
探索、スケジューリング、ゲームAIなど、様々な分野で活用されています。
この
アルゴリズムを理解することで、より高度な問題解決が可能になるでしょう。