Генетические алгоритмы в MATLAB

Суть генетических алгоритмов


Данный топик посвящен решению оптимизационных задач при помощи генетических алгоритмов в среде MATLAB. Заранее приношу извинения за большой объем данных: он обусловлен тем, что при написании топика основной поставленной задачей было подробно раскрыть каждый из настраиваемых в MATLAB параметров работы генетических алгоритмов.

Генетические алгоритмы – это метод решения оптимизационных задач, основанный на биологических принципах естественного отбора и эволюции. Генетический алгоритм повторяет определенное количество раз процедуру модификации популяции (набора отдельных решений), добиваясь тем самым получения новых наборов решений (новых популяций). При этом на каждом шаге из популяции выбираются «родительские особи», то есть решения, совместная модификация которых (скрещивание) и приводит к формированию новой особи в следующем поколении. Генетический алгоритм использует три вида правил, на основе которых формируется новое поколение: правила отбора, скрещивания и мутации. Мутация позволяет путем внесения изменений в новое поколение избежать попадания в локальные минимумы оптимизируемой функции.

(Под катом основная часть + несколько скриншотов).


Механизм работы с генетическими алгоритмами в среде MATLAB реализован двумя способами:

1. Вызов функции генетических алгоритмов
2. Использование комплекта Genetic Algorithm Tool

Оба способа поставляются в числе стандартного набора функций и модулей MATLAB. На мой взгляд, намного более удобным и наглядным является второй способ работы с генетическими алгоритмами в MATLAB, связанный с использованием модуля Genetic Algorithm Tool. Его и рассмотрим подробнее.

Работа с GENETIC ALGORITHM TOOL


Для запуска пакета Genetic Algorithm Tool следует в командной строке MATLAB выполнить команду gatool. После этого запустится пакет генетических алгоритмов и на экране появится основное окно утилиты.

Основное окно gatool

В поле Fitness function указывается оптимизируемая функция в виде @fitnessfun, где fitnessfun.m – название M-файла, в котором предварительно следует описать оптимизируемую функцию. На всякий случай отмечу, что M-файл создается в среде MATLAB через меню File->New->M-File. Пример описания некоторой функции my_fun в M-файле:

function z = my_fun(x)
z = x(1)^2 — 2*x(1)*x(2) + 6*x(1) + x(2)^2 — 6*x(2);

Вернемся к основному окну утилиты GATool. В поле Number of variables указывается длина входного вектора оптимизируемой функции. В рассмотренном выше примере функция my_fun имеет входной вектор длины 2.
В панели Constraints можно задать ограничения или ограничивающую нелинейную функцию. В поле Linear inequalities задается линейное ограничение неравенством вида:

A*x ≤ b.

В поле Linear equalities данной панели задаются линейные ограничения равенством:

A*x = b.

В обоих случаях A – некоторая матрица, b – вектор.

В поле Bounds в векторном виде задаются нижнее и верхнее ограничения переменных, а в поле Nonlinear constraint function можно задать произвольную нелинейную функцию ограничений.

Если в конкретной задаче не требуется задание ограничений, все поля панели Constraints следует оставить незаполненными.

Ниже находится панель настройки графиков. Она позволяет выводить различные графики, отображающие информацию о работе генетического алгоритма. На основе этой информации можно менять настройки алгоритма с целью повышения эффективности его работы. Например, выбор опции Best Fitness в этой панели позволяет вывести на одном графике лучшее и среднее значение оптимизируемой функции для каждого поколения работы алгоритма. Подробнее эта панель будет описана ниже наравне с остальными панелями вкладки Options утилиты GATool.

Панель Run Solver содержит управляющие элементы (кнопки Start, Pause и Stop для начала, временной и полной остановки работы генетического алгоритма). Также она содержит поля Status and results, в которое выводятся текущие результаты работы запущенного генетического алгоритма, и Final point, в котором выводится значение конечной точки работы алгоритма — наилучшей величины оптимизируемой функции (то есть, искомое значение).

В правой части основного окна утилиты GATool находится панель Options. Она позволяет устанавливать различные настройки для работы генетических алгоритмов. При щелчке мышью по кнопкам [+], которые находятся напротив названия каждого из настраиваемых параметров в панели Options, появляются выпадающие списки (вкладки), содержащие поля для ввода и изменения соответствующих параметров генетического алгоритма.

image

Основными настраиваемыми параметрами в GATool являются:
— популяция (вкладка Population);
— масштабирование (вкладка Fitness Scaling);
— оператор отбора (вкладка Selection);
— оператор репродукции (вкладка Reproduction);
— оператор мутации (вкладка Mutation);
— оператор скрещивание (вкладка Crossover);
— перенесение особей между популяциями (вкладка Migration);
— специальные параметры алгоритма (вкладка Algorithm settings);
— задание гибридной функции (вкладка Hybrid function);
— задание критерия остановки алгоритма (вкладка Stopping criteria);
— вывод различной дополнительной информации по ходу работы генетического алгоритма (вкладка Plot Functions);
— вывод результатов работы алгоритма в виде новой функции (вкладка Output function);
— задание набора информации для вывода в командное окно (вкладка Display to command window);
— способ вычисления значений оптимизированной и ограничивающей функций (вкладка User function evaluation).

Рассмотрим подробнее все вышеперечисленные вкладки панели Options и элементы, которые они содержат.

Во вкладке настройки популяций пользователь имеет возможность выбрать тип математических объектов, к которому будут относиться особи всех популяций (двойной вектор, битовая строка или пользовательский тип). При этом стоит учитывать, что использование битовой строки и пользовательских типов накладывают ограничения на перечень допустимых операторов создания, мутации и скрещивания особей. Так, например, при выборе в качестве формы представления особей битовой строки для оператора скрещивания нельзя использовать гибридную функцию или нелинейную ограничивающую функцию.
Также вкладка популяции позволяет настраивать размер популяции (из скольких особей будет состоять каждое поколение) и каким образом будет создаваться начальное поколение (Uniform – если отсутствуют накладываемые ограничения, в противном случае — Feasible population). Кроме того, в рассматриваемой вкладке имеется возможность задать вручную начальное поколение (используя пункт Initial population) или его часть, начальный рейтинг особей (пункт Initial scores), а также ввести ограничительный числовой диапазон, которому должны принадлежать особи начальной популяции (Initial range).

Во вкладке масштабирования (Fitness Scaling) пользователь имеет возможность указать функцию масштабирования, которая конвертирует достигаемые оптимизируемой функцией значения в значения, лежащие в пределах, допустимых для оператора отбора. При выборе в качестве функции масштабирования параметра Rank масштабирование будет приводиться к рейтингу, то есть особям присваивается рейтинговый номер (для лучшей особи – единица, для следующей – двойка, и так далее). Пропорциональное масштабирование (Proportional) задает вероятности пропорционально заданному числовому ряду для особей. При выборе опции Top наибольшее рейтинговое значение присваивается сразу нескольким наиболее выдающимся особям (их число указывается в виде параметра). Наконец, при выборе масштабирования типа Shift linear имеется возможность указать максимальную вероятность наилучшей особи.

Вкладка Selection позволяет выбрать оператор отбора родительских особей на основе данных из функции масштабирования. В качестве доступных для выбора вариантов оператора отбора предлагаются следующие:

— Tournament – случайно выбирается указанное число особей, среди них на конкурсной основе выбираются лучшие;
— Roulette – имитируется рулетка, в которой размер каждого сегмента устанавливается в соответствии с его вероятностью;
— Uniform – родители выбираются случайным образом согласно заданному распределению и с учетом количества родительских особей и их вероятностей;
— Stochastic uniform – строится линия, в которой каждому родителю ставится в соответствие её часть определенного размера (в зависимости от вероятности родителя), затем алгоритм пробегает пот линии шагами одинаковой длины и выбирает родителей в зависимости от того, на какую часть линии попал шаг.

Вкладка Reproduction уточняет каким образом происходит создание новых особей. Пункт Elite count позволяет указать число особей, которые гарантировано перейдут в следующее поколение. Пункт Crossover fraction указывает долю особей, которые создаются путем скрещивания. Остальная доля создается путем мутации.

Во вкладке оператора мутации выбирается тип оператора мутации. Доступны следующие варианты:

— Gaussian – добавляет небольшое случайное число (согласно распределению Гаусса) ко всем компонентам каждого вектора-особи;
— Uniform – выбираются случайным образом компоненты векторов и вместо них записываются случайные числа из допустимого диапазона;
— Adaptive feasible – генерирует набор направлений в зависимости от последних наиболее удачных и неудачных поколений и с учетом налагаемых ограничений продвигается вдоль всех направлений на разную длину;
— Custom – позволяет задать собственную функцию.

Вкладка Crossover позволяет выбрать тип оператора скрещивания (одноточечное, двухточечное, эвристическое, арифметическое или рассеянное (Scattered), при котором генерируется случайный двоичный вектор соответствия родителей). Также имеется возможность задания произвольной (custom) функции скрещивания.

Во вкладке Migration можно настраивать правила, согласно которым особи будут перемещаться между подпопуляциями в пределах одной популяции. Подпопуляции создаются, если в качестве размера популяции указан вектор, а не натуральное значение. В данной вкладке можно указать направление миграции (forward – в следующую подпопуляцию, both – в предыдущую и следующую), долю мигрирующих особей и частоту миграции (сколько поколений проходит между миграциями). Если создание подпопуляций не требуется, эту вкладку всегда стоит оставлять без изменений.

Вкладка специальных опций алгоритма позволяет настраивать параметры решения системы нелинейных ограничений, налагаемых на алгоритм. Значение параметра Initial penalty определяет начальное числовое значение критики алгоритма, Penalty factor используется как множитель этого значения в случаях, когда разработчика не устраивает точность оптимизации или при выходе за границы, определенные во вкладке ограничений. Как правило, эти опции детально настраиваются для решения задач высокой сложности.

Вкладка Hybrid function позволяет задать ещё одну функцию минимизации, которая будет использоваться после окончания работы алгоритма. В качестве возможных гибридных функций доступны следующие встроенные в саму среду MATLAB функции:
− none (не использовать гибридную функцию);
− fminsearch (поиск минимального из значений);
− patternsearch (поиск по образцу);
− fminunc (для неограниченного алгоритма);
− fmincon (для алгоритма с заданными ограничениями).

Во вкладке критерия остановки (Stopping criteria) указываются ситуации, при которых алгоритм совершает остановку. При этом, настраиваемыми являются следующие параметры:

— Generations – максимальное число поколений, после превышения которого произойдет остановка;
— Time limit – лимит времени на работу алгоритма;
— Fitness limit – если оптимизируемое значение меньше или равно данного лимита, то алгоритм остановится;
— Stall generations – количество мало отличающихся поколений, по прошествии которых алгоритм остановится;
— Stall time limit – то же, что и предыдущий параметр, но применимо к времени работы алгоритма;
— Function tolerance и Nonlinear constraint tolerance – минимальные значения изменений оптимизируемой и ограничивающей функций соответственно, при которых алгоритм продолжит работу.

Особый интерес представляет вкладка Plot Functions, которая позволяет выбирать различную информацию, которая выводится по ходу работы алгоритма и показывает как корректность его работы, так и конкретные достигаемые алгоритмом результаты. Наиболее важными и используемыми для отображения параметрами являются:

— Plot interval – число поколений, по прошествии которого происходит очередное обновление графиков;
— Best fitness – вывод наилучшего значения оптимизируемой функции для каждого поколения;
— Best individual – вывод наилучшего представителя поколения при наилучшем оптимизационном результате в каждом из поколений;
— Distance – вывод интервала между значениями особей в поколении;
— Expectation – выводит ряд вероятностей и соответствующие им особи поколений;
— Genealogy – вывод генеалогического дерева особей;
— Range – вывод наименьшего, наибольшего и среднего значений оптимизируемой функции для каждого поколения;
— Score diversity – вывести гистаграмму рейтинга в каждом поколении;
— Scores – вывод рейтинга каждой особи в поколении;
— Selection – вывод гистограммы родителей;
— Stopping – вывод информации о состоянии всех параметров, влияющих на критерии остановки;
— Custom – отображение на графике некоторой указанной пользователем функции.

Вкладка вывода результатов в виде новой функции (Output function) позволяет включить вывод истории работы алгоритма в отдельном окне с заданным интервалом поколений (флаг History to new window и поле Interval соответственно), а также позволяет задать и вывести произвольную выходную функцию, задаваемую в поле Custom function.

Вкладка User function evaluation описывает, в каком порядке происходит вычисление значений оптимизируемой и ограничивающей функций (отдельно, параллельно в одном вызове или одновременно).

Наконец, вкладка Display to command window позволяет настраивать информацию, которая отображается в основном командном окне MATLAB при работе алгоритма. Возможны следующие значения: Off — нет вывода в командное окно, Iterative — вывод информации о каждой итерации работающего алгоритма, Diagnose — вывод информации о каждой итерации и дополнительных сведениях о возможных ошибках и измененных ключевых параметрах алгоритма, Final – выводится только причина остановки и конечное значение.

P.S. При написании данного топика автор пользовался личным опытом и Help'ом среды MATLAB. В дальнейших статьях постараюсь раскрыть описанный выше механизм gatool на конкретных примерах, как классических (оптимизация линейной функции, задачи стрельбы и коммивояжера), так и некоторых специфических.

P.P.S. Спасибо за внимание тем кто прочитал до конца.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 19
  • +3
    Буду признателен за конструктивную критику, т.к. не хотелось бы допускать одинаковые ошибки (стилистические или фактические, если таковые имеются) при написании следующих топиков по ген. алгоритмам.
    • 0
      ээээ гдее????? я так надеялся увидеть скрины своих лаб из универа на эту тему и ни хрена =((
      обломали такую ностальгию
      • +3
        Приношу извинения за обломанную ностальгию.
        Я в конце статьи написал про вероятное дальнейшее поле деятельности: статьи с конкретными примерами различного уровня сложности и «вкусности». Планирую начать как раз с простейших примеров оптимизации несложных функций, вполне возможно там вы найдете что то похожее на лабы из универа.
        • НЛО прилетело и опубликовало эту надпись здесь
          • +1
            Это не курсовая и не диплом, если вы об этом. )
            Если честно, то это написанное мною пособие для обучения студентов 3 курса по одной из дисциплин (я сам студент, пока ещё, но взялся с этим помочь).
            Переработал и отдал на суд общественности, надеюсь ничего запретного в этих действиях нету.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Понял теперь)
                Ну да, учат делать многие вещи шаблонно, я уже привык)
                может оно и неплохо в данном случае)
        • –3
          Никогда не любил все эти ГУЙ-и. Даешь нормальные скрипты :)
          • 0
            Ваше право, мне лично нравится поизвращаться такими штуками)
          • 0
            Очень интересно, правда, не понял принцип работы Stochastic uniform отбора.
            • 0
              Спасибо. )
              По поводу отбора Stochastic uniform: выбирается некоторый масштаб, в нем откладываются отрезки, соответствующие кандидатам в родительские особи (размер отрезка зависит от выбранного масштаба и вероятности выпадения каждой из особи). После все отрезки укладываются в одну линию. Наконец выбираем размер отрезка-шага (на сколько мы будем продвигаться вдоль линии за 1 шаг) и делаем нужное количество шагов вдоль нее. При попадании «шага» на тот или иной отрезок, соответствующий ему родитель считается выбранным. Набираем нужное количество родителей и вуаля.
              • 0
                Roulet wheel algorithm
                • 0
                  «Roulette – имитируется рулетка, в которой размер каждого сегмента устанавливается в соответствии с его вероятностью;»

                  Вы вероятно про этот способ отбора говорите. Они немного отличаются.
                  • 0
                    Я на то и намекнул. Мне показалось, что суть одна и та же. Очень похоже.
                    • 0
                      Да, отличий немного, я с вами согласен. В рулетке фактор случайности выбора несколько более значимую роль играет, а геометрически мне кажется не принципиально отлично: линия или круговая система.
                • 0
                  Примерно понял, спасибо. Какой-то лихо закрученный алгоритм, но надо будет при случае попробовать :)
                  • 0
                    Подобного плана частенько встречаются, различий как по мне так немного. Например между рулеткой и Stochastic uniform. При решении простых задач вообще особой разницы не замечаю, возможно проявится на более сложных и интересных задачах.
              • 0
                Товарищ! Где Вы были раньше когда я писал курсовик по этой теме?!=(((
                Спасибо, интересно.
                • 0
                  Спасибо Вам за интерес.
                  Давно хотел попробовать опубликоваться на Хабре, чет руки не доходили просто. Ну может для следующего курсача или диплома Вам понадобится)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.