<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Burnmind</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Burnmind"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%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/Burnmind"/>
	<updated>2026-10-22T14:55:22Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D1%83%D1%80%D0%B0%D0%B2%D1%8C%D0%B8%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=29850</id>
		<title>Муравьиный алгоритм</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9C%D1%83%D1%80%D0%B0%D0%B2%D1%8C%D0%B8%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=29850"/>
		<updated>2025-11-03T14:58:28Z</updated>

		<summary type="html">&lt;p&gt;Burnmind: Новая страница: «== Свойства и структура алгоритма ==  === Общее описание алгоритма === Муравьиный алгоритм (Ant...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Муравьиный алгоритм (Ant Colony Optimization, ACO) — это вероятностный метаэвристический алгоритм для нахождения приближённых решений сложных задач комбинаторной оптимизации. Алгоритм принадлежит к классу методов роевого интеллекта и инспирирован поведением муравьёв, которые, находя пути к источнику пищи, оставляют на земле след феромона &amp;lt;ref name=&amp;quot;Dorigo1996&amp;quot;/&amp;gt;. Другие муравьи, обнаруживая этот след, с большей вероятностью следуют по нему, усиливая феромонную метку, если находят пищу. Таким образом, коллективное поведение колонии приводит к нахождению кратчайшего пути.&lt;br /&gt;
&lt;br /&gt;
Основная область применения ACO — задачи, которые могут быть сведены к поиску оптимальных путей на графах: задача коммивояжёра (TSP), маршрутизация в сетях, задача о назначениях, раскройка и упаковка и многие другие &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дан взвешенный граф &amp;lt;math&amp;gt; G = (V, E) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; — множество вершин (городов), а &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; — множество рёбер (путей) с весами &amp;lt;math&amp;gt; d_{ij} &amp;lt;/math&amp;gt; (расстояниями). Цель — найти гамильтонов цикл минимальной длины.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В основе алгоритма лежат два основных правила &amp;lt;ref name=&amp;quot;Dorigo1996&amp;quot;/&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Правило построения пути&#039;&#039;&#039;: Вероятность &amp;lt;math&amp;gt; p_{ij}^k(t) &amp;lt;/math&amp;gt; того, что k-й муравей в момент времени t перейдёт из вершины i в вершину j, вычисляется по формуле:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
p_{ij}^k(t) = \frac{[\tau_{ij}(t)]^\alpha \cdot [\eta_{ij}]^\beta}{\sum_{l \in J_i^k} [\tau_{il}(t)]^\alpha \cdot [\eta_{il}]^\beta}, \quad \text{если } j \in J_i^k&lt;br /&gt;
 &amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \tau_{ij}(t) &amp;lt;/math&amp;gt; — количество феромона на ребре (i, j) в момент времени t.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \eta_{ij} = 1/d_{ij} &amp;lt;/math&amp;gt; — эвристическая желательность перехода (обратная расстоянию).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \alpha &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \beta &amp;lt;/math&amp;gt; — параметры, определяющие влияние феромона и эвристики соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; J_i^k &amp;lt;/math&amp;gt; — множество вершин, которые муравей k ещё не посетил из вершины i.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило обновления феромона&#039;&#039;&#039;: После того как все муравьи построили свои пути, уровень феромона обновляется:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau_{ij}(t+1) = (1 - \rho) \cdot \tau_{ij}(t) + \Delta \tau_{ij}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \rho \in (0, 1] &amp;lt;/math&amp;gt; — коэффициент испарения феромона.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Delta \tau_{ij} = \sum_{k=1}^{m} \Delta \tau_{ij}^k &amp;lt;/math&amp;gt; — суммарное количество феромона, отложенного всеми m муравьями на ребре (i, j).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Delta \tau_{ij}^k &amp;lt;/math&amp;gt; обычно равно &amp;lt;math&amp;gt; Q / L_k &amp;lt;/math&amp;gt;, если k-й муравей прошёл по ребру (i, j), и 0 в противном случае. Здесь &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; — константа, а &amp;lt;math&amp;gt; L_k &amp;lt;/math&amp;gt; — длина пути k-го муравья.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро муравьиного алгоритма состоит из двух основных, итеративно повторяющихся процессов &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
#. &#039;&#039;&#039;Построение решений (путей) каждым муравьём&#039;&#039;&#039;: Для каждого муравья и на каждом шаге его пути производится вероятностный выбор следующей вершины. Этот процесс требует вычисления вероятностей для всех возможных переходов, что связано с операциями умножения, возведения в степень и суммирования.&lt;br /&gt;
#. &#039;&#039;&#039;Обновление феромонов на всех рёбрах графа&#039;&#039;&#039;: После построения всех путей производится испарение феромона на всех рёбрах и добавление нового феромона на рёбра, входящие в построенные пути. Этот этап включает операции умножения (на (1-ρ)) и сложения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм можно представить в виде следующих макроопераций &amp;lt;ref name=&amp;quot;Blum2005&amp;quot;/&amp;gt;:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: Задание начального уровня феромона на всех рёбрах, размещение муравьёв в начальных вершинах.&lt;br /&gt;
# &#039;&#039;&#039;Цикл по итерациям&#039;&#039;&#039; (пока не выполнен критерий остановки):&lt;br /&gt;
## &#039;&#039;&#039;Цикл по муравьям&#039;&#039;&#039;: Для каждого муравья построить полный путь.&lt;br /&gt;
## &#039;&#039;&#039;Цикл по шагам пути&#039;&#039;&#039;: Для каждого шага пути муравья рассчитать вероятности перехода и выбрать следующую вершину (например, с помощью правила рулетки).&lt;br /&gt;
## &#039;&#039;&#039;Вычисление длин путей&#039;&#039;&#039; для каждого муравья.&lt;br /&gt;
## &#039;&#039;&#039;Обновление глобального лучшего решения&#039;&#039;&#039; (если найден более короткий путь).&lt;br /&gt;
## &#039;&#039;&#039;Обновление феромона на всех рёбрах&#039;&#039;&#039; (испарение и добавление).&lt;br /&gt;
&lt;br /&gt;
Ключевые макрооперации: вероятностный выбор (правило рулетки), вычисление длины пути (суммирование весов рёбер), обновление матрицы феромонов.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
# &#039;&#039;&#039;Ввод данных&#039;&#039;&#039;: Задать граф (матрица расстояний &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;), параметры &amp;lt;math&amp;gt; \alpha, \beta, \rho, Q, m &amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt; iter_{max} &amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: &amp;lt;br&amp;gt; &amp;lt;math&amp;gt; \tau_{ij}(0) = \tau_0 &amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; (обычно &amp;lt;math&amp;gt; \tau_0 &amp;gt; 0 &amp;lt;/math&amp;gt;). &amp;lt;br&amp;gt; &amp;lt;math&amp;gt; L_{best} = \infty &amp;lt;/math&amp;gt; (длина лучшего пути). &amp;lt;br&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Для&#039;&#039;&#039; &amp;lt;math&amp;gt; iter &amp;lt;/math&amp;gt; &#039;&#039;&#039;от&#039;&#039;&#039; 1 &#039;&#039;&#039;до&#039;&#039;&#039; &amp;lt;math&amp;gt; iter_{max} &amp;lt;/math&amp;gt;: &amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Для&#039;&#039;&#039; каждого муравья &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; &#039;&#039;&#039;от&#039;&#039;&#039; 1 &#039;&#039;&#039;до&#039;&#039;&#039; &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
** Выбрать случайную начальную вершину для муравья &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt; path^k = [start] &amp;lt;/math&amp;gt; (инициализировать путь муравья).&lt;br /&gt;
** &#039;&#039;&#039;Пока&#039;&#039;&#039; путь &amp;lt;math&amp;gt; path^k &amp;lt;/math&amp;gt; не содержит все вершины:&lt;br /&gt;
*** &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; = текущая вершина муравья.&lt;br /&gt;
*** &amp;lt;math&amp;gt; J_i^k &amp;lt;/math&amp;gt; = множество непосещённых вершин из &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;.&lt;br /&gt;
*** &#039;&#039;&#039;Для&#039;&#039;&#039; каждой вершины &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt; J_i^k &amp;lt;/math&amp;gt;:&lt;br /&gt;
**** Вычислить вероятность &amp;lt;math&amp;gt; p_{ij}^k &amp;lt;/math&amp;gt; по формуле правила построения пути.&lt;br /&gt;
**** Выбрать следующую вершину &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; случайно, с вероятностями &amp;lt;math&amp;gt; p_{ij}^k &amp;lt;/math&amp;gt; (например, методом колеса рулетки).&lt;br /&gt;
**** Добавить &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt; path^k &amp;lt;/math&amp;gt;.&lt;br /&gt;
*** Вычислить длину пути &amp;lt;math&amp;gt; L_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
** Найти муравья с наименьшей длиной пути &amp;lt;math&amp;gt; L_{min} &amp;lt;/math&amp;gt; в этой итерации.&lt;br /&gt;
** &#039;&#039;&#039;Если&#039;&#039;&#039; &amp;lt;math&amp;gt; L_{min} &amp;lt; L_{best} &amp;lt;/math&amp;gt;, &#039;&#039;&#039;то&#039;&#039;&#039; &amp;lt;math&amp;gt; L_{best} = L_{min} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; path_{best} = path^{min} &amp;lt;/math&amp;gt;.&lt;br /&gt;
** &#039;&#039;&#039;Для&#039;&#039;&#039; каждого ребра &amp;lt;math&amp;gt; (i, j) &amp;lt;/math&amp;gt;:&lt;br /&gt;
*** &amp;lt;math&amp;gt; \Delta \tau_{ij} = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;Для&#039;&#039;&#039; каждого муравья &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; &#039;&#039;&#039;от&#039;&#039;&#039; 1 &#039;&#039;&#039;до&#039;&#039;&#039; &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
**** &#039;&#039;&#039;Если&#039;&#039;&#039; ребро &amp;lt;math&amp;gt; (i, j) &amp;lt;/math&amp;gt; входит в &amp;lt;math&amp;gt; path^k &amp;lt;/math&amp;gt;:&lt;br /&gt;
***** &amp;lt;math&amp;gt; \Delta \tau_{ij} \mathrel{+}= Q / L_k &amp;lt;/math&amp;gt;&lt;br /&gt;
**** &amp;lt;math&amp;gt; \tau_{ij} = (1 - \rho) \cdot \tau_{ij} + \Delta \tau_{ij} &amp;lt;/math&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Вывод&#039;&#039;&#039;: &amp;lt;math&amp;gt; path_{best} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; L_{best} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма оценивается как &amp;lt;math&amp;gt; O(m \cdot n^2 + n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; — число вершин в графе, &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; — число муравьёв &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;.&lt;br /&gt;
* Построение пути одним муравьём: на каждом из &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов необходимо вычислить вероятности для &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; возможных вершин. Сложность для одного муравья — &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, для всех &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; муравьёв — &amp;lt;math&amp;gt; O(m \cdot n^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Обновление феромона: требует просмотра всех &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt; рёбер и для каждого ребра проверки вклада от &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; муравьёв, что дает &amp;lt;math&amp;gt; O(m \cdot n^2) &amp;lt;/math&amp;gt;. Однако на практике часто обновляют феромон только для рёбер, входящих в построенные пути, что может снизить сложность. В худшем случае сложность этапа обновления — &amp;lt;math&amp;gt; O(m \cdot n^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность &amp;lt;math&amp;gt; T &amp;lt;/math&amp;gt; итераций составляет &amp;lt;math&amp;gt; O(T \cdot m \cdot n^2) &amp;lt;/math&amp;gt;. Основное время работы приходится на этап построения путей муравьями.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф муравьиного алгоритма имеет иерархическую и сильно разветвлённую структуру.&lt;br /&gt;
* &#039;&#039;&#039;Верхний уровень&#039;&#039;&#039;: Итерационный процесс. Каждая итерация зависит от результатов предыдущей через глобальную матрицу феромонов.&lt;br /&gt;
* &#039;&#039;&#039;Внутри итерации&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;Уровень муравьёв&#039;&#039;&#039;: Процессы построения путей каждым муравьём являются независимыми (в пределах одной итерации) и могут выполняться параллельно. Они читают общую матрицу феромонов &amp;lt;math&amp;gt; \tau_{ij} &amp;lt;/math&amp;gt;, но не записывают в неё.&lt;br /&gt;
** &#039;&#039;&#039;Уровень шагов муравья&#039;&#039;&#039;: Для каждого муравья построение пути — последовательный процесс. Выбор следующей вершины на шаге &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; зависит от текущего частичного пути (множества посещённых вершин) и матрицы феромонов.&lt;br /&gt;
* &#039;&#039;&#039;Синхронизация&#039;&#039;&#039;: После завершения всеми муравьями построения путей происходит операция обновления феромонов. Эта операция требует данных от всех муравьёв (построенные пути и их длины).&lt;br /&gt;
&lt;br /&gt;
Граф можно представить как последовательность итерационных блоков. Внутри каждого блока — веер из &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; независимых ветвей (муравьи), которые затем сходятся в узле обновления феромона.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллельная сложность одной итерации алгоритма определяется самым длинным последовательным участком &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;Pedemonte2011&amp;quot;/&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Массовый параллелизм&#039;&#039;&#039;: Построение путей отдельными муравьями в пределах одной итерации полностью независимо и может выполняться параллельно. Таким образом, доступен параллелизм степени &amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;. Вычисление вероятностей для одного муравья на одном шаге также может быть распараллелено по непосещённым вершинам, что даёт параллелизм степени &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Скошенный параллелизм&#039;&#039;&#039;: Внутри процесса построения пути одним муравьём параллелизм отсутствует, так как шаги строго последовательны.&lt;br /&gt;
* &#039;&#039;&#039;Глобальное обновление феромона&#039;&#039;&#039;: Операции обновления феромона для разных рёбер теоретически независимы и могут выполняться параллельно, обеспечивая параллелизм степени &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;. Однако необходимо суммирование вкладов от разных муравьёв для каждого ребра, что требует либо редукции, либо разделения данных.&lt;br /&gt;
&lt;br /&gt;
Таким образом, теоретически, при неограниченном числе процессоров, длительность одной итерации может быть сведена к &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt; (время построения пути одним муравьём) плюс &amp;lt;math&amp;gt; O(\log m) &amp;lt;/math&amp;gt; (время сбора информации от муравьёв для обновления феромона) плюс &amp;lt;math&amp;gt; O(1) &amp;lt;/math&amp;gt; (параллельное обновление рёбер). На практике доминирующим является параллелизм на уровне муравьёв (&amp;lt;math&amp;gt; O(m) &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Stutzle2010&amp;quot;/&amp;gt;:&lt;br /&gt;
* Матрица расстояний &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n \times n &amp;lt;/math&amp;gt;. Для задачи TSP это плотная матрица, для других задач может быть разреженной.&lt;br /&gt;
* Параметры алгоритма: &amp;lt;math&amp;gt; \alpha, \beta, \rho, Q, m, iter_{max} &amp;lt;/math&amp;gt;. Скаляры.&lt;br /&gt;
* Начальный уровень феромона &amp;lt;math&amp;gt; \tau_0 &amp;lt;/math&amp;gt; (скаляр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: Доминирующий объём — матрица расстояний, &amp;lt;math&amp;gt; n^2 &amp;lt;/math&amp;gt; элементов. Параметры — константное число скаляров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор &amp;lt;math&amp;gt; path_{best} &amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;, представляющий собой последовательность вершин лучшего найденного гамильтонова цикла.&lt;br /&gt;
* Скаляр &amp;lt;math&amp;gt; L_{best} &amp;lt;/math&amp;gt; — длина лучшего найденного пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + 1 &amp;lt;/math&amp;gt; элемент.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;&#039;Соотношение последовательной и параллельной сложности&#039;&#039;&#039;: Последовательная сложность — &amp;lt;math&amp;gt; O(T \cdot m \cdot n^2) &amp;lt;/math&amp;gt;. Параллельная сложность (идеализированная) — &amp;lt;math&amp;gt; O(T \cdot n) &amp;lt;/math&amp;gt;. Выигрыш от параллелизации значителен и ограничен в основном числом муравьёв &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;Pedemonte2011&amp;quot;/&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;: Алгоритм выполняет большое количество операций (&amp;lt;math&amp;gt; O(T \cdot m \cdot n^2) &amp;lt;/math&amp;gt;) по отношению к объёму входных (&amp;lt;math&amp;gt; n^2 &amp;lt;/math&amp;gt;) и выходных (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;) данных. Мощность высокая — &amp;lt;math&amp;gt; O(T \cdot m) &amp;lt;/math&amp;gt;, что благоприятно для реализации на ускорителях &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;: Алгоритм стохастичен и не гарантирует нахождения глобального оптимума &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;. Результаты могут незначительно меняться от запуска к запуску из-за случайного выбора. Устойчивость к малым изменениям в входных данных зависит от конкретной задачи и параметров.&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность&#039;&#039;&#039;: На этапе построения путей нагрузка между муравьями сбалансирована, так как каждый строит путь одинаковой длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;. Однако, время выбора вершин может незначительно варьироваться из-за стохастичности. Этап обновления феромона хорошо сбалансирован при параллелизации по рёбрам.&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;: Алгоритм является недетерминированным ввиду вероятностного характера построения пути &amp;lt;ref name=&amp;quot;Blum2005&amp;quot;/&amp;gt;. Разные запуски с одним и тем же начальным состоянием могут давать разные результаты.&lt;br /&gt;
* &#039;&#039;&#039;Степень исхода вершин информационного графа&#039;&#039;&#039;:&lt;br /&gt;
** Матрица феромонов имеет высокую степень исхода — её данные используются всеми муравьями на каждом шаге построения пути.&lt;br /&gt;
** Данные о лучшем пути имеют низкую степень исхода (используются только для вывода).&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Длинные&amp;quot; дуги&#039;&#039;&#039;: Глобальная матрица феромонов создаёт длинные дуги от операции обновления на итерации &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; ко всем операциям выбора пути на итерации &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
* Для эффективности часто используют &amp;quot;кандидатские списки&amp;quot; — для каждой вершины хранят список ближайших соседей, чтобы сократить перебор при вычислении вероятностей &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;.&lt;br /&gt;
* Важно оптимизировать вычисление вероятностей, чтобы избежать многократных вычислений знаменателя.&lt;br /&gt;
* Для хранения матрицы феромонов и расстояний используют двумерные массивы. При больших &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; необходимо следить за использованием памяти.&lt;br /&gt;
* Разрядность: для большинства задач достаточно точности `float` для хранения феромонов и вероятностей, что ускоряет вычисления и экономит память. Для вычисления длин путей может потребоваться `double`.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
* &#039;&#039;&#039;Распараллеливание по муравьям (Data Parallelism)&#039;&#039;&#039;: Наиболее естественный способ &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;. Каждому потоку/процессу назначается подмножество муравьёв. После построения путей требуется глобальная редукция для обновления лучшего пути и матрицы феромонов. Хорошо подходит для OpenMP (на многоядерных CPU) и CUDA/OpenCL (на GPU). Необходимо обеспечить атомарность при обновлении лучшего решения.&lt;br /&gt;
* &#039;&#039;&#039;Распараллеливание по графу (Task Parallelism)&#039;&#039;&#039;: При очень больших графах можно распределить вершины или рёбра между процессами. Это более сложно из-за необходимости коммуникации при построении пути муравьём, который &amp;quot;переходит&amp;quot; между разными частями графа. Может быть эффективно для распределённых систем с помощью MPI.&lt;br /&gt;
* &#039;&#039;&#039;Гибридные подходы&#039;&#039;&#039;: Комбинация MPI для распределения муравьёв по узлам кластера и OpenMP для параллельной обработки муравьёв внутри узла &amp;lt;ref name=&amp;quot;Pedemonte2011&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
* &#039;&#039;&#039;Многоядерные CPU (OpenMP)&#039;&#039;&#039;: Алгоритм хорошо масштабируется с числом муравьёв &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;. Критическим местом является этап обновления феромона, который может стать узким местом из-за необходимости синхронизации доступа к общей памяти. Рекомендуется использовать локальные копии матрицы феромонов для каждого потока с последующей редукцией.&lt;br /&gt;
* &#039;&#039;&#039;GPU (CUDA/OpenCL)&#039;&#039;&#039;: Идеальная платформа благодаря массовому параллелизму на уровне муравьёв. Каждый муравей может быть представлен как отдельный поток. Необходимо тщательно управлять доступом к глобальной памяти (матрица феромонов) для избежания конфликтов. Использование разделяемой памяти и кандидатских списков может значительно повысить производительность.&lt;br /&gt;
* &#039;&#039;&#039;Кластеры (MPI)&#039;&#039;&#039;: Эффективность зависит от балансировки нагрузки между узлами. Широковещательная рассылка матрицы феромонов после каждой итерации может создать значительный сетевой трафик. Рекомендуется использовать асинхронные коммуникации и, возможно, уменьшать частоту глобального обновления &amp;lt;ref name=&amp;quot;Pedemonte2011&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Dorigo1996&amp;quot;&amp;gt;Dorigo, M., Maniezzo, V., &amp;amp; Colorni, A. (1996). &#039;&#039;Ant System: Optimization by a colony of cooperating agents&#039;&#039;. IEEE Transactions on Systems, Man, and Cybernetics-Part B, 26(1), 29-41.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;&amp;gt;Dorigo, M., &amp;amp; Stützle, T. (2004). &#039;&#039;Ant Colony Optimization&#039;&#039;. MIT Press.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Blum2005&amp;quot;&amp;gt;Blum, C. (2005). &#039;&#039;Ant colony optimization: Introduction and recent trends&#039;&#039;. Physics of Life reviews, 2(4), 353-373.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Stutzle2010&amp;quot;&amp;gt;Stützle, T., López-Ibáñez, M., &amp;amp; Dorigo, M. (2010). &#039;&#039;A Concise Overview of Applications of Ant Colony Optimization&#039;&#039;. In Wiley Encyclopedia of Operations Research and Management Science.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Randall2002&amp;quot;&amp;gt;Randall, M., &amp;amp; Lewis, A. (2002). &#039;&#039;A parallel implementation of ant colony optimization&#039;&#039;. Journal of Parallel and Distributed Computing, 62(9), 1421-1432.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Pedemonte2011&amp;quot;&amp;gt;Pedemonte, M., Nesmachnow, S., &amp;amp; Cancela, H. (2011). &#039;&#039;A survey on parallel ant colony optimization&#039;&#039;. Applied Soft Computing, 11(8), 5181-5197.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Burnmind</name></author>
	</entry>
</feed>