при условии, что у вас нет эвристической функции относительно расстояния до цели, лучшее решение, которое действительно, является двунаправленным BFS :
Идея алгоритма: выполнить поиск BFS одновременно от источника и цели: [BFS до глубины 1 в обеих, до глубины 2 в обеих, ....].
Алгоритм закончится, когда вы найдете вершину v, которая находится на переднем крае обоих BFS.
Поведение алгоритма : Вершина v, которая завершает выполнение алгоритма, будет точно посередине между источником и целью.
Этот алгоритм в большинстве случаев даст гораздо лучший результат, чем BFS из источника [объяснение, почему он лучше, чем BFS, следует] и, несомненно, даст ответ, если таковой существует.
почему это лучше, чем BFS из источника?
предположим, что расстояние между источником и целью составляет k
, а коэффициент ветвления равен B
[каждая вершина имеет B ребер].
BFS откроет: 1 + B + B^2 + ... + B^k
вершины.
Двунаправленная BFS откроет: 2 + 2B + 2B^2 + 2B^3 + .. + 2B^(k/2)
вершины.
для больших B и k второе явно намного лучше первого.
EDIT:
ОБРАТИТЕ ВНИМАНИЕ, что это решение НЕ требует хранения всего графа в памяти, оно только требует реализации функции: successor(v)
, которая возвращает всех преемников вершины [все вершины, к которым вы можете добраться, в пределах 1 шага от v] , При этом должны храниться только те узлы, которые вы открываете [2 + 2B + ... + 2B^(k/2)
, как описано выше]. Для дальнейшего сохранения памяти вы можете использовать Итеративное углубление DFS в одном направлении вместо BFS, но это займет больше времени.