最短パスを見つけるために双方向 BFS をどのように使用しますか? 6x6 グリッドがあるとしましょう。始点は (0,5) にあり、終点は (4,1) にあります。双方向 bfs を使用した最短パスは何ですか? パスコストはありません。しかも無向です。
質問する
23882 次
1 に答える
52
双方向 BFS はどのように機能しますか?
ソース頂点とターゲット頂点の両方から 2 つの BFS を同時に実行し、両方の実行に共通する頂点が検出されると終了します。この頂点は、ソースとターゲットの中間になります。
なぜBFSよりも優れているのですか?
ほとんどの場合、双方向 BFS は単純な BFS よりもはるかに優れた結果をもたらします。ソースとターゲットの間の距離がk
であり、分岐係数がB
(すべての頂点が平均して B エッジを持っている) であると仮定します。
1 + B + B^2 + ... + B^k
BFS は頂点をトラバースします。- 双方向 BFS は
2 + 2B^2 + ... + 2B^(k/2)
頂点を横断します。
B
とが大きいk
場合、2 番目の方が明らかに 1 番目よりもはるかに高速です。
あなたの場合:
簡単にするために、マトリックスに障害物はないと仮定します。何が起こるかは次のとおりです。
iteration 0 (init):
front1 = { (0,5) }
front2 = { (4,1) }
iteration 1:
front1 = { (0,4), (1,5) }
front2 = { (4,0), (4,2), (3,1), (5,1) }
iteration 2:
front1 = { (0,3), (1,4), (2,5) }
front2 = { (3,0), (5,0), (4,3), (5,2), (3,2), (2,1) }
iteration 3:
front1 = { (0,2), (1,3), (2,4), (3,5) }
front2 = { (2,0), (4,4), (3,3), (5,3), (2,2), (1,1), }
iteration 4:
front1 = { (0,1), (1,2), .... }
front2 = { (1,2) , .... }
ここで、前線が (1,2) で交差し、ソース頂点とターゲット頂点からそこにたどり着くまでの経路を発見しました。
path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2)
path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2)
完全なパスを得るには、パス 2 を逆にしてパス 1 に追加する必要があります (もちろん、共通の交差する頂点の 1 つを削除します)。
(0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1)
于 2012-11-01T14:30:39.183 に答える