Почему сложность A * экспоненциальна в памяти?
Википедия говорит о сложности A * следующей (ссылка здесь):
Более проблематично, чем время сложность - использование памяти A * s. В в худшем случае, он также должен помнить экспоненциальное число узлов.
Я не вижу, что это правильно, потому что:
Скажем, мы исследуем node A с преемниками B, C и D. Затем добавляем B, C и D в список открытых узлов, каждый из которых сопровождается ссылкой на A, и мы перемещаем A из открыть узлы к закрытым узлам.
Если в какой-то момент мы найдем другой путь к B (скажем, через Q), то лучше, чем путь через A, тогда все, что необходимо, - это изменить ссылку B на A на точку Q и обновить ее фактическую стоимость, g (и логически f).
Следовательно, если мы сохраним в node его имя, ссылающееся на него имя node и его оценки g, h и f, то максимальное количество узлов, которые хранятся, представляет собой фактическое количество узлов на графике, не так ли? Я действительно не понимаю, почему в любой момент алгоритм должен будет хранить количество узлов в памяти, которое экспоненциально соответствует длине оптимального (кратчайшего) пути.
Может кто-нибудь объяснит?
edit Как я понимаю, теперь, читая ваши ответы, я рассуждал с неправильной точки зрения проблемы. Я принимал как данность данный график, тогда как экспоненциальная сложность относится к концептуальному графу, который определяется исключительно "фактором ветвления".
Ответы
Ответ 1
A * - это просто ориентированная версия поиска в ширину, которая экспоненциальна по сложности памяти по длине решения.
При использовании постоянной эвристики A * станет обычным поиском по ширине; равномерный поиск стоимости, чтобы быть точным.
При использовании оптимальной эвристики A * будет O(n)
как по пространству, так и по времени, если не учитывать сложность самого эвристического расчета. Опять n
- длина пути решения.
Ответ 2
Я думаю, что экспоненциальность вступает в игру, когда вы возвращаетесь к node B для ее расширения, но затем возвращаетесь к node C, чтобы развернуть его, а затем вернуться к node D. Теперь нам нужно сохранить отслеживать все дочерние узлы A, B, C и D.
Возврат основан на стоимости ребер, чтобы перейти к следующему node, так что это реальная возможность, но это худший случай.
Если каждый node имеет ровно 2 дочерних элемента, и каждая node имеет одинаковую стоимость, то уравнение равно 2 ^ n, где n - глубина поиска до сих пор.
Например, вы начинаете с node 0. 0 имеет 2 детей 00 и 01. 00 имеет 2 детей 000 и 001. В худшем случае с глубиной 4 уравнение равно 2 ^ 4, где 2 количество детей, каждое из которых node имеет и 4 - глубина поиска.
Ответ 3
Я не эксперт, но некоторое время я изучал статью в Википедии, и мое объяснение было бы таким (надеюсь, что я понял это хорошо:)
Скажем, у нас есть 4x4 матрица узлов.
A, B, C, D - это направления, которые мы можем предпринять в данный момент (Север, Юг, Восток, Запад)
Алгоритм A * начинает поиск.
а
Очередь: B, C, D
AA
Очередь: B, C, D, AB, AC, AD
AAA → Цель
Очередь: B, C, D, AB, AC, AD, AAB, AAC, AAD
Цель достигнута, но есть и другие возможности для рассмотрения.
D
Очередь: B, C, AB, AC, AD, AAB, AAC, AAD
DC
Очередь: B, C, AB, AC, AD, AAB, AAC, AAD, DA, DB, DD
DCA
Очередь: B, C, AB, AC, AD, AAB, AAC, AAD, DA, DB, DD, DCB, DCC, DCD
DCAB → Цель
Очередь: B, C, AB, AC, AD, AAB, AAC, AAD, DA, DB, DD, DCB, DCC, DCD, DCAA, DCAC, DCAD
Etc и т.д.
Как вы можете видеть, для каждого шага в очередь добавляются еще три узла.
Так как A * следует только ациклическим путям [1], максимальное количество шагов на маршрут равно 15.
Максимальное количество возможных маршрутов в этом случае составляет 3 ^ 15 или направления ^ узлов.
Так как каждый маршрут имеет 15 шагов, в худшем случае принимаются 15 * 3 ^ 15.
В абсолютном худшем случае каждый сделанный шаг - "неправильный".
В этом случае 3 * 15 * 3 ^ 15 узлов находятся в очереди, прежде чем найти ответ.
Таким образом, наихудшее количество узлов, которые должны храниться в памяти, является константой, доступной для количества доступных узлов. Другими словами, использование памяти экспоненциально зависит от количества узлов.
[1] http://www.autonlab.org/tutorials/astar08.pdf, слайд 15