Now that forward and backward search have been covered, the next
reasonable idea is to conduct a bidirectional search. The general
search template given in Figure 2.7 can be
considered as a combination of the two in Figures 2.4 and
2.6. One tree is grown from the initial state,
and the other is grown from the goal state (assume again that
is a singleton,
). The search terminates with success
when the two trees meet. Failure occurs if either priority queue has
been exhausted. For many problems, bidirectional search can
dramatically reduce the amount of required exploration. There are
Dijkstra and
variants of bidirectional search, which lead to
optimal solutions. For best-first and other variants, it may be
challenging to ensure that the two trees meet quickly. They might
come very close to each other and then fail to connect. Additional
heuristics may help in some settings to guide the trees into each
other. One can even extend this framework to allow any number of
search trees. This may be desirable in some applications, but
connecting the trees becomes even more complicated and expensive.
Steven M LaValle 2020-08-14