<?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=AlexeyP</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=AlexeyP"/>
	<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/AlexeyP"/>
	<updated>2026-10-22T21:24:06Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29714</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29714"/>
		<updated>2024-12-11T20:39:48Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Вычисление минимума по числу уникальных площадок среди всех игроков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, где G - число поколений, S - размер популяции, T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, где S - размер популяции, N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:GeneticInformationGraph.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * T)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
* Каждое существо может мутировать независимо,&lt;br /&gt;
* В каждом туре мутации могут проходить независимо&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * T)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;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;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29713</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29713"/>
		<updated>2024-12-11T20:37:55Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, где G - число поколений, S - размер популяции, T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, где S - размер популяции, N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:GeneticInformationGraph.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * T)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
* Каждое существо может мутировать независимо,&lt;br /&gt;
* В каждом туре мутации могут проходить независимо&lt;br /&gt;
&lt;br /&gt;
Следовательно ресурс параллелизма &amp;lt;math&amp;gt;O(S * T)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;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;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29712</id>
		<title>Файл:GeneticInformationGraph.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29712"/>
		<updated>2024-12-11T20:33:09Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: AlexeyP загрузил новую версию Файл:GeneticInformationGraph.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29711</id>
		<title>Файл:GeneticInformationGraph.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29711"/>
		<updated>2024-12-11T20:31:46Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: AlexeyP загрузил новую версию Файл:GeneticInformationGraph.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29710</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29710"/>
		<updated>2024-12-11T20:22:16Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, где G - число поколений, S - размер популяции, T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, где S - размер популяции, N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:GeneticInformationGraph.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
Все значения - обычные числа&lt;br /&gt;
&lt;br /&gt;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29709</id>
		<title>Файл:GeneticInformationGraph.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29709"/>
		<updated>2024-12-11T20:21:54Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: AlexeyP загрузил новую версию Файл:GeneticInformationGraph.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29708</id>
		<title>Файл:GeneticInformationGraph.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticInformationGraph.jpg&amp;diff=29708"/>
		<updated>2024-12-11T20:08:28Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29707</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29707"/>
		<updated>2024-12-11T19:14:59Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, где G - число поколений, S - размер популяции, T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, где S - размер популяции, N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
Все значения - обычные числа&lt;br /&gt;
&lt;br /&gt;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29706</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29706"/>
		<updated>2024-12-11T19:14:12Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Вычисление минимума по числу уникальных площадок среди всех игроков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, где S - размер популяции, T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
Все значения - обычные числа&lt;br /&gt;
&lt;br /&gt;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29705</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29705"/>
		<updated>2024-12-11T19:13:09Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
Все значения - обычные числа&lt;br /&gt;
&lt;br /&gt;
* Размер популяции (S)&lt;br /&gt;
* Максимальное число поколений (G)&lt;br /&gt;
&lt;br /&gt;
* Число существ в турнире отбора (N)&lt;br /&gt;
* Вероятность скрещивания существ (C)&lt;br /&gt;
* Вероятность мутации гена существа (M)&lt;br /&gt;
&lt;br /&gt;
* Число туров (T)&lt;br /&gt;
* Число игроков (P)&lt;br /&gt;
* Число площадок (Pg)&lt;br /&gt;
&lt;br /&gt;
==== Выходные данные ====&lt;br /&gt;
&lt;br /&gt;
* Популяция существ — трёхмерный массив размерами &amp;lt;math&amp;gt;S * T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
* Метрики существ — двумерный массив размерами &amp;lt;math&amp;gt;S * 2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, 2, т.к. приспособленность вычисляется из пары значений минимального числа оппонетов и минимального числа площадок для любого участника турнира&lt;br /&gt;
* Лучшее существо в популяции (Лучшая получившаяся таблица турнира) — двумерный массив размерами &amp;lt;math&amp;gt;T * P&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29704</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29704"/>
		<updated>2024-12-11T18:59:32Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&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;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Вычисление минимума по числу уникальных площадок среди всех игроков ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&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;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29694</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29694"/>
		<updated>2024-12-10T17:59:13Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&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;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29693</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29693"/>
		<updated>2024-12-10T17:58:11Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: /* Существующие реализации генетического алгоритма для решения задач расписаний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&lt;br /&gt;
В данном алгоритме можно менять реализации его ключевых этапов (подсчёт приспособленности, отбор, скрещивание, мутации), что позволяет оптимизировать выполнение для конкретных архитектур компьютеров&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации генетического алгоритма для решения задач расписаний ===&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29692</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29692"/>
		<updated>2024-12-10T17:57:25Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: 1.7&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
[[Файл:Init.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Используя текущую популяцию создаётся таблица приспособленности для каждого вида&lt;br /&gt;
&lt;br /&gt;
[[Файл:Fitness.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существа отбираются в турнир случайным образом из текущей популяции. Используя  таблицу приспособленности существа отбираются в следующую популяцию&lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Из текущей популяции отбираются существа, у них обмениваются гены, новые существа заменяют предыдущие в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Crossover.jpg|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
В каждом существе текущей популяции происходит обмен генов. Новое существо заменяет предыдущее в популяции&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mutation.jpg|обрамить|центр]]&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;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&lt;br /&gt;
В данном алгоритме можно менять реализации его ключевых этапов (подсчёт приспособленности, отбор, скрещивание, мутации), что позволяет оптимизировать выполнение для конкретных архитектур компьютеров&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации генетического алгоритма для решения задач расписаний ==&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Mutation.jpg&amp;diff=29691</id>
		<title>Файл:Mutation.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Mutation.jpg&amp;diff=29691"/>
		<updated>2024-12-10T17:51:47Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: AlexeyP загрузил новую версию Файл:Mutation.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мутации существ&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Mutation.jpg&amp;diff=29690</id>
		<title>Файл:Mutation.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Mutation.jpg&amp;diff=29690"/>
		<updated>2024-12-10T17:47:20Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мутации существ&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Crossover.jpg&amp;diff=29689</id>
		<title>Файл:Crossover.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Crossover.jpg&amp;diff=29689"/>
		<updated>2024-12-10T17:46:40Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Скрещивание существ&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection.jpg&amp;diff=29688</id>
		<title>Файл:Selection.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection.jpg&amp;diff=29688"/>
		<updated>2024-12-10T17:44:57Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Отбор существ&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fitness.jpg&amp;diff=29687</id>
		<title>Файл:Fitness.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fitness.jpg&amp;diff=29687"/>
		<updated>2024-12-10T17:43:31Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Подсчёт приспособленности существ&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Init.jpg&amp;diff=29686</id>
		<title>Файл:Init.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Init.jpg&amp;diff=29686"/>
		<updated>2024-12-10T17:39:31Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Инициализация популяции&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29685</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29685"/>
		<updated>2024-12-10T17:07:39Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: 2.7&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
&lt;br /&gt;
==== Инициализации популяции ====&lt;br /&gt;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&lt;br /&gt;
В данном алгоритме можно менять реализации его ключевых этапов (подсчёт приспособленности, отбор, скрещивание, мутации), что позволяет оптимизировать выполнение для конкретных архитектур компьютеров&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации генетического алгоритма для решения задач расписаний ==&lt;br /&gt;
&lt;br /&gt;
Составление расписания спортивных тренировок&lt;br /&gt;
с помощью генетических алгоритмов&amp;lt;ref&amp;gt;https://journals.indexcopernicus.com/api/file/viewByFileId/652667.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование генетических алгоритмов для генерации&lt;br /&gt;
конечных автоматов&amp;lt;ref&amp;gt;https://is.ifmo.ru/disser/lobanov_disser.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм составления расписания выполнения параллельных заданий в распределённой вычислительной системе&amp;lt;ref&amp;gt;https://cyberleninka.ru/article/n/geneticheskiy-algoritm-sostavleniya-raspisaniya-vypolneniya-parallelnyh-zadaniy-v-raspredelennoy-vychislitelnoy-sisteme/viewer&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29684</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29684"/>
		<updated>2024-12-10T16:16:09Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: Добавлены пункты 1.8, 1.9, 2.4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — размер популяции, где &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — число туров, &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — число игроков&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ участвующих в турнире отбора&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
&lt;br /&gt;
==== Инициализации популяции ====&lt;br /&gt;
&lt;br /&gt;
* Каждое из существ может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур может инициализироваться независимо от других&lt;br /&gt;
* Каждый тур необходимо заполнять парами номеров площадок, которые необходимо предварительно сгенерировать&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
* Приспособленности каждого из существ можно считать независимо от других&lt;br /&gt;
* Метрики каждого игрока можно считать независимо от других игроков&lt;br /&gt;
&lt;br /&gt;
Необходимо найти минимальное значение из полученных метрик игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
* Отбирать существ можно независимо&lt;br /&gt;
&lt;br /&gt;
В рамках турнира необходимы последовательные сравнения&lt;br /&gt;
&lt;br /&gt;
После отбора необходимо обновить популяцию с учётом отобранных существ&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
* Можно независимо скрещивать каждую пару существ&lt;br /&gt;
* В самом скрещивании можно независимо обмениваться генетической информацией&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&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;
* Размер популяции&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;
* Число площадок&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;
&lt;br /&gt;
В данном алгоритме можно менять реализации его ключевых этапов (подсчёт приспособленности, отбор, скрещивание, мутации), что позволяет оптимизировать выполнение для конкретных архитектур компьютеров&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29683</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29683"/>
		<updated>2024-12-10T15:02:33Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: Добавлены пункты 1.3-1.6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name = Генетический алгоритм для решения задачи о составлении расписания&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро состоит из ключевых блоков генетического алгоритма&lt;br /&gt;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
Для вычисление приспособленности существ мы проходим по всех существа в популяции и считаем приспособленность каждого из них&lt;br /&gt;
&lt;br /&gt;
Вычисление приспособленности существа состоит из 2 этапов:&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных оппонентов среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам, для каждого тура по всем противникам данного игрока и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P^2)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
===== Вычисление минимума по числу уникальных площадок среди всех игроков =====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всем игрокам, для каждого игрока по всем турам и считаем число уникальных. Итого получаем, что сложность - &amp;lt;math&amp;gt;O(T * P)&amp;lt;/math&amp;gt;, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итого для получения приспособленности всех существ нам нужно &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
Существуют несколько вариантов отбора существ&amp;lt;ref&amp;gt;https://qai.narod.ru/GA/strategies.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например рассмотрим Турнирный отбор (Tournament selection)&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Tournament_selection&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для турнирного отбора мы проходимся по всей популяции, берём случайные N существ и среди них выбираем наиболее приспособленного, который перейдёт в следующую популяцию. Итого нам нужно &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции и скрещиваем существ, меняя часть туров одного из существ с соответствующими турами другого существа. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
Мы проходим по всей популяции, и для каждого существа в каждом туре меняем оппонентов. Итого получаем &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
Эти алгоритмы описаны в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]].&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции&lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1. Начальная инициализация популяции - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков &lt;br /&gt;
&lt;br /&gt;
2. Циклически рассчитываем заданное число поколений - &amp;lt;math&amp;gt;O(G * S * (T * P^2 + N))&amp;lt;/math&amp;gt;, G - число поколений, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.1 Подсчёт приспособленности существ - &amp;lt;math&amp;gt;O(S * T * P^2)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.2 Отбор существ - &amp;lt;math&amp;gt;O(S * N)&amp;lt;/math&amp;gt;, S - размер популяции, где N - число существ турнира&lt;br /&gt;
&lt;br /&gt;
2.3 Скрещивание существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&lt;br /&gt;
&lt;br /&gt;
2.4. Мутации получившихся существ - &amp;lt;math&amp;gt;O(S * T * P)&amp;lt;/math&amp;gt;, S - размер популяции, где T - число туров, P - число игроков&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;
&lt;br /&gt;
==== Вычисление приспособленности существ (fitness) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Отбор лучших существ (selection) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Скрещивание существ (crossover) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Мутации существ (mutation) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29616</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29616"/>
		<updated>2024-11-04T02:33:22Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формирование начальной популяции&#039;&#039;&#039;: Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисление приспособленности&#039;&#039;&#039;: Для каждого участника &amp;lt;math&amp;gt;i&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;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Операции мутации&#039;&#039;&#039;: В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Остановка&#039;&#039;&#039;: Алгоритм завершает работу, когда достигается заданное количество итераций или функция приспособленности не меняется в течение нескольких поколений.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;br /&gt;
[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29615</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29615"/>
		<updated>2024-11-04T02:32:05Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
Формирование начальной популяции:&lt;br /&gt;
&lt;br /&gt;
Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
Вычисление приспособленности:&lt;br /&gt;
&lt;br /&gt;
Для каждого участника &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; подсчитывается количество уникальных соперников и количество уникальных площадок, которые он посещает.&lt;br /&gt;
Приспособленность решения равна минимальному числу уникальных соперников среди всех участников. Если оно одинаковое для нескольких решений, используется минимальное количество уникальных площадок как дополнительный критерий.&lt;br /&gt;
&lt;br /&gt;
Операции скрещивания:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Операции мутации:&lt;br /&gt;
В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;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;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;br /&gt;
[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29614</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29614"/>
		<updated>2024-11-04T02:31:23Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
Формирование начальной популяции:&lt;br /&gt;
&lt;br /&gt;
Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
Вычисление приспособленности:&lt;br /&gt;
&lt;br /&gt;
Для каждого участника &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; подсчитывается количество уникальных соперников и количество уникальных площадок, которые он посещает.&lt;br /&gt;
Приспособленность решения равна минимальному числу уникальных соперников среди всех участников. Если оно одинаковое для нескольких решений, используется минимальное количество уникальных площадок как дополнительный критерий.&lt;br /&gt;
&lt;br /&gt;
Операции скрещивания:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
Операции мутации:&lt;br /&gt;
&lt;br /&gt;
В каждом дне турнира может произойти перемена мест двух номеров площадок &amp;lt;math&amp;gt;M_{i,k} = M_{j,k}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;M_{j,k} = M_{i,k}&amp;lt;/math&amp;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;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;br /&gt;
[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29613</id>
		<title>Участник:AlexeyP</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AlexeyP&amp;diff=29613"/>
		<updated>2024-11-04T02:24:22Z</updated>

		<summary type="html">&lt;p&gt;AlexeyP: Новая страница: «Основные авторы описания: А.С.Плотников  == Свойства и структура алгоритм...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:AlexeyP|А.С.Плотников]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Генетический алгоритм&#039;&#039;&#039; (ГА) — это стохастический метод оптимизации, который основывается на процессах естественного отбора и наследственности. Он применяется для решения задач комбинаторной оптимизации, таких как составление расписаний&amp;lt;ref&amp;gt;https://ru.wikipedia.org/w/index.php?title=Генетический_алгоритм&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача о составлении расписания турнира с N участниками, R турами и K площадками формулируется следующим образом: требуется создать расписание матчей, при котором участники играют с максимальным количеством различных соперников, посещают как можно больше площадок, а на каждой площадке в каждом туре проводится только один матч.&lt;br /&gt;
&lt;br /&gt;
Алгоритм строится на основе поиска множества возможных решений, представленных в виде матриц, где элемент матрицы указывает номер площадки, на которой участник играет в определенном туре. Лучшее расписание по критериям задачи выбирается на основе максимизации минимума количества уникальных соперников для каждого участника. Если минимальное количество соперников совпадает у нескольких расписаний, предпочтение отдается расписанию, где минимальное количество посещенных площадок выше.&lt;br /&gt;
&lt;br /&gt;
==== Представление решений ====&lt;br /&gt;
&lt;br /&gt;
Каждое решение представляется матрицей, где строки — это участники, столбцы — туры, а значения элементов — номера площадок. Таким образом, элемент матрицы &amp;lt;math&amp;gt;M_{i,j}&amp;lt;/math&amp;gt; обозначает номер площадки, на которой участник i проводит матч в туре j. Такая матрица дает полное описание расписания для данного решения.&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;
==== Генетические операции ====&lt;br /&gt;
&lt;br /&gt;
Для оптимизации расписания применяются следующие генетические операции:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация популяции&#039;&#039;&#039;: начальная популяция создается путем случайного генерирования расписаний, где соблюдаются ограничения задачи (один матч на площадке в каждом туре).&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Отбор&#039;&#039;&#039;: выбираются решения с наибольшей функцией приспособленности, так как они более вероятно содержат оптимальные признаки.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Скрещивание&#039;&#039;&#039;: создаются новые расписания (особи) путем комбинирования расписаний-родителей. В этой задаче можно использовать одноточечное или двухточечное скрещивание, где строки или столбцы одного расписания заменяются на аналогичные строки или столбцы другого.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Мутация&#039;&#039;&#039;: небольшие изменения в расписании, такие как изменение площадки для одной игры, вводятся для поддержания разнообразия популяции и предотвращения преждевременной сходимости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: &lt;br /&gt;
* N — количество участников, &lt;br /&gt;
* R — количество туров, &lt;br /&gt;
* K — количество площадок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Целевая функция&#039;&#039;&#039;: максимизация минимального числа уникальных соперников для каждого участника. Если минимальное количество соперников одинаковое, то учитывается минимальное количество посещенных площадок.&lt;br /&gt;
&lt;br /&gt;
Формирование начальной популяции:&lt;br /&gt;
&lt;br /&gt;
Случайно создается множество расписаний, каждое из которых соответствует матрице &lt;br /&gt;
&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt;N\times R&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M_{i,j}\in\{1,...,K\}&amp;lt;/math&amp;gt; &lt;br /&gt;
Вычисление приспособленности:&lt;br /&gt;
&lt;br /&gt;
Для каждого участника &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; подсчитывается количество уникальных соперников и количество уникальных площадок, которые он посещает.&lt;br /&gt;
Приспособленность решения равна минимальному числу уникальных соперников среди всех участников. Если оно одинаковое для нескольких решений, используется минимальное количество уникальных площадок как дополнительный критерий.&lt;br /&gt;
&lt;br /&gt;
Операции скрещивания:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt; — две матрицы-родителя. При одноточечном скрещивании выбирается случайный столбец &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и матрица потомка формируется путем объединения столбцов от &amp;lt;math&amp;gt;M_A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M_B&amp;lt;/math&amp;gt;​ до и после столбца &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
Операции мутации:&lt;br /&gt;
&lt;br /&gt;
Случайным образом выбирается элемент матрицы и заменяется на случайное значение из диапазона площадок &amp;lt;math&amp;gt;\{1,...,K\}&amp;lt;/math&amp;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;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;br /&gt;
[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>AlexeyP</name></author>
	</entry>
</feed>