<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.83.188.227&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.83.188.227&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.83.188.227"/>
		<updated>2026-05-20T01:54:18Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=71147</id>
		<title>Алгоритм A*</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=71147"/>
				<updated>2019-05-06T19:59:58Z</updated>
		
		<summary type="html">&lt;p&gt;95.83.188.227: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм '''А*''' (англ. ''A star'') {{---}} алгоритм поиска, который находит во взвешенном графе маршрут наименьшей стоимости от начальной вершины до выбранной конечной.&lt;br /&gt;
==Описание==&lt;br /&gt;
[[Файл:Astar_progress_animation.gif|right|frame|Пример работы А*. Пустые кружки принадлежат к открытому списку, а окрашенные к закрытому.]]&lt;br /&gt;
В процессе работы алгоритма для вершин рассчитывается функция &amp;lt;tex&amp;gt;f(v) = g(v) + h(v)&amp;lt;/tex&amp;gt;, где &lt;br /&gt;
*&amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} наименьшая стоимость пути в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из стартовой вершины, &lt;br /&gt;
*&amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} эвристическое приближение стоимости пути от &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до конечной цели. &lt;br /&gt;
&lt;br /&gt;
Фактически, функция &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt; {{---}} длина пути до цели, которая складывается из пройденного расстояния &amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; и оставшегося расстояния &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;. Исходя из этого, чем меньше значение &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt;, тем раньше мы откроем вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, так как через неё мы предположительно достигнем расстояние до цели быстрее всего.&lt;br /&gt;
Открытые алгоритмом вершины можно хранить в очереди с приоритетом по значению &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt;. А* действует подобно [[Алгоритм Дейкстры | алгоритму Дейкстры]] и просматривает среди всех маршрутов ведущих к цели сначала те, которые благодаря имеющейся информации (эвристическая функция) в данный момент являются наилучшими. &lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
==Свойства==&lt;br /&gt;
Чтобы A* был оптимален, выбранная функция &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; должна быть '''допустимой''' эвристической функцией.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что эвристическая оценка &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; '''допустима''', если для любой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; меньше или равно весу кратчайшего пути от &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до цели.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Допустимая оценка является оптимистичной, потому что она предполагает, что стоимость решения меньше, чем оно есть на самом деле. &amp;lt;br&amp;gt;&lt;br /&gt;
Второе, более сильное условие {{---}} функция &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; должна быть '''монотонной'''.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Эвристическая функция &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; называется '''монотонной''' (или '''преемственной'''), если для любой вершины &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; и ее потомка &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; разность &amp;lt;tex&amp;gt;h(v_1)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(v_2)&amp;lt;/tex&amp;gt; не превышает фактического веса ребра &amp;lt;tex&amp;gt;c(v_1, v_2)&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;, а эвристическая оценка целевого состояния равна нулю.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Любая монотонная эвристика допустима, однако обратное неверно.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt;k(v)&amp;lt;/tex&amp;gt; {{---}} длина кратчайшего пути из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до цели. &lt;br /&gt;
Докажем индукцией по числу шагов до цели, что &amp;lt;tex&amp;gt;h(v) \leqslant k(v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Если до цели расстояние &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; {{---}} цель и &amp;lt;tex&amp;gt;h(v) = 0 \leqslant k(v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; находится на расстоянии &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; от цели. Тогда существует потомок &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;, который находится на кратчайшем пути от &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до цели и &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt;лежит на расстоянии &amp;lt;tex&amp;gt;i - 1&amp;lt;/tex&amp;gt; шагов до цели. Следовательно, &amp;lt;tex&amp;gt;h(v) \leqslant c(v, v') + h(v')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
По предположению, &amp;lt;tex&amp;gt;h(v') \leqslant k(v')&amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt;h(v) \leqslant c(v, v') + k(v') = k(v)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Таким образом, монотонная эвристика &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; допустима.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; монотонна, то последовательность значений &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt; на любом пути неубывает.&lt;br /&gt;
|proof=Доказательство следует из определения монотонности.&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;v'&amp;lt;/tex&amp;gt; {{---}} потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;g(v') = g(v) + c(v, v')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;Следовательно, &amp;lt;tex&amp;gt;f(v') = g(v') + h(v') = g(v) + c(v, v') + h(v') \geqslant g(v) + h(v) = f(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм A* является оптимальным, если функция &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; монотонна.&lt;br /&gt;
|proof=Последовательность вершин &amp;quot;развёрнутых&amp;quot; во время работы алгоритма находится в неубывающем порядке значений &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поэтому очередная выбираемая вершина должна представлять собой оптимальное решение, поскольку все дальнейшие узлы будут, по меньшей мере, столь же дорогостоящими. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Примеры эвристик==&lt;br /&gt;
Поведение алгоритма сильно зависит от того, какая эвристика используется. В свою очередь, выбор эвристики зависит[[Файл:Diagonal.png|thumb|right|Пример А* на сетке с возможностью ходить в восьми напрвлениях]] от постановки задачи. Часто А* используется для моделирования перемещения по поверхности, покрытой координатной сеткой.&lt;br /&gt;
&lt;br /&gt;
* Если мы можем перемещаться в четырех направлениях, то в качестве эвристики стоит выбрать манхэттенское расстояние&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Manhattan_distance Wikipedia {{---}} Manhattan distance]&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = |{v.x-goal.x}| + |{v.y-goal.y}|&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Расстояние Чебышева&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/Расстояние_Чебышева Википедия {{---}} Расстояние Чебышева]&amp;lt;/ref&amp;gt; применяется, когда к четырем направлениям добавляются диагонали:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \max{(|{v.x-goal.x}|, |{v.y-goal.y}|)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если передвижение не ограничено сеткой, то можно использовать евклидово расстояние по прямой:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \sqrt{(v.x-goal.x)^2 + (v.y-goal.y)^2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также стоит обратить внимание на то как соотносятся &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;. Если они измеряются в разных величинах (например, &amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} это расстояние в километрах, а &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} оценка времени пути в часах) А* может выдать некорректный результат.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
В приведённой реализации:&lt;br /&gt;
* &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} множество вершин, которые требуется рассмотреть,&lt;br /&gt;
* &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; {{---}} множество рассмотренных вершин,&lt;br /&gt;
* &amp;lt;tex&amp;gt;f[x]&amp;lt;/tex&amp;gt; {{---}} значение эвристической функции &amp;quot;расстояние + стоимость&amp;quot; для вершины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;g[x]&amp;lt;/tex&amp;gt; {{---}} стоимость пути от начальной вершины до &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;h(x)&amp;lt;/tex&amp;gt; {{---}} эвристическая оценка расстояния от вершины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; до конечной вершины.&lt;br /&gt;
На каждом этапе работы алгоритма из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; выбирается вершина с наименьшим значением эвристической функции и просматриваются её соседи. Для каждого из соседей обновляется расстояние, значение эвристической функции и он добавляется в множество &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Псевдокод:&lt;br /&gt;
 '''bool''' A*(start, goal)''':'''&lt;br /&gt;
     U = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(start)&lt;br /&gt;
     g[start] = 0&lt;br /&gt;
     f[start] = g[start] + h(start)&lt;br /&gt;
     '''while''' Q.size() != 0&lt;br /&gt;
         current = вершина из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; с минимальным значением &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''if''' current == goal&lt;br /&gt;
             '''return''' ''true''                                           &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// нашли путь до нужной вершины&amp;lt;/font&amp;gt;&lt;br /&gt;
         Q.remove(current)&lt;br /&gt;
         U.push(current)&lt;br /&gt;
         '''for''' v : смежные с current вершины&lt;br /&gt;
             tentativeScore = g[current] + d(current, v)           &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// d(current, v) {{---}} стоимость пути между current и v&amp;lt;/font&amp;gt; &lt;br /&gt;
             '''if''' &amp;lt;tex&amp;gt;v \in U&amp;lt;/tex&amp;gt; '''and''' tentativeScore &amp;gt;= g[v]&lt;br /&gt;
                 '''continue'''&lt;br /&gt;
             '''if''' &amp;lt;tex&amp;gt;v \notin U&amp;lt;/tex&amp;gt; '''or''' tentativeScore &amp;lt; g[v]&lt;br /&gt;
                 parent[v] = current&lt;br /&gt;
                 g[v] = tentativeScore&lt;br /&gt;
                 f[v] = g[v] + h(v)&lt;br /&gt;
                 '''if''' &amp;lt;tex&amp;gt;v \notin Q&amp;lt;/tex&amp;gt;&lt;br /&gt;
                     Q.push(v)&lt;br /&gt;
     '''return''' ''false''&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Эвристики для поиска кратчайших путей]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* С. Рассел, П. Норвиг {{---}} Искусственный интеллект. Современный подход, 2е издание&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Алгоритм_поиска_A* Википедия {{---}} Алгоритм поиска A*]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/A*_search_algorithm Wikipedia {{---}} A* search algorithm]&lt;br /&gt;
* [http://theory.stanford.edu/~amitp/GameProgramming/ Статья о поиске кратчайших путей]&lt;br /&gt;
* [http://dl.acm.org/citation.cfm?id=3830&amp;amp;coll=portal&amp;amp;dl=ACM Generalized best-first search strategies and the optimality of A*]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>95.83.188.227</name></author>	</entry>

	</feed>