Почему A* с допустимой несогласованной эвристикой находит неоптимальное решение?

Я знаю, что A * с допустимой непоследовательной эвристикой не найдет оптимального решения, но я изо всех сил пытаюсь найти пример, когда это произойдет.

Я не могу найти пример из-за этой мысли - после вставки нашего целевого узла (с неоптимальным f (n)) в очередь приоритетов очередь приоритетов также должна содержать узел, например. node_1, который находится на оптимальном пути. f(n) узла node_1 в очереди приоритетов должно быть меньше, чем f(n) нашего целевого узла, так как мы используем допустимую эвристику. Вот почему node_1 будет удален из очереди раньше, а после нескольких итераций A* (с использованием той же идеи) goal_node будет удален из очереди позже, после того как будет найден оптимальный путь.

Где я думаю неправильно? Может ли кто-нибудь дать мне краткий пример простого графа, когда A * с допустимой непоследовательной эвристикой найдет неоптимальный путь?

Спасибо.


person Druudik    schedule 04.08.2018    source источник
comment
ИМХО, этот вопрос скорее для cs.stackexchange.com или даже math.stackexchange.com   -  person user31264    schedule 04.08.2018
comment
Эта цитата из Википедии отвечает на ваш вопрос? - Если используется замкнутый набор, то h также должен быть монотонным (или непротиворечивым), чтобы A* был оптимальным. ... [Если это не монотонно], узлы в закрытом наборе могут быть открыты заново, а их стоимость улучшена.   -  person Bernhard Barker    schedule 04.08.2018
comment
@Dukeling Я сказал, что уже знаю об этом. Я прошу привести пример графика, где это будет происходить, или доказать, почему это не будет оптимальным.   -  person Druudik    schedule 04.08.2018
comment
Если вы используете алгоритм A* как изначально определено[PDF], он найдет оптимальное решение с допустимой эвристикой.   -  person jazzpi    schedule 22.09.2019


Ответы (1)


Вот пример графика, на котором мы получаем неправильный ответ из-за непоследовательной эвристики. Здесь эвристика показана в скобках рядом с каждым узлом, а стоимость ребра указана рядом с ребрами:

     (8)
      A
     / \
+1  /   \ +3
   /     \   
  B ----- C ----- D
(7)  +1  (0)  +6  (0)

Здесь оптимальный путь из A в D — это A — B — C — D с общей стоимостью 8. Но давайте посмотрим, что сделает A*:

  • Начиная с A, есть варианты: перейти от A к B с затратами плюс эвристика 8 или перейти от A к C с затратами плюс эвристика 3. Итак, мы выбираем A – C.

  • Теперь у нас есть варианты: расширить A-B для стоимости плюс эвристика 8 или расширить C-D для стоимости плюс эвристика 9. Итак, мы выбираем A-B.

  • Мы уже закрыли C предыдущим путем, поэтому мы не рассматриваем ребро B — C. Вместо этого мы выбираем C — D по цене 9.

  • В общем, мы нашли путь A - C - D. Упс.

Следующий вопрос заключается в том, как вы могли бы найти пример, подобный этому, и для этого точка зрения, которая, как мне кажется, весьма полезна для размышлений о том, как работает A*, заключается в следующем:

Запуск A* на графе, ребра которого имеют стоимость c(u, v), с использованием эвристической функции h(v) эквивалентен запуску алгоритма Дейкстры на графе, где стоимость ребра (u, v) равна c(u , v) + h(v) - h(u).

Другими словами, вы можете думать о том, что делает A*, как если бы вы запускали алгоритм Дейкстры, настраивая стоимость каждого ребра, добавляя изменение эвристического значения для каждого ребра.

Причина, по которой это полезно, заключается в том, что алгоритм Дейкстры, как известно, будет давать неправильный ответ в тех случаях, когда в графе есть отрицательные ребра. Таким образом, мы можем спросить: когда мы изменим стоимость ребра на c(u, v) + h(v) - h(u), сможем ли мы когда-нибудь получить отрицательную стоимость? Другими словами, что должно произойти, чтобы

c(u, v) + h(v) - h(u) ≥ 0?

При быстрой перестановке можно заметить, что это происходит именно в том случае, если

c(u, v) + h(v) ≥ h(u)

или, что то же самое, uf

h(u) ≤ c(u, v) + h(v).

И эй! Это определение последовательной эвристики.

Это означает, что что-то может пойти не так, если использовать A* с непоследовательной эвристикой точно так же, как что-то может пойти не так с алгоритмом Дейкстры, использующим отрицательные веса ребер. Вы (скорее всего) столкнетесь с проблемой, когда найдете неоптимальный путь к какому-то промежуточному узлу на пути к цели и оттуда получите неверный ответ.

Я закончил тем, что построил приведенный выше график, где A * терпит неудачу, начав с этого графика, где Дейкстра получает неправильный ответ, а затем реконструировал эвристику, которая сделала все затраты на преимущество положительными:

    A
+0 / \ -5
  /   \
 B --- C --- D
    -6    +6

Здесь путь, который Дейкстра нашел бы от A до D, — это путь A — C — D со стоимостью 1, а не путь A — B — C — D со стоимостью 0. Это тот же неправильный путь, что и в Пример A* наверху.

person templatetypedef    schedule 04.08.2018
comment
Спасибо за ваш ответ. Это было полезно. Но на самом деле это не ответило на мой вопрос. В вашем графическом примере вы используете эвристику, которая недопустима (эвристика для узла B равна 7, но стоимость фактического пути равна 4). Я знаю, что с недопустимой эвристикой A* может найти неоптимальное решение. Но мне было любопытно найти пример такого графа, где мы найдем неоптимальное решение, используя ДОПУСТИМОЕ и несогласованную эвристику для поиска графа A *. - person Druudik; 05.08.2018
comment
@User5458622 Ой! Я только что обновил пример, чтобы использовать допустимую, непоследовательную эвристику, которая по-прежнему дает неверный путь. - person templatetypedef; 05.08.2018
comment
Неправильный пример. Расширение КД стоит 7. - person geek101; 18.09.2018
comment
Новый пример недопустим @templatetypedef - person geek101; 18.09.2018
comment
@JaiMahajan Кажется, я все исправил. Новый пример является допустимой эвристикой (он никогда не занижает общее расстояние), но он противоречив и, следовательно, приводит к неправильному ответу. - person templatetypedef; 18.09.2018
comment
@templatetypedef Я не согласен с вашим решением не проходить BC, потому что C закрыт. Я думаю, вы путаете вещи. A* просто идет по значению F и останавливается, когда путь, включающий целевое состояние, расширяется. Посмотрите следующее видео, оно дает хорошее объяснение обхода A * к графику, подобному вашему. youtu.be/DhtSZhakyOo - person geek101; 19.09.2018
comment
Даже после получения S->B мы ​​исследуем S->A->B и т. д. в видео. Открытые и закрытые списки работают в IDA* и SMA*. - person geek101; 19.09.2018
comment
Также я цитирую. Согласно последовательной эвристике, как только узел расширяется и помещается в закрытый список, он никогда не возвращается в открытый список.https://www.google.co.in/url?sa=t&source=web&rct=j&url=https://webdocs.cs.ualberta.ca/~holte/Publications/ijcai09.pdf&ved=2ahUKEwiQ_43aw8XdAhUSWX0KHYXTCysQFjADegQIGxAB&usg=AOvVaw0mi_uod0wCi3yGenN1rzY3 эвристика в вашем случае не соответствует - person geek101; 19.09.2018
comment
Я видел несколько разных вариаций A*. Если вы используете идею закрытого списка, как в алгоритме Дейкстры, то A * требует последовательных эвристик в дополнение к допустимым, чтобы избежать проблем, показанных в моем ответе. Если вы не используете закрытые списки, вы всегда получите правильный ответ, если ваша эвристика допустима, но время выполнения может стать экспоненциально большим по размеру пространства входных состояний. Так что в этом смысле, возможно, лучшим ответом будет «если вы используете закрытые списки, вы можете получить неправильный ответ, а если нет, то несогласованность может привести к снижению производительности». - person templatetypedef; 19.09.2018
comment
Обратите внимание, что в исходной статье Харт использует концепции открытых/закрытых узлов, но определяет расширение как таковое: вычислить f для каждого преемника n и пометить как открытый каждый последующий узел, еще не помеченный как закрытый. Отметить как открытый любой закрытый узел n_i, который является преемником n и для которого f(n_i) сейчас меньше, чем было, когда n_i был помечен как закрытый. (выделено мной). продолжайте доказывать, что A * действительно находит оптимальные решения, если эвристика не завышает оценку в теореме 1. - person jazzpi; 22.09.2019
comment
Стоимость для A-C-B будет 11. Стоимость для A-C-D будет 9. Так почему же вы сначала выбрали A-C-B? - person Kataran; 24.12.2020