<?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/index.php?action=history&amp;feed=atom&amp;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</id>
	<title>Муравьиный алгоритм - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?action=history&amp;feed=atom&amp;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"/>
	<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;action=history"/>
	<updated>2026-10-22T15:54:40Z</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&amp;oldid=prev</id>
		<title>Burnmind: Новая страница: «== Свойства и структура алгоритма ==  === Общее описание алгоритма === Муравьиный алгоритм (Ant...»</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&amp;oldid=prev"/>
		<updated>2025-11-03T14:58:28Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== Свойства и структура алгоритма ==  === Общее описание алгоритма === Муравьиный алгоритм (Ant...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&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;
&amp;#039;&amp;#039;&amp;#039;Правило построения пути&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Правило обновления феромона&amp;#039;&amp;#039;&amp;#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;
#. &amp;#039;&amp;#039;&amp;#039;Построение решений (путей) каждым муравьём&amp;#039;&amp;#039;&amp;#039;: Для каждого муравья и на каждом шаге его пути производится вероятностный выбор следующей вершины. Этот процесс требует вычисления вероятностей для всех возможных переходов, что связано с операциями умножения, возведения в степень и суммирования.&lt;br /&gt;
#. &amp;#039;&amp;#039;&amp;#039;Обновление феромонов на всех рёбрах графа&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Инициализация&amp;#039;&amp;#039;&amp;#039;: Задание начального уровня феромона на всех рёбрах, размещение муравьёв в начальных вершинах.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Цикл по итерациям&amp;#039;&amp;#039;&amp;#039; (пока не выполнен критерий остановки):&lt;br /&gt;
## &amp;#039;&amp;#039;&amp;#039;Цикл по муравьям&amp;#039;&amp;#039;&amp;#039;: Для каждого муравья построить полный путь.&lt;br /&gt;
## &amp;#039;&amp;#039;&amp;#039;Цикл по шагам пути&amp;#039;&amp;#039;&amp;#039;: Для каждого шага пути муравья рассчитать вероятности перехода и выбрать следующую вершину (например, с помощью правила рулетки).&lt;br /&gt;
## &amp;#039;&amp;#039;&amp;#039;Вычисление длин путей&amp;#039;&amp;#039;&amp;#039; для каждого муравья.&lt;br /&gt;
## &amp;#039;&amp;#039;&amp;#039;Обновление глобального лучшего решения&amp;#039;&amp;#039;&amp;#039; (если найден более короткий путь).&lt;br /&gt;
## &amp;#039;&amp;#039;&amp;#039;Обновление феромона на всех рёбрах&amp;#039;&amp;#039;&amp;#039; (испарение и добавление).&lt;br /&gt;
&lt;br /&gt;
Ключевые макрооперации: вероятностный выбор (правило рулетки), вычисление длины пути (суммирование весов рёбер), обновление матрицы феромонов.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Ввод данных&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Инициализация&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Для&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt; iter &amp;lt;/math&amp;gt; &amp;#039;&amp;#039;&amp;#039;от&amp;#039;&amp;#039;&amp;#039; 1 &amp;#039;&amp;#039;&amp;#039;до&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt; iter_{max} &amp;lt;/math&amp;gt;: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Для&amp;#039;&amp;#039;&amp;#039; каждого муравья &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; &amp;#039;&amp;#039;&amp;#039;от&amp;#039;&amp;#039;&amp;#039; 1 &amp;#039;&amp;#039;&amp;#039;до&amp;#039;&amp;#039;&amp;#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;
** &amp;#039;&amp;#039;&amp;#039;Пока&amp;#039;&amp;#039;&amp;#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;
*** &amp;#039;&amp;#039;&amp;#039;Для&amp;#039;&amp;#039;&amp;#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;
** &amp;#039;&amp;#039;&amp;#039;Если&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt; L_{min} &amp;lt; L_{best} &amp;lt;/math&amp;gt;, &amp;#039;&amp;#039;&amp;#039;то&amp;#039;&amp;#039;&amp;#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;
** &amp;#039;&amp;#039;&amp;#039;Для&amp;#039;&amp;#039;&amp;#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;
*** &amp;#039;&amp;#039;&amp;#039;Для&amp;#039;&amp;#039;&amp;#039; каждого муравья &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; &amp;#039;&amp;#039;&amp;#039;от&amp;#039;&amp;#039;&amp;#039; 1 &amp;#039;&amp;#039;&amp;#039;до&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
**** &amp;#039;&amp;#039;&amp;#039;Если&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Вывод&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Верхний уровень&amp;#039;&amp;#039;&amp;#039;: Итерационный процесс. Каждая итерация зависит от результатов предыдущей через глобальную матрицу феромонов.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Внутри итерации&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Уровень муравьёв&amp;#039;&amp;#039;&amp;#039;: Процессы построения путей каждым муравьём являются независимыми (в пределах одной итерации) и могут выполняться параллельно. Они читают общую матрицу феромонов &amp;lt;math&amp;gt; \tau_{ij} &amp;lt;/math&amp;gt;, но не записывают в неё.&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Уровень шагов муравья&amp;#039;&amp;#039;&amp;#039;: Для каждого муравья построение пути — последовательный процесс. Выбор следующей вершины на шаге &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; зависит от текущего частичного пути (множества посещённых вершин) и матрицы феромонов.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Синхронизация&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Массовый параллелизм&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Скошенный параллелизм&amp;#039;&amp;#039;&amp;#039;: Внутри процесса построения пути одним муравьём параллелизм отсутствует, так как шаги строго последовательны.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Глобальное обновление феромона&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Входные данные&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Объем входных данных&amp;#039;&amp;#039;&amp;#039;: Доминирующий объём — матрица расстояний, &amp;lt;math&amp;gt; n^2 &amp;lt;/math&amp;gt; элементов. Параметры — константное число скаляров.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Выходные данные&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Объем выходных данных&amp;#039;&amp;#039;&amp;#039;: &amp;lt;math&amp;gt; n + 1 &amp;lt;/math&amp;gt; элемент.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Соотношение последовательной и параллельной сложности&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Вычислительная мощность&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Устойчивость&amp;#039;&amp;#039;&amp;#039;: Алгоритм стохастичен и не гарантирует нахождения глобального оптимума &amp;lt;ref name=&amp;quot;Dorigo2004&amp;quot;/&amp;gt;. Результаты могут незначительно меняться от запуска к запуску из-за случайного выбора. Устойчивость к малым изменениям в входных данных зависит от конкретной задачи и параметров.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Сбалансированность&amp;#039;&amp;#039;&amp;#039;: На этапе построения путей нагрузка между муравьями сбалансирована, так как каждый строит путь одинаковой длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;. Однако, время выбора вершин может незначительно варьироваться из-за стохастичности. Этап обновления феромона хорошо сбалансирован при параллелизации по рёбрам.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Детерминированность&amp;#039;&amp;#039;&amp;#039;: Алгоритм является недетерминированным ввиду вероятностного характера построения пути &amp;lt;ref name=&amp;quot;Blum2005&amp;quot;/&amp;gt;. Разные запуски с одним и тем же начальным состоянием могут давать разные результаты.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Степень исхода вершин информационного графа&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** Матрица феромонов имеет высокую степень исхода — её данные используются всеми муравьями на каждом шаге построения пути.&lt;br /&gt;
** Данные о лучшем пути имеют низкую степень исхода (используются только для вывода).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;quot;Длинные&amp;quot; дуги&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Распараллеливание по муравьям (Data Parallelism)&amp;#039;&amp;#039;&amp;#039;: Наиболее естественный способ &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;. Каждому потоку/процессу назначается подмножество муравьёв. После построения путей требуется глобальная редукция для обновления лучшего пути и матрицы феромонов. Хорошо подходит для OpenMP (на многоядерных CPU) и CUDA/OpenCL (на GPU). Необходимо обеспечить атомарность при обновлении лучшего решения.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Распараллеливание по графу (Task Parallelism)&amp;#039;&amp;#039;&amp;#039;: При очень больших графах можно распределить вершины или рёбра между процессами. Это более сложно из-за необходимости коммуникации при построении пути муравьём, который &amp;quot;переходит&amp;quot; между разными частями графа. Может быть эффективно для распределённых систем с помощью MPI.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Гибридные подходы&amp;#039;&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Многоядерные CPU (OpenMP)&amp;#039;&amp;#039;&amp;#039;: Алгоритм хорошо масштабируется с числом муравьёв &amp;lt;ref name=&amp;quot;Randall2002&amp;quot;/&amp;gt;. Критическим местом является этап обновления феромона, который может стать узким местом из-за необходимости синхронизации доступа к общей памяти. Рекомендуется использовать локальные копии матрицы феромонов для каждого потока с последующей редукцией.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;GPU (CUDA/OpenCL)&amp;#039;&amp;#039;&amp;#039;: Идеальная платформа благодаря массовому параллелизму на уровне муравьёв. Каждый муравей может быть представлен как отдельный поток. Необходимо тщательно управлять доступом к глобальной памяти (матрица феромонов) для избежания конфликтов. Использование разделяемой памяти и кандидатских списков может значительно повысить производительность.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Кластеры (MPI)&amp;#039;&amp;#039;&amp;#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). &amp;#039;&amp;#039;Ant System: Optimization by a colony of cooperating agents&amp;#039;&amp;#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). &amp;#039;&amp;#039;Ant Colony Optimization&amp;#039;&amp;#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). &amp;#039;&amp;#039;Ant colony optimization: Introduction and recent trends&amp;#039;&amp;#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). &amp;#039;&amp;#039;A Concise Overview of Applications of Ant Colony Optimization&amp;#039;&amp;#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). &amp;#039;&amp;#039;A parallel implementation of ant colony optimization&amp;#039;&amp;#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). &amp;#039;&amp;#039;A survey on parallel ant colony optimization&amp;#039;&amp;#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>