Алгоритм A* — различия между версиями
м (→Псевдокод) |
(→Доказательство оптимальности и корректности) |
||
Строка 46: | Строка 46: | ||
==Доказательство оптимальности и корректности== | ==Доказательство оптимальности и корректности== | ||
− | + | Полное доказательство расположено [http://www.cs.auckland.ac.nz/compsci709s2c/resources/Mike.d/astarNilsson.pdf здесь]. Здесь приведем основные факты. | |
− | + | Алгоритм является допустимым(корректным) если он гарантированно находит оптимальный путь из S до целевой вершины. | |
− | + | Допустимые алгоритмы могут различаться числом рассмотренных вершин и порядком просмотра вершин. | |
− | + | Допустимость А* | |
− | + | Лемма 1. Для любой незакрытой вершины n и любого оптимального пути P из S в n существует открытая вершина n', лежащая на этом пути, для которой найденная стоимость пути из S оптимальна. | |
+ | Теорема 1. Если для любой вершины эвристика не переоценивает настоящую стоимость минимального пути до целевой вершины, то А* допустим. | ||
==Ссылки== | ==Ссылки== |
Версия 02:22, 19 ноября 2011
Алгоритм А*("A star", "А звёздочка") -- информированный алгоритм поиска, который находит во взвешенном графе маршрут наименьшей стоимости от начальной вершины до выбранной конечной.
Эвристика
В процессе работы алгоритма для вершин используется функция Дейкстру . Если всегда меньше истинной стоимости пути до цели, то А* гарантированно найдет кратчайший путь, причем чем меньше разница между эвристикой и истинной стоимостью, тем меньше вершин рассмотрит алгоритм. Если выйдет так, что эвристика превысила истинную стоимость, то А* будет работать быстрее, но возможно найдет не лучший путь, хотя его можно считать "хорошим" и если производительность предпочтительнее точности можно использовать такую эвристику.
, где - наименьшая стоимость пути в v из стартовой вершины, - эвристическое приближение стоимости пути от v до конечной цели. должна быть эвристически допустимой, то есть не должна переоценивать рассояние до цели. Например, если наш граф является некоторой картой, разбитой сеткой, то эвристику можно назначить минимальным числом перемещений из клетки в клетку. К примеру, если , то А* превращается вПсевдокод
А* просматривает среди всех маршрутов ведущих к цели сначала те, которые благодаря имеющейся информации(эвристическая функция) в данный момент похожи на наилучший, причем алгоритм учитывает путь уже пройденный до текущей вершины.
void A*(start,goal) { closed := {}; // Множество вершин расстояние до которых мы уже оценили open.push(start);// Очередь с приоритетом f[start] = g[start] + h[start]; parent[start] = start; while (open.size() != 0) { x := open.pop(); if (x == goal) return succsess(x);// Кратчайший путь найден closed.push(x); for (y : xy in E) { if (y in closed) continue; tmp := g[x] + d[x,y] // Стоимость пути до y if (y not in open) { open.push(y); tentative_is_better = true; } else if (tmp < g[y]) tentative_is_better := true else tentative_is_better := false if (tentative_is_better == true)// { parent[y] = x; g[y] = tmp; f[y] = g[y] + h[y]; } } } return failure; // Наша цель недостижима из start }
Доказательство оптимальности и корректности
Полное доказательство расположено здесь. Здесь приведем основные факты. Алгоритм является допустимым(корректным) если он гарантированно находит оптимальный путь из S до целевой вершины. Допустимые алгоритмы могут различаться числом рассмотренных вершин и порядком просмотра вершин. Допустимость А* Лемма 1. Для любой незакрытой вершины n и любого оптимального пути P из S в n существует открытая вершина n', лежащая на этом пути, для которой найденная стоимость пути из S оптимальна. Теорема 1. Если для любой вершины эвристика не переоценивает настоящую стоимость минимального пути до целевой вершины, то А* допустим.