Генетический алгоритм в Matlab: учебное пособие. Маслов А.А. СПб.: Балтийский государственный технический университет, 2014 г. 140 с. ISBN 978-5-85546-816-8
Введение
1. Начало работы с генетическим алгоритмом
1.2. Написание М-файлов для оптимизируемых функций
1.3. Выполнение оптимизации с помощью генетического алгоритма
2. Нахождение минимума функции Растригина
2.2. Нахождение минимума с использованием графического интерфейса
2.3. Нахождение минимума из командной строки
2.4. Отображение графиков
3. Терминология генетического алгоритма
4. Как работает генетический алгоритм
5. Использование генетического алгоритма с помощью графического интерфейса
6. Использование генетического алгоритма из командной строки
7. Улучшение результатов
8. Ограниченная минимизация при помощи GA
9. Решение смешанной целочисленной проблемы инженерного проектирования с использованием генетического алгоритма
9.2. Решение смешанной целочисленной проблемы оптимизации
10. Многоцелевая оптимизация
11. Параметры генетического алгоритма
12. Сводная характеристика функций генетического алгоритма
Оглавление
Text
                    Министерство образования и науки Российской Федерации
Балтийский государственный технический университет «Военмех»
АЛ. МАСЛОВ
ГЕНЕТИЧЕСКИЙ
АЛГОРИТМ
В MATLAB
Учебное пособие
Санкт-Петербург
2014


ВВЕДЕНИЕ Генетические алгоритмы появились в результате копиро- вания естественных процессов, происходящих в природе. Эволюция и связанный с ней процесс естественного отбора приводят к тому, что выживают наиболее приспособленные экземпляры. Генетические алгоритмы моделируют эволюци- онные процессы в хромосомах. Реализованы механизмы се- лекции, репродукции и наследования, аналогичные природ- ным. Проводится поиск «хороших» хромосом, с оценкой ка- ждой хромосомы, характеризующей её приспособленность (пригодность). Селекция заключается в выборе наиболее пригодных хромосом для участия в репродукции - создании новых хромосом, формирующих поколение потомков. В этом процессе задействованы две операции: скрещивание и мутация. Генетические алгоритмы применяются в системах искус- ственного интеллекта, в искусственных нейронных сетях и других предметных областях и отличаются от традиционных методов оптимизации: • обрабатывается закодированная форма параметров задачи, а не их численные значения; • поиск решения начинается не из единственной на- чальной точки, а из множества точек, называемых начальной популяцией; • используется только значение целевой функции (функции пригодности), а не её производные; • применяются вероятностные, а не детерминирован- ные правила выбора. 3
1. НАЧАЛО РАБОТЫ С ГЕНЕТИЧЕСКИМ АЛГОРИТМОМ 1.1. Что такое генетический алгоритм Генетический алгоритм - метод оптимизации с ограни- чениями и без ограничений, основанный на естественном от- боре - процессе, который управляет биологическим развити- ем. Генетический алгоритм неоднократно изменяет множест- во отдельных решений, называемое популяцией. На каждом шаге он наугад выбирает особей из текущей популяции, ко- торые станут родителями, и использует их, чтобы произвести дочерние элементы для следующего поколения. Последова- тельные поколения популяции "развиваются" к оптимально- му решению. Можно применить генетический алгоритм для решения множества проблем оптимизации, к которым не подходят стандартные алгоритмы, включая случаи когда целевая функция прерывиста, недифференцируема, стохастическая или очень нелинейная. Генетический алгоритм использует три основных типа правил на каждом шаге, чтобы создать следующее поколение из текущей популяции: 1) правила отбора для выбора особей, названных родите- лями, которые создают популяцию в следующем поколении; 2) правила скрещивания для комбинирования двух роди- телей, чтобы сформировать дочерние элементы для следую- щего поколения; 3) правила мутации, которые производят случайные изме- нения у отдельных родителей, чтобы сформировать дочерние элементы. 1.2. Написание М-файлов для оптимизируемых функций 4
Вычисление целевых функций. Чтобы использовать ге- нетический алгоритм, сначала нужно написать М-файл (или, иначе, анонимную функцию), вычисляющий функцию, кото- рую требуется оптимизировать. М-файл должен принимать на вход вектор, длина которого равна числу независимых пе- ременных целевой функции, и возвращать скаляр. Следующий пример показывает, как записать М-файл для функции, которую требуется оптимизировать. Предпо- ложим, что требуется минимизировать функцию: 2 2 f(xuxi) = х\ ~ 2ххх2 + 6хх + х2 - 6х2. М-файл, который вычисляет эту функцию, должен при- нять вектор х длиной 2, соответствующий переменным х\, х2, и возвратить скаляр, равный значению функции в х. Чтобы записать М-файл, нужно сделать следующие шаги: 1. Выбрать New из меню Matlab File. 2. Выбрать M-File. В результате открывается new M-File в редакторе. 3. В M-File, ввести следующие две строки кода: function z = myfun (х) z=x(l)A2-2*x(l)*x(2)+6*x(l)+x(2)A2-6*x(2); 4. Сохранить M-File в доступном для Matlab каталоге. Чтобы проверить, что М-файл возвращает корректное значение, ввести: my_fun([2 3]) ans = -5 Максимизация и минимизация. Генетический алгоритм минимизирует целевую функцию, называемую функцией пригодности, т.е. решается проблема в форме min^ f(x). Если требуется максимизировать Дх), то это можно сде- лать, минимизируя -Дх), потому что точка, в которой достига- ется минимум -fix), совпадает с точкой, в которой имеется максимум fix). 5
Например, предположим, что требуется максимизиро- вать функцию 9 9 f{xx,x2) = хх -2ххх2 + 6*! + х2 -6х2 описанную в предыдущем разделе. В этом случае нужно на- писать свой М-файл для вычисления: 9 9 g(xx,x2) = -f(xl9x2) = -хх + 2ххх2 - 6х{ -х2 + 6х2 и минимизировать g(x). 1.3. Выполнение оптимизации с помощью генетического алгоритма Использование функции ga из командной строки. Что- бы использовать генетический алгоритм из командной стро- ки, вызывается функция ga с синтаксисом: [х fval] = ga (@fitnessfun, nvars, options), где @fitnessfun - указатель на функцию пригодности; nvars - число независимых переменных для функции пригодности; options - структура, содержащая параметры генетического алгоритма. Если не указывать этот аргумент, то ga использу- ет свои параметры по умолчанию. Выходными параметрами являются: х - точка, в которой достигнуто окончательное значение; fval - окончательное значение функции пригодности. Использование функции ga удобно, если нужно возвра- тить результаты непосредственно в рабочее пространство Matlab; управлять генетическим алгоритмом многократно с различными вариантами, вызывая ga из М-файла. Использование инструмента оптимизации. Чтобы от- крыть Optimization Tool {Инструмент Оптимизации), нужно ввести optimtool ('ga') в командной строке, или ввести optim- tool и затем указать ga в выпадающем списке строки Solver (решатель) на появившейся панели (рис. 1.1). Можно также запустить инструмент из меню Matlab Start, как изображено на рис. 1.2. Чтобы использовать Инструмент Оптимизации, нужно сначала ввести следующую информацию: 6
• функция npuaodHocmu(Fitness function) - целевая функ- ция, которую требуется минимизировать. Функция пригод- ности вводится в форме @fitnessfun, где fitnessfun.m М-файл, который вычисляет функцию пригодности. Знак @ создает указатель на функцию fltnessfun. • число переменных(ИитЬег of variables) - длина векто- ра, подаваемого на вход функции пригодности. Для функции myjun, описанной выше, нужно ввести значение 2. Можно ввести ограничения или нелинейную функцию ограничения для проблемы в панели Constraints (Ограниче- ния). Если проблема не имеет ограничений, то нужно оста- вить поля пустыми. Чтобы запустить генетический алгоритм, нужно щелк- нуть кнопкой Start. Инструмент показывает результаты оп- тимизации в панели Run solver and view results. Можно изменить параметры генетического алгоритма в панели Options. Чтобы рассмотреть параметры в одной из категорий, перечисленных на панели, нужно щелкнуть знак + рядом с ней. 7
ffWHWnPI File Help ■ lalxi Problem Setup and Results Quick Reference Solver: ga - Genetic Algorithm -Ц Pun solver and мел- results Problem Fitness function: Number of variables: Constraints: Linear inequalities Linear equalities Bounds Г" Г" Д:Г Ь:Г Aeq: |~~ beq: |~" Lower: | Upper: | Nonlinear constraint function Г~ Use random states from previous run Start I Pause Current iteration: | Clear Results | -►J Population type: Population size; Creation function | Double Vector (f Use default: 20 Г Specify: |~~ 1 Use constraint dependent default H J Inital population: + Use default: [] С Specify: Inital scores: <• Use default: [] Г Specify: Inital range: <* Use default: [0;1] Г Specify: |~~ В Fitness scaling Scaling function: I Rank Selection function: Stochastic uniform В Reproduction Elite count: (? Use default: 2 С Specify: Crossover fraction: (* Use default: 0.8 Г Specify: |~~ B Mutation ~3 —J Mutation function: Use constraint dependent default »l Genetic Algorithm Solver This tool corresponds to the ga function. Click to expand the section below corresponding to your task. Problem Setup and Results Problem ► Constraints ► Run solver Options Specify options for the Gene-ic Algorithm solver_ Population ► Fitness scaling ► Selection Reproduction ► Mutation ► Crossover Migration Algorithm settings Hybrid function ► Stopping criteria Plot Functions Output function Display to command window Vectorize More Information Рис. 1.1 8
ф Model-Based Calibration Neural Network фоРС ф Signal Processing ф Spline ф Statistics ф, Symbolic Math ф, System Identification ф MATLAB ► 4# Virtual Reality Q ф Wavelet Щ Simulink t\ Щ Blocksets ► Щ Shortcuts ► Ij'jJ Desktop Tools ► @ Web ► I Щ$ Preferences... £f] Find Files,.. 0 Help -§- Demos I | 4< Start Рис. 1.2 2. НАХОЖДЕНИЕ МИНИМУМА ФУНКЦИИ РАСТРИ- ГИНА 2.1. Функция Растригина Рассмотрим пример, который показывает, как найти ми- нимум функции PacmpuauHa(Rastrigin's Function), которая часто используется, чтобы проверить генетический алгоритм. Для двух независимых переменных функция Растригина определена как Ras(x) = 20 + х\ + х\ -\§{о,оъ2т!хх + cos27uc2) . Ф 9
Программное обеспечение генетического алгоритма со- держит М-файл, rastriginsfcn.m, который вычисляет значение функции Растригина. На рис. 2.1 приведён график функции Растригина. Global ninn ил 4(00] Рис. 2.1 Как явствует из рисунка, у функции Растригина есть "долина" с множеством локальных минимумов, однако всего один глобальный минимум, который наблюдается в точке [О 0] в плоскости х-у и обозначен вертикальной линией, где значение функции равно 0. В любом локальном минимуме, кроме [0 0], значение функции Растригина больше нуля. Чем дальше локальный минимум от начала координат, тем боль- ше его значение. Функция Растригина часто используется, чтобы протес- тировать генетический алгоритм, потому что множество ло- ю
кальных минимумов мешает стандартным, основанным на градиенте методам найти глобальный минимум. Чередование максимумов и минимумов показано на рис. 2.2. Local тех in Local minima Global minimum at[0 0] Рис. 2.2 2.2. Нахождение минимума с использованием графического интерфейса Поскольку генетический алгоритм использует генерато- ры случайных чисел, то при каждом выполнении он возвра- щает немного различающиеся результаты. Чтобы найти минимум, сделайте следующие шаги 1. Введите optimtool ('ga') в командной строке, чтобы от- крыть Optimization Tools. 2. Введите следующие параметры в панели Optimization Tools: • в поле Fitness function введите @rastriginsfcn\ 11
• в поле Number of variables введите 2 - число независи- мых переменных для функции Растригина. Fitness function и Number of variables должны выглядеть так, как показано на рис. 2.3. Fitness function: |@rastriginsfcn Number of variables: \2 Рис. 2.3 3. Нажмите кнопку Start на панели Run solver and view re- sults (рис. 2.4). I Rlin ^nlvRr ЯПН VJR'Al re^i ilrs— Г" Use randcm states from previous run Start Lurrent iteration: Г Llear Kesults Рис. 2.4 Во время работы алгоритма в поле Current iteration {Те- кущая итерация) выводится номер текущей популяции. Можно временно приостановить алгоритм, нажимая кнопку Pause. Если это сделать, то имя кнопки изменится на Resume(TIpodonoicumb). Для продолжения с точки паузы на- жмите Resume. Когда алгоритм закончен, появившаяся панель Run solver and view results выглядит так, как на рис. 2.5. 12
Current iteration: |3J Clear Results (Optimisation running. (Optimization terminated. [objective function value: 0.0495102£72552739с lOptimizatioD terminated: averacfe chancre in the fitness value less than options.TolFun. -*▼ ll L. Ь | О.ООз] 0.015 Рис. 2.5 Выводится следующая информация: • окончательное значение функции пригодности на мо- мент завершения: 0.04951026725527896 Обратите внимание на то, что показанное значение очень близко к фактическому минимальному значению функции Растригина, которое равно нулю; • причина завершения алгоритма: среднее изменение пригодности меньше, чем Options. TolFun. • конечная точка, которой в этом примере является точка [0.003 0.015]. 2.3. Нахождение минимума из командной строки Чтобы найти минимум функции Растригина из команд- ной строки,введите: [х fval exitflag] = ga (@rastriginsfcn, 2) 13
В результате появится следующее сообщение: Optimization terminated: average change in the fitness value less than options.TolFun. x = 0.0229 0.0106 fval = 0.1258 exitflag = 1, где x - конечная точка, возвращенная алгоритмом; fval - значение функции пригодности в конечной точке; exitflag - целочисленное значение, соответствующее причине завер- шения алгоритма. 2.4. Отображение графиков Панель Plot functions позволяет вывести на экран раз- личные графики, которые обеспечивают информацию о гене- тическом алгоритме во время его работы. Эта информация может помочь изменять параметры для улучшения произво- дительности алгоритма. Чтобы изобразить лучшие и средние значения функции пригодности в каждом поколении, нужно отметить указатель рядом с Best fitness (рис. 2.6). Рис. 2.6 14
Когда нажимается кнопка Start, инструмент оптимизации выводит на экран график лучшего и среднего значений функции пригодности в каждом поколении. После заверше- ния алгоритма появляется график, приведенный на рис. 2.7. Рис. 2.7 Точки у основания графика обозначают лучшие значения пригодности, в то время как точки, расположенные выше, обозначают средние величины значений пригодности в каж- дом поколении. График также выводит на экран лучшее и среднее значения в текущем поколении в цифровой форме наверху. Получить более подробное изображение того, насколько уменьшаются лучшие значения пригодности, можно, изме- нив масштаб оси у в графике на логарифмический. Для этого следует: 1. Выбрать Axes Properties (Свойства осей) из меню Edit в окне графика, чтобы открыть Редактор свойств, связан- ный с окном графика (рис. 2.8). 15
Title: Colors: Grid: JlJi best: 0.14243 Meat ^1 hi I и a»^ — \ Г x Г y Г z Г Box X Axis Y Axis | Z Axis ] Font ] Y Limits: |o.1 to |100 P ftttoi Y Scale: | Log _^J Г" Reverse Щ Inspector... Рис. 2.8 2. Выбрать вкладку YAxis. 3. В параметре Y Scale выбрать Log. Появляющийся график выглядит так, как показано на рис. 2.9. ir Best: 0.0067796 Mean: 0.01478В i:-- ID"3 stop J ,0 20 30 40 50 60 generation 70 80 90 100 Рис. 2.9 Как правило, значение лучшей пригодности изменяется быстро в ранних поколениях, когда особи наиболее далеки от оптимума, и значительно медленнее в более поздних поко- лениях, особи которых ближе к оптимальной точке. 3. ТЕРМИНОЛОГИЯ ГЕНЕТИЧЕСКОГО АЛГОРИТМА 16
Функция пригодности. Функция пригодности {Fitness Function) - функция, которую нужно оптимизировать. Для стандартных алгоритмов оптимизации она известна как целе- вая функция. Алгоритм пытается найти минимум функции пригодности. Можно написать функцию пригодности как М-файл и передать указатель на эту функцию как аргумент для функ- ции генетического алгоритма. Особи. Особь {individual) - любая точка, к которой мож- но применить функцию пригодности. Значение функции пригодности для особи является её оценкой. Например, если функция пригодности f(xl9x2,x3) = {2хх +1)2 + (Зх2 + 4)2 + {х3 - 2)2 , то вектор (2,-3, 1), длина которого равна числу переменных в проблеме, является особью. Оценка этой особи (2, -3, 1) равна /(2,-3,1) = 51. Особь иногда упоминается как геном или векторная за- пись, а элементы векторной записи особи - как гены. Популяция и поколения. Популяция {population) - мно- жество особей. Например, если размер популяции 100 и чис- ло переменных в функции пригодности равняется 3, популя- ция представлена матрицей 100х 3. Одна особь может поя- виться не один раз в популяции. Например, особь (2,-3,1) может появиться больше чем в одной строке матрицы. При каждом повторении генетический алгоритм выпол- няет ряд вычислений на текущей популяции, чтобы произве- сти новую популяцию. Каждая последующая популяция на- зывается новым поколением. Разнообразие. Разнообразие {Diversity) характеризует среднее расстояние между особями в популяции. У популя- ции есть высокое разнообразие, если среднее расстояние большое, иначе она имеет низкое разнообразие. На рис. 3.1 популяция, отмеченная знаком «+», имеет высокое разнооб- разие, в то время как у популяции, отмеченной точкой, раз- нообразие низкое. 17
+ Hyh divnarciity Low drvgaity 4- +■ "И + » + Рис. 3.1 Разнообразие важно для генетического алгоритма, пото- му что позволяет ему исследовать более крупную область пространства решений. Значение пригодности и лучшие значения пригодно- сти. Значение пригодности особи - это значение функции пригодности для этой особи. Поскольку алгоритм находит минимум функции пригодности, то лучшим для популяции является самое маленькое значение функции пригодности для любой особи. Родители и потомки. Чтобы создать следующее поко- ление, генетический алгоритм выбирает определенных осо- бей в текущей популяции, называемых родителями, и ис- пользует их, чтобы создать особей в следующем поколении, называемых потомками. Как правило, алгоритм с большей вероятностью выберет родителей с лучшими значениями пригодности. 4. КАК РАБОТАЕТ ГЕНЕТИЧЕСКИЙ АЛГОРИТМ Последовательность работы генетического алгоритма: 1. Создание случайной начальной популяции. 2. Создание последовательности новых популяций. На каждом шаге алгоритм использует особей текущего поколе- 18
ния, чтобы создать следующую популяцию. Для создания новой популяции он выполняет следующие шаги: • оценивает каждый член текущей популяции, вычисляя значение его функции пригодности; • масштабирует необработанное множество значений пригодности, чтобы преобразовать их в более приемлемый диапазон значений; • выбирает участников, называемых родителями, осно- вываясь на их пригодности; • некоторые особи текущей популяции, которые имеют более низкое значение пригодности, выбираются в качестве элиты и передаются следующей популяции; • производит потомков от родителей. Потомки произво- дятся либо внесением случайных изменений в родителя- одиночку - мутация, либо, объединяя векторные записи пары родителей, - скрещивание; • заменяет текущую популяцию потомками, чтобы сформировать следующее поколение. 3. Остановка по достижении одного из останавливающих критериев. Начальная популяция. Алгоритм начинается, создавая случайную начальную популяцию, как показано на рис. 4.1. Рис. 4.1 19
В этом примере начальная популяция содержит 20 осо- бей. Это численность, которая является значением по умол- чанию для поля Population size {Численности популяции) па- раметра Population. Как видно, все особи в начальной попу- ляции лежат в верхнем правом секторе рисунка, т.е. их коор- динаты находятся между 0 и 1, потому что по умолчанию значение Initial range {Начального диапазона) параметра Population равно [0; 1]. Если приблизительно известен диапазон, в котором на- ходится минимальная точка для функции, то нужно устано- вить Initial range так, чтобы точка находилась около середи- ны этого диапазона. Например, если предполагается, что минимум для функ- ции Растригина находится около точки [0 0], то можно задать Initial range [-1; 1]. Однако, как показывает этот пример, генетический алгоритм может найти минимум даже с неоп- тимальным выбором начального диапазона. Создание следующего поколения. На каждом шаге гене- тический алгоритм использует текущую популяцию, чтобы создать потомков, которые составляют следующее поколе- ние. Алгоритм выбирает группу особей в текущей популя- ции, называемую родительской, которые передают свои гены - записи их векторов - их потомкам. Обычно в качестве ро- дителей выбираются особи, с лучшими значениями при- годности. Можно опреде- лить функцию, которая ис- пользуется для выбора роди- телей, в поле Selection func- tion параметра Selection. crossover child Генетический алгоритм создает три типа потомков для следующего поколения *- <^ ^> 20 (рис. 4.2): Munition child 1) элитные потомки Рис. 4.2 {Elite children) - особи в те- ЕПте child О
кущем поколении с лучшим значением пригодности. Эти особи автоматически попадают в следующее поколение; 2) потомки, полученные в результате скрещивания (Crossover children), объединяя векторы пары родителей; 3) потомки мутации (Mutation children), созданные вве- дением случайных изменений, или мутации, родителю- одиночке. Скрещивание потомков. Алгоритм скрещивает потом- ков, объединяя пары родителей текущей популяции. В каж- дой координате вектора потомка функция скрещивания по умолчанию выбирает случайным образом вход, или ген, из той же координаты одного из двух родителей и передаёт его потомку. Потомки мутации. Алгоритм создает потомков мута- ции, случайно изменяя гены отдельных родителей. По умол- чанию родителю добавляется случайный вектор от гауссов- ского распределения. На рис. 4.3 показаны потомки началь- ной популяции, т.е. популяции во втором поколении. 21
Рис. 4.3 На рис. 4.4 показаны популяции на итерациях 60, 80, 95 и 100. С ростом числа поколений особи сплачиваются и при- ближаются к точке минимума [0 0]. Рис. 4.4 Условия остановки алгоритмах • поколения {Generations) — алгоритм останавливается, когда число поколений достигает значения, заданного в Generations', • время выполнения {Time limit) — алгоритм останавли- вается, когда время выполнения, заданное в секундах, равно Time limit;
• предел пригодности {Fitness limit) - алгоритм останав- ливается, когда значение функции пригодности для лучшей точки в текущей популяции меньше или равно указанному в Fitness limit; • поколения останова (Stall generations) - алгоритм ос- танавливается, когда взвешенное среднее изменение значе- ния функции пригодности за Stall generations поколений меньше, чем Допуск функции (Function tolerance); • временной предел (Stall time limit) - алгоритм останав- ливается, если нет никакого улучшения целевой функции в течение интервала времени в секундах, равного Stall time limit; • допуск функции (Function tolerance) - алгоритм вы- полняется до того момента, когда взвешенное среднее изме- нение значения функции пригодности по поколениям оста- нова (Stall generations) станет меньше, чем Допуск функции (Function tolerance); • допуск нелинейных ограничений (Nonlinear constraint tolerance). Не используется в качестве останавливающего критерия. Он используется, чтобы определить выполнимость относительно нелинейных ограничений. Алгоритм останавливается, как только выполняется лю- бое из этих условий. Можно определить значения этих кри- териев в панели Stopping criteria пакета оптимизации. Значе- ния по умолчанию показаны на рис. 4.5. Когда выполняется генетический алгоритм, панель Run solver and view results показывает критерий, который заставил алгоритм остановиться. Параметры Stall time limit и Time limit предотвращают возможность слишком долгого выполнения алгоритма. Если алгоритм останавливается из-за одного из этих условий, то можно улучшить результаты, увеличивая значения этих параметров. 23
D Stopping criteria Generations: Time limit: Fitness limit: Stall generations: Stall time limit: Function tolerance: Nonlinear constraint tolerance <!" Use default: 100 С Specify: | <? Use default: Inf С Specify: [ <? Use default: -Inf С Specify: | <? Use default: 50 С Specify: | *!" Use default: InP С Specify: [ <* Use default: le-6 С Specify: | <? Use default: le-6 С Specify: | Рис. 4.5 5. ИСПОЛЬЗОВАНИЕ ГЕНЕТИЧЕСКОГО АЛГОРИТ- МА С ПОМОЩЬЮ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА Изображение графиков. Панель графических парамет- ров, (рис. 5.1) позволяет изобразить различные графики ре- зультатов генетического алгоритма. Выбираются опции рядом с графиками, которые нужно показать. Например, если выбрать Лучшую пригодность (Best fitness) и Лучшую особь (Best individual) и запустить пример для функции Растригина, описанный выше, инстру- мент показывает графики, подобные приведенным на рис. 5.2. 24
Plots Plot interval: |l Г" Expectation Г~ Score diversity Г" Stopping Г" Custom function: [^ Best individual I- Genealogy I- Scores I- Max constraint I Г" Distance Г~ Range I- Selection Рис. 5.1 File Edit View Insert Tools Desktop Window Help 8 10 Eest: 0.012354 Mean: 6.3364 *44*-VvA*.- 0 10 20 30 40 50 60 70 30 90 100 Generation x ю-3 Current Best Individual 1 2 Number of variables (2) Рис. 5.2 Верхний график показывает лучшие и средние значения пригодности в каждом поколении, нижний - координаты точки с лучшей пригодностью в текущем поколении. Когда заказывается больше чем один график, щелчок на любом графике в то время как генетический алгоритм вы- полняется или после того, как он закончился, открывает этот график в отдельном окне большего размера. Создание собственной графической функции. Если ни один из графиков, которые содержат программное обеспече- 25
ние, не подходит для того, что нужно вывести на экран, то можно написать собственную функцию, которая будет вызы- ваться алгоритмом для каждого поколения. Этот пример де- монстрирует, как создать функцию графика, который пока- зывает изменение в лучшей пригодности от предыдущего поколения к текущему. Чтобы создать функцию графика для этого примера, ско- пируйте и вставьте следующий код в новый М-файл в редак- торе Matlab: function state = gaplotchange(options, state, flag) % функция gaplotchange выводит график в логарифмическом масштабе, % изменения лучшей оценки по сравнению с предыдущим по- колением. % persistent lastbest % лучшая оценка в предыдущем поколении if(strcmp(flag,finit')) % Установка графика set(gca,'xlimf,[ 1 ,options.Generations],'YscaleVlogf); hold on; xlabel Generation title('Change in Best Fitness Value') end best = min(state.Score); % лучшая оценка в текущем поколении if state.Generation = 0 % Set lastbest to best. lastbest = best; else change = lastbest - best; % изменение лучшей оценки last_best=best; plot(state.Generation, change, '.r'); title(['Change in Best Fitness Value']) end Теперь сохраните М-файл как gaplotchange.m в доступ- ной для Matlab папке. Использование графической функции. Чтобы использо- вать собственную графическую функцию, выберите Custom в панели Plot functions и введите @gaplotchange в поле справа. Для сравнения собственной функции с графиком лучшей пригодности выберите также Best fitness. Теперь, ес- 26
ли запустить пример функции Растригина, графики будут подобны приведенным на рис. 5.3. 20 ; I5h 1 8 Ю ■:.; £ 5 о ■:г юи h ■:г ■ :г ю Best 0.0020445 Mean: 0.033263 Best fitness Mean fitness 10 20 30 40 50 60 Generation Change in Best Fitness Value 70 80 90 100 2C 3C 40 50 60 Generation 70 80 90 10Q Рис. 5.3 Так как масштаб оси Y на нижнем графике логарифмиче- ский, график показывает только изменения, которые больше нуля. Логарифмическая шкала позволяет видеть небольшие изменения в функции пригодности, которые верхний график не показывает. Как работает графическая функция. Функция исполь- зует информацию, содержащуюся в следующих структурах, которую генетический алгоритм передает функции как вход- ные аргументы: • options - текущие параметры настройки; • state — информация о текущем поколении; • flag - строка, указывающая на текущий статус алго- ритма. 27
Самые важные строки графической функции: • persistent lastjbest. Создает постоянную переменную lastjbest - лучшая оценка в предыдущем поколении. Постоян- ные переменные сохраняются в течение множественных вызо- вов графической функции: • set(gca, 'xlim' [1, options. Generations], 'Yscale ', 'log'). На- страивает график прежде, чем алгоритм начнется. Параметр options.Generations - это максимальное количество поколе- ний; • best = min(state.Score). Поле state.Score содержит ко- личество всех особей в текущей популяции. Переменная best - минимальное количество; • change = last_best - best. Переменная change, равная лучшей оценке в предыдущем поколении минус лучшая оценка в текущем поколении. • plot(state.Generation, change, '.г'). Рисует изменение в текущем поколении, размер которого содержится в state. Generation. Код для gaplotchange содержит многие из тех же самых элементов, что и код для gaplotbestf, - функции, которая соз- дает график лучшей пригодности. Воспроизведение результатов. Чтобы воспроизвести результаты последнего выполнения генетического алгоритма, выберите Use random states from previous run. Это сбрасывает состояния генераторов случайных чисел, используемых алго- ритмом, к их предыдущим значениям. Если не изменять ни- какие другие настройки в инструменте оптимизации, в сле- дующий раз при запуске генетического алгоритма он воз- вращает те же самые результаты, что и в предыдущий. Обычно нужно оставить Use random states from previous run отменённым, чтобы извлечь пользу из случайного харак- тера генетического алгоритма. Выбирать Use random states from previous run, следует, если требуется проанализировать результаты этого определённого выполнения или показать точные результаты другим. После выполнения алгоритма можно очистить свои результаты, используя кнопку Clear Status в параметрах настройки Run solver. 28
Если отметить Include information needed to resume this run, тогда выбор Use random states from previous run не ока- жет никакого эффекта на создание начальной популяции, ко- гда вы импортируете проблему и запускаете генетический алгоритм на ней. Последняя функция предназначена только для того, чтобы воспроизвести результаты с начала нового выполнения, а не возобновленного. Возобновление генетического алгоритма от заключи- тельной популяции. Рассматриваемый здесь пример пока- зывает, как экспортировать проблему так, чтобы, когда потом импортировать её и нажать Start, генетический алгоритм во- зобновлялся с заключительной популяции, сохраненной с экспортированной проблемой. Для выполнения примера введите следующую информацию в Optimization Tool: • присвойте Fitness function значение @ackleyfcn, кото- рая вычисляет функцию ackley - тестовую функцию, предос- тавленную программным обеспечением; • присвойте Number of variables значение 10; • выберите Best fitness в панели Plot functions', • нажмите Start. В результате выведется график, приведенный на рис. 5.4. 29
Рис. 5.4 Предположим, что требуется экспериментировать, вы- полняя генетический алгоритм с разными вариантами пара- метров настройки, и затем позже перезапустить это выполне- ние с его заключительной популяции и с текущим вариантом параметров настройки. Это можно сделать, выполнив сле- дующие шаги: 1. Щелкнуть на Export to Workspace', 2. В появившемся диалоговом окне: • выбрать Export problem and options to a Matlab structure named; • указать имя для проблемы и параметров, введя ackleyjuniform, в текстовом поле; • выбрать Include information needed to resume this run. Появившееся диалоговое окно приведено на рис. 5.5. зо
\*J- Export To Workspace p' Export problem and oations to a MATLAB structure name* \7 include informaticn needed to resume this run! Г" Export options to a MATLAB structure named: Г" Export results to a MATLAB structure named: OK Cancel | -|П|Х|| |ackley_uniform loptions loptimresutts Рис. 5.5 3. Нажать ОК. Это экспортирует проблему и параметры (функции, ус- тановки) в структуре в рабочую область Matlab. Можно рассмотреть структуру в командном окне Matlab, введя: ackley_uniform ackley_uniform = fltnessfcn: @ackleyfcn nvars: 10 Aineq: [] bineq: [] Aeq: [] beq: [] lb:[] ub:[] nonlcon: [] randstate: [] randnstate: [] solver: 'ga' options: [lxl struct] После выполнения генетического алгоритма с различны- ми вариантами параметров настройки или даже с различны- ми функциями пригодности можно восстановить проблему следующим образом: 31
1. Выбрать Import Problem из меню File. Откроется диа- логовое окно, показанное на рис. 5.6; I Import Optimization Problem Select a problem structure to import: jnjx] Рис. 5.6 2. Выбрать ackleyjuniform; 3. Нажать Import. Это устанавливает поля Initial population (Начальная по- пуляция) и Initial cores (Начальное множество) в панели Population (Популяция) в значения, соответствующие заклю- чительной популяции при запуске перед экспортом. Все дру- гие параметры вернулись к их значениям во время выполне- ния. После нажатия Start генетический алгоритм возобновит- ся с сохранённой последней популяции. На рис. 5.7 показаны графики лучшей пригодности оригинального выполнения и перезапущенного. 32
Biv.. -iz$2Г.'еа- 3.C023 Best. :.9K1\fean: 3dM64 10 20 Э0 40 iC tQ 70 30 SO 1CC 70 60 SO 1DD First run Run resumes here Рис. 5.7 Если после выполнения генетического алгоритма с им- портированной проблемой нужно восстановить поведение генетического алгоритма по умолчанию, формируя началь- ную популяцию случайным образом, удалите популяцию в поле Initial population. 6. ИСПОЛЬЗОВАНИЕ ГЕНЕТИЧЕСКОГО АЛГОРИТ- МА ИЗ КОМАНДНОЙ СТРОКИ Выполнение ga с параметрами по умолчанию. Чтобы выполнить генетический алгоритм с параметрами по умолча- нию, вызовите ga с помощью строки: [х fval] = ga (@fitnessfiin, nvars). Входные аргументы ga: @fitnessfun - указатель на М- файл, который вычисляет функцию пригодности; nvars - число независимых переменных для функции пригодности. Выходные аргументы: х - конечная точка; fval - значе- ние функции пригодности в точке х. Можно выполнить пример функции Растригина из ко- мандной строки, введя [х fval] = ga (@rastriginsfcn, 2) 33
Это возвращает х = 0.0027 - 0.0052 fval = 0.0068 Дополнительные выходные аргументы. Получить больше информации об исполнении генетического алгорит- ма, можно вызвав ga следующей строкой: [xjval exitflag output population scores] = ga(@fitnessfcn, nvars) Помимо x и foal, эта функция возвращает следующие дополнительные аргументы: • exitflag - целочисленное значение, соответствующее причине окончания алгоритма; • output - структура, содержащая информацию об ис- полнении алгоритма в каждом поколении; • population - заключительная популяция; • scores (множество) - окончательные оценки. Установка параметров ga в командной строке. Можно определить любой из параметров, используемых ga, задав его как входной аргумент ga, используя синтаксис: [х fval] = ga (@fitnessfun, nvars, [], [], [], [], [], [], [], options) Этот синтаксис не определяет линейные равенства, ли- нейные неравенства, или нелинейные ограничения. Создается структура параметров, используя функцию gaoptimset: options = gaoptimset(@ga). Она возвращает структуру параметров со следующими значениями полей по умолчанию: options = PopulationType: 'doubleVector' PopInitRange: [2x1 double] PopulationSize: 20 EliteCount: 2 CrossoverFraction: 0.8000 34
ParetoFraction: [ ] MigrationDirection: 'forward' Migrationlnterval: 20 MigrationFraction: 0.2000 Generations: 100 TimeLimit: Inf FitnessLimit: -Inf StallGenLimit: 50 StallTimeLimit: Inf TolFun: 1.0000e-006 TolCon: 1.0000e-006 InitialPopulation: [ ] InitialScores: [ ] InitialPenalty: 10 PenaltyFactor: 100 Plotlnterval: 1 CreationFcn: @gacreationuniform FitnessScalingFcn: @fltscalingrank SelectionFcn: @selectionstochunif CrossoverFcn: @crossoverscattered MutationFcn: {[lxl function_handle] [1] [1]} DistanceMeasureFcn: [ ] HybridFcn: [ ] Display: 'final' PlotFcns: [ ] OutputFcns: [ ] Vectorized: 'off UseParallel: 'never' Функция ga использует эти значения по умолчанию, если не пересылать параметры как входные аргументы. Значение каждого параметра сохранено в поле структуры параметров, как это видно для options. PopulationSize. Мож- но вывести на экран любую из этих величин, набрав options . имя соответствующего поля. Например, чтобы показать размер популяции для генети- ческого алгоритма, введите options. PopulationSize ans = 35
20 Для создания структуры параметров со значением поля, которое отличается от умолчания (например, чтобы устано- вить PopulationSize в 100 вместо его значения по умолчанию, равного 20), введите options = gaoptimset ('PopulationSize', 100) Это создает структуру параметров со всем набором зна- чений по умолчанию, кроме PopulationSize, который уста- новлен в 100. Если теперь ввести ga (@fitnessfun, nvars, [], [], [], [], [], [], [],options ) то ga запустит генетический алгоритм с численностью попу- ляции 100. Если впоследствии потребуется изменить другое поле в структуре параметров, например установить для PlotFcns значение @gaplotbestf, которое строит график лучшего зна- чения функции пригодности в каждом поколении, то введите gaoptimset с синтаксисом: options = gaoptimset (options , 'PlotFcns', @gaplotbestf) Это сохраняет текущие значения всех полей параметров за исключением PlotFcns, которое будет изменено на @gaplotbestf. Если опускается входной аргумент options , то gaoptimset перезагружает PopulationSize к своему значению по умолча- нию 20. Можно также установить и PopulationSize и PlotFcns единственной командой options = gaoptimset ('PopulationSize', 100, 'PlotFcns',® gaplot- bestf) Использование параметров и проблемы из Optimization Tool Как альтернатива созданию структуры параметров, ис- пользуя gaoptimset, можно установить значения параметров в Optimization Toolbox и затем экспортировать их в структуру в рабочей области Matlab. Если экспортируются параметры по умолчанию в инст- рументе оптимизации, то получающаяся структура options 36
имеет те же самые параметры настройки, что и структура, по умолчанию возвращаемая командой options = gaoptimset (@ga) за исключением того, что для параметра 'Display' будет зна- чение 'off в экспортируемой структуре и 'final' при исполь- зовании командной строки. Если экспортировали проблемную структуру, ga_problem, из Optimization Tool, то можно применить ga к ней, используя синтаксис [х fval] = ga (ga_problem) Проблемная структура содержит следующие области: • fitnessfcn - функция пригодности; • nvars - число переменных для проблемы; • Aineq - матрица для неравенств ограничений; • Bineq - вектор для неравенств ограничений; • Aeq - матрица для ограничений равенства; • Beq - вектор для ограничений равенства; • LB - нижняя граница на х; • UB - верхняя граница на х; • nonlcon - нелинейная функция ограничения; • options - структура параметров. Воспроизведение результатов из командной строки. Поскольку генетический алгоритм стохастический, т.е. он делает случайный выбор, то получаются результаты при ка- ждом запуске немного различающиеся. Алгоритм использует псевдослучайный числовой поток среды Matlab. Каждый раз, когда ga вызывает поток, тот из- меняет свое состояние. Так что при следующем вызове алго- ритмом поток возвращает другое случайное число. Этим объясняется, почему ga выдаёт каждый раз несколько отлич- ные результаты. Если нужно воспроизвести точно те же результаты, то следует вызвать ga с выходным аргументом, который содер- жит текущее состояние потока, а затем сбросить состояние к этому значению перед повторным запуском ga. Например, чтобы воспроизвести выход ga применительно к функции Растригина, нужно обратиться к алгоритму с синтаксисом 37
rng(l,'twister') % для воспроизводимости [x fval exitflag output] = ga(@rastriginsfcn, 2); Предположим, что результаты были такими: x,fval х = 0.0071 0.0220 fval = 0.1058 Состояние потока хранится в output.rngstate: output output = problemtype: 'unconstrained' rngstate: [lxl struct] generations: 55 funccount: 1120 message: [1x86 char] Чтобы сбросить состояние, введите stream = RandStream.getGlobalStream; stream.State = outputrngstate.state. Если сейчас запустить ga второй раз, получится тот же результат, что и раньше: [х fval exitflag output] = ga(@rastriginsfcn, 2) x = 0.0071 0.0220 fval = 0.1058 exitflag = 1 output = problemtype: 'unconstrained' rngstate: [lxl struct] generations: 55 funccount: 1120 message: [1x86 char] 38
Можно воспроизвести своё выполнение в Optimization Tool, отметив поле Use random states from previous run в сек- ции Run solver and view results. Если не требуется воспроизвести свои результаты, лучше не устанавливать состояние потока, чтобы извлекать пользу из случайности в генетическом алгоритме. Возобновление ga от заключительной популяции пре- дыдущего выполнения. По умолчанию ga создает новую на- чальную популяцию каждый раз, когда он выполняется. Од- нако можно получить лучшие результаты при помощи за- ключительной популяции предыдущего выполнения, ис- пользуя её как начальную популяцию для нового запуска алгоритма. Для этого нужно сохранить заключительную по- пуляцию предыдущего выполнения, вызывая ga следующей строкой: [х , fval, exitflag , output, final_pop] = ga(@fitnessfcn, nvars); Последний выходной аргумент - заключительная попу- ляция. Для запуска ga с использованием finaljpop как на- чальной популяцией, введите options = gaoptimset('InitialPop', final_pop); [х , fval, exitflag , output, final_pop2] = ... ga(@fitnessfcn,nvars,[],[],[],[],[],[],[],options); Можно тогда использовать final_pop2, заключительную популяцию от второго выполнения как начальную для третьего. В Optimization Tool можно экспортировать проблему, что позволит возобновить выполнение. Просто поставьте флажок в поле Include information needed to resume this run, тем самым экспортируя проблему (рис. 6.1). 39
I^i Export To Workspace |7 Export problem and options to a MATLAB structure named: W Include information needed to resume this run \~ Export options to a MATLAB structure named: H Export results to a MATLAB structure named: OK Cancel | -|n|x|| [Dptimproblem |options| loptimresults Рис. 6.1 Это сохранит заключительную популяцию, которая станет начальной для импортированной. Если требуется решить про- блему, которая была сохранена с заключительной популяцией, но не нужно использовать эту популяцию как начальную, про- сто удалите или измените начальную популяцию в панели Options > Population. Пример выполнения ga из М-файла. Интерфейс ко- мандной строки позволяет выполнять генетический алго- ритм много раз, с различными параметрами настройки, ис- пользуя М-файл. Например, можно запускать генетический алгоритм с различными параметрами для Crossover fraction (Доля скрещивания), чтобы выбрать лучший результат. Сле- дующий код выполняет функцию gall раз, варьируя options. CrossoverFraction от 0 до 1 с шагом 0.05, и записывая резуль- таты: options = gaoptimset('Generations',300); record=[]; for n=0:.05:1 options = gaoptimset(options,'CrossoverFraction', n); [x fval]=ga(@rastriginsfcn, 10,[],[],[],[],[],[],[],options); record = [record; fval]; end Можно изобразить график изменения fval от шага пере- сечения командами: plot(0:.05:1, record); xlabel('Crossover Fraction'); 40
ylabelCfval') Появившийся график (рис. 6.2) показывает, что можно получить лучшие результаты, устанавливая параметр options. CrossoverFraction в диапазоне где-нибудь между 0.6 и 0.95. Можно получить более гладкий график fval как функции ша- га пересечения, запуская ga 20 раз и усредняя величину fval для каждого шага пересечения. Получающийся график (рис. 6.3) сужает диапазон лучшего выбора для options. Cros- soverFraction до значений между 0.7 и 0.9. Crossover Fraction Рис. 6.2 41
50 -5 40 £ 35 =5 СИ Я 30 о | 25 го 20 го ^ 15 10 5 0 i ) ' ! 0.2 ' ! 0.4 ' ! 0.6 Crossover Fraction ' - - - - 7 Г ■ j ! 0.8 Рис. 6.3 7. УЛУЧШЕНИЕ РЕЗУЛЬТАТОВ Чтобы получить лучшие результаты генетического алго- ритма, обычно требуется экспериментировать с различными параметрами. Отбор наилучших параметров для проблемы проводится методом проб и ошибок. Этот раздел описывает некоторые способы, которыми можно изменить параметры для улучшения результатов. Разнообразие популяции. Одним из наиболее важных факторов, определяющих исполнение генетического алго- ритма, является разнообразие популяции. Если среднее рас- стояние между особями большое - разнообразие высокое, если среднее расстояние малое - разнообразие низкое. Полу- чить правильный уровень разнообразия можно методом проб и ошибок. Если разнообразие слишком высоко или слишком низко, генетический алгоритм не сможет показать хороший результат. Рассмотрим, как управлять разнообразием, устанавливая Initial range {Начальный диапазон) популяции, и как устано- вить численность популяции. 42
Установка начального диапазона. По умолчанию инст- румент оптимизации создает случайную начальную популя- цию, используя функцию создания. Можно определить диа- пазон векторов в начальной популяции в поле Initial range {Начальный диапазон) в параметрах Population. Начальный диапазон ограничивает диапазон точек толь- ко в начальной популяции, определяя нижнюю и верхнюю границы. Последующие поколения могут содержать точки вне начального диапазона. Дополнительно верхние и нижние границы могут быть скорректированы заданием значений в полях Bounds в панели Constraints {Ограничений). Если приблизительно известно, где находится решение проблемы, нужно определить начальный диапазон так, чтобы он содержал предполагаемое решение. Однако генетический алгоритм может найти решение, даже если оно не лежит в на- чальном диапазоне, при условии, что у популяции имеется достаточное разнообразие. Следующий пример показывает, как начальный диапазон затрагивает исполнение генетического алгоритма. Пример использует функцию Растригина. Минимальное значение функции равно 0, которое достигается в начале координат. Чтобы выполнить пример, введите следующие парамет- ры настройки в инструменте оптимизации: • введите в поле Fitness function значение @rastriginsfcn\ • введите Number of variables(4ucno переменных), равное 2. • выберите Best fitness {Лучшую пригодность) в панели Plot functions', • выберите Distance (Расстояние) в панели Plot functions', • установите в критериях останова для Stall generations величину 100; • введите Initial range (Начальный диапазон) размером [1; l.i]. 43
Затем нажмите Start. Генетический алгоритм возвращает лучшее значение функции пригодности, приблизительно равное 2, и выводит графики, приведенные на рис. 7.1. Верхний график (лучшую пригодность в каждом поколе- нии) показывает слабое понижение значения пригодности, нижний - среднее расстояние между особями в каждом поко- лении (хорошая мера разнообразия популяции). При данной установке начального диапазона разнообразие слишком мало для успешной работы алгоритма. Best: 1.9899 Mean: 1.9911 10 20 30 40 50 60 70 80 90 100 Generation Average Distance between individuals 0.2 г 0.15k 0.05 L ' •■*** ......' ■ /•" 0I , , , , , , '■" ''Vv-*y-'*---..i . 10 20 30 40 50 60 70 80 90 100 stQP I generation Рис. 7.1 Затем попробуйте задать диапазон установки Initial range равным [1; 100] и выполните алгоритм. Генетический алго- ритм вернёт лучшее значение пригодности, приблизительно 3.9, и выведет на экран графики, приведенные на рис. 7.2. 44
о5 ■ои 15::: stop | Best: 3.8861 Mean: 10.2159 10 20 3C 73 40 50 60 Generation Average Distance between individuals 80 90 100 10 20 3C 40 50 60 generation 7II BO 90 100 Рис. 7.2 На сей раз генетический алгоритм делает успехи, но так как среднее значение расстояния между особями слишком велико, лучшие особи далеки от оптимального решения. Наконец, установите Initial range равным [1; 2] и выпол- ните генетический алгоритм. В этом случае лучшее значение пригодности приблизительно .012 и выводятся графики, по- казанные на рис. 7.3. 45
Best: 0.011658 Mean: 0.062498 10я r 10 20 30 40 50 60 70 80 90 100 Generation Average Distance between individuals 2r 1-5 К t . *[ * * , * ' osr ' ' *'" * V V *'•*-' ." 0I 1 1 , , , 1 1 ,'"■'• ; --„i , 10 20 30 40 50 60 70 80 90 100 stQP I generation Рис. 7.3 Разнообразие в этом случае больше подходит для про- блемы, так что генетический алгоритм возвращает намного лучший результат, чем в предыдущих двух случаях. Линейно-ограниченная популяция и собственная графи- ческая функция. Этот пример показывает, как функция созда- ния по умолчанию для линейно-ограниченной проблемы, gacreationlinearfeasible, создаёт хорошо рассеянную популя- цию, удовлетворяющую линейным ограничениям и границам. Здесь также содержится пример собственной графической функции. Проблема использует квадратичную целевую функцию Uncontest6.m: JCi о f(x) = —— + х2 - ххх2 - 2хх - 6х2. Ф ю1 с in"* 46
Чтобы увидеть код для функции, введите type lincontest6. Ограничения - это три линейных неравенства: Xi т Ху ^ .Z ? - Xi + х2 < 2 , 2jcj + 2х2 < 3 . Кроме того, переменные xt ограничены тем, что должны быть положительными. 1. Создайте файл собственной функции для вывода гра- фика, содержащий следующий код: function state = gaplotshowpopulation2(unused,state,flag,fcn) % This plot function works in 2-d only if size(state.Population,2) > 2 return; end if nargin<4 fcn = []; end % Dimensions to plot dimensionsToPlot =[12]; switch flag % Plot initialization case 'init' pop = state.Population(:,dimensionsToPlot); plotHandle = plot(pop(:,l),pop(:,2),'*'); set(plotHandle,'Tag7gaplotshowpopulation2f) title('Population plot in two dimensionVinterp','none') xlabelStr = sprintf(*%s %s7Variable ',... num2str(dimensionsToPlot( 1))); ylabelStr = sprintf('%s %s7Variable ',... num2str(dimensionsToPlot(2))); xlabeKxlabelStr/interpVnone'); ylabe^ylabelStr/interpVnone'); hold on; % plot the inequalities plot([0 1.5],[2 0.5],'m-.') % xl + x2 <= 2 plot([0 1.5],[1 3.5/2],^-.'); % -xl + 2*x2 <= 2 plot([0 1.5],[3 0];m-.'); % 2*xl + x2 <= 3 47
% plot lower bounds plot([0 0], [0 2],fm-.*); % lb = [ 0 0]; plot([0 1.5], [0 0],'m-.'); % lb = [ 0 0]; set(gca/xlim',[-0.7,2.2]) set(gca,»ylim»,[-0.7,2.7]) % Contour plot the objective function if~isempty(fcn) range = [-0.5,2;-0.5,2]; pts = 100; span = diff(range')/(pts - 1); x = range(l,l): span(l): range(l,2); у = range(2,l): span(2): range(2,2); pop = zeros(pts * pts,2); values = zeros(pts,l); k=l; for i = 1 :pts forj = l:pts pop(k,:) = [x(i),y(j)]; values(k) = fcn(pop(k,:)); k = k+l; end end values = reshape(values,pts,pts); contour(x,y,values); colorbar end % Pause for three seconds to view the initial plot pause(3); case 'iter' pop = state.Population(:,dimensionsToPlot); plotHandle = findobj(get(gca,,Children,),Tag',... ,gaplotshowpopulation2'); set(plotHandle,'Xdata\pop(:,iyYdata',pop(:,2)); end Пользовательская функция графика изображает линии, представляющие линейные неравенства и связанные ограни- чения, кривые уровня целевой (пригодности) функции, и графически изображает, как развивается популяция. 48
2. В командной строке введите ограничения как матрицу и векторы: А = [1 ,1; -1 , 2; 2 , 1]; b = [2; 2; 3]; lb = zeros(2,l); 3. Введите options, используя gaplotshowpopulation: options = gaoptimset (TlotFcns',@gaplotshowpopulation); 4. Запустите оптимизацию, используя options : [x , fval] = ga (@lincontest6,2, A, b, [], [], lb, [], [],options ); Появится окно графика (рис. 7.4), показывающего ли- нейные ограничения, границы, кривые уровня целевой функ- ции и начальное распределение популяции. Рис. 7.4 Видно, что начальная популяция смещена, чтобы лечь на ограничения. Популяция в конечном счете концентрируется вокруг минимальной точки (рис. 7.5). Установка численности популяции. Поле Population size (Численности популяции) в опциях Population определяет 49
размер популяции в каждом поколении. Увеличение числен- ности популяции вынуждает генетический алгоритм искать больше точек. Таким образом получается лучший результат. Однако чем больше численность популяции, тем дольше ге- нетический алгоритм проводит вычисление каждой популя- ции. Рис. 7.5 Нужно установить Population size так, чтобы она была, по крайней мере, равна числу переменных {Number of variables) и чтобы особи каждой популяции охватили про- странство поиска. Можно экспериментировать с различными параметрами настройки для Population size для получения хорошего ре- зультата, не устанавливая ограничения по времени выполне- ния алгоритма. Вычисление пригодности. Масштабирование пригодно- сти преобразовывает необработанное множество пригодно- сти, которое возвращено функцией пригодности к значениям в диапазоне, подходящем для функции выбора. Функция вы- 50
бора использует масштабированные значения пригодности, чтобы выбрать родителей следующего поколения. Функция выбора присваивает более высокую вероятность выбора осо- бям с более высокими масштабированными значениями. Диапазон масштабированных значений влияет на произ- водительность генетического алгоритма. Если масштабируе- мые значения различаются значительно, особи с самыми вы- сокими значениями воспроизводятся слишком быстро, зани- мая генный пул популяции (объединение генов популяции) и препятствуя тому, чтобы генетический алгоритм искал дру- гую область пространства решения. С другой стороны, если масштабируемые значения варьируются очень мало, все осо- би имеют приблизительно одну и ту же возможность воспро- изведения и поиск будет прогрессировать очень медленно. Опция масштабирования пригодности по умолчанию, Rank, масштабирует необработанное множество на основе ранга каждой особи вместо его оценки. Ранг особи - позиция в отсортированном множестве: ранг самого подходящей осо- би равен 1, следующей наиболее подходящей равен 2 и т.д. Ранговая функция масштабирования присваивает масштаби- рованные значения так, чтобы масштабированное значение особи с рангом п было пропорционально 1/ \п . Сумма мас- штабированных значений по всей популяции равнялась чис- лу родителей, необходимых для создания следующего поко- ления. Ранговое масштабирование пригодности удаляет эффект распространения необработанного множества. Рис. 7.6 пока- зывает необработанное множество типичной популяции из 20 особей, отсортированное в увеличивающемся порядке, а рис. 7.7 - масштабированные значения необработанного множества с использованием рангового масштабирования. 51
Raw Scores of Population 130 120 га 10D 90 =: ~2 ВС О « о о о 5 1С 16 Sorted individuals Рис. 7.6 Scaled Valjeb Lbing Rank Scaling Sorted individuals Рис. 7.7 Поскольку алгоритм минимизирует функцию пригодно- сти, более низкие величины необработанного множества име- ют более высокие масштабированные значения. Так как ран- говое масштабирование присваивает значения, которые зави- 52
сят только от ранга особи, показанные масштабированные значения были бы теми же для любой популяции размером 20 и числом родителей, равным 32. Сравнение ранга и главной оценки. Чтобы увидеть эф- фект масштабирования, можно сравнить результаты генети- ческого алгоритма, использующего ранговое масштабирова- ние, с одной из других опций масштабирования, такой как Тор {Главный). По умолчанию главное масштабирование присваивает 40 процентам самых подходящих особей неко- торое масштабированное значение, а остальной части особей - значение 0. При помощи функции выбора по умолчанию только 40 процентов самых подходящих особей могут быть выбраны как родители. На рис. 7.8 сравниваются масштабированные значения, полученные ранговым и главным масштабированием для по- пуляции размером 20 и числом родителей, равным 32. По- скольку главное масштабирование ограничивает родителей самыми подходящими особями, оно создает менее разнооб- разную популяцию, чем ранговое масштабирование. На рис. 7.9 сравнивается различие в расстояниях между особями в каждом поколении для рангового и главного масштабиро- вания. 53
Comparison of Rank and Top Scaling 3 ! ■o 4 s ю 3 + + + + * Rank scaling + Top scaling * * ■* Ak * ********** + + + + + + + + + + + + + + + I 5 10 15 Sorted individuals Рис. 7.8 20 С 3 07 0.6 0 5 0.4 0.3 0 2 О/ Variance of Distance Between Individuals Using Rank and Top Scaling 1 1 I I I +■ *- 1 1 1 1 J * Variance using rank scaling + Variance using top scaling | * * + j* # * -. * т Ф * * % -j * * * * # #±* + t J* *** 1 + *~ + J- *** - +* +-+ <; >+v* л-"4. i i i i i i i i i т=Н1 \\Щ. 0 10 20 30 40 50 60 70 80 90 100 Generation Рис. 7.9 54
Отбор. Функция отбора выбирает родителей для сле- дующего поколения на основе их масштабированных значе- ний, полученных от функции масштабирования пригодности. Особь может быть выбрана несколько раз как родитель, в этом случае она вносит свои гены в более чем одного потом- ка. Функция отбора по умолчанию, Stochastic uniform, разме- чает строку, в которой каждый родитель соответствует части строки с длиной, пропорциональной его масштабированному значению. Алгоритм проходит вдоль строки с шагом равного размера. На каждом шаге алгоритм выделяет родителя из раздела, на котором он расположен. Более детерминированная функция отбора - Remainder {Остаток), которая выполняет два шага. В первом шаге вы- бирает родителей соответственно целой части масштабиро- ванного значения для каждой особи. Например, если масшта- бированное значение особи 2.3, функция выбирает эту особь дважды как родителя. На втором шаге функция отбора вы- бирает дополнительных родителей, используя дробные части масштабированных значений, как в стохастическом универ- сальном отборе. Функция размечает строку на отрезки, дли- ны которых пропорциональны дробной части масштабиро- ванного значения особей, и проходит строку равными шага- ми, чтобы выбрать родителей. Обратите внимание на то, что, если дробные части мас- штабированных значений всегда равны нулю, как происхо- дит при использовании Top scaling {Главного масштабирова- ния), то выбор полностью детерминирован. Опции воспроизведения Опции воспроизведения кон- тролируют, как генетический алгоритм создает следующее поколение. Варианты опций: • Elite count - определённое число особей с лучшими значениями пригодности в текущем поколении, гарантиро- ванно попадающих в следующее поколение. Этих особей на- зывают элитными потомками. Значение по умолчанию для Elite count равно 2. Когда Elite count равно по крайней мере 1, лучшее значение пригодности может только уменьшиться от 55
одного поколения до следующего. Это то, что требуется, так как генетический алгоритм минимизирует функцию пригод- ности. Установка высокого значения Elite count заставляет самых подходящих особей доминировать в популяции, что может сделать поиск менее эффективным; • Crossover fraction - часть особей в следующем поколе- нии, кроме элитных потомков, которые создаются скрещива- нием. Мутация и скрещивание. Генетический алгоритм ис- пользует особей в текущем поколении, чтобы создать потом- ков, которые составляют следующее поколение. Помимо элитных потомков, которые соответствуют особям в текущем поколении с лучшей пригодностью, алгоритм создает: • потомков, полученных скрещиванием, выбирая век- торные записи или гены от пары особей в текущем поколе- нии и комбинируя их, чтобы сформировать потомков; • потомков, полученных мутацией, применяя случайные изменения к единственной особи в текущем поколении, что- бы создать потомка. Оба процесса важны для генетического алгоритма. Скрещивание включает алгоритм извлечения лучших генов от различных особей и повторного объединения их в потен- циально превосходящих по качеству потомков. Мутация до- бавляет разнообразия популяции и таким образом увеличи- вает вероятность, что алгоритм будет генерировать особей с лучшими значениями пригодности. Число потомков каждого типа, которое будет создавать алгоритм, можно задать следующим образом: • Elite count, в опциях Reproduction, определяет число элитных потомков. • Crossover fraction в опциях Reproduction определяет часть популяции, кроме элитных потомков, которые являют- ся перекрестными потомками. Например, если Population size равняется 20, Elite count равняется 2 и Crossover fraction равняется 0.8, число потом- ков каждого типа будет следующим: • два элитных потомка. 56
• оставшиеся 18 особей, кроме элитных, алгоритм округ- ляет 0.8*18 = 14.4 до 14, чтобы получить число потомков скрещивания; • оставшиеся четыре особи, кроме элитных, будут под- вергнуты мутации. Установка размеров мутации. Генетический алгоритм применяет мутации, используя функцию, которая определя- ется на панели Mutation function. Функция мутации по умол- чанию, Gaussian, добавляет случайное число или мутацию, выбранное из распределения Гаусса, к каждой записи роди- тельского вектора. Как правило, величина мутации, пропор- циональная стандартному отклонению распределения, уменьшается на каждом новом поколении. Можно управлять средним размером мутации, которую алгоритм применяет к родителю в каждом поколении через параметры Scale {Мас- штаб) и 8кппк{Уменъшениё)\ • Scale управляет стандартным отклонением мутации в первом поколении, которая является Scale, умноженным на диапазон начальной популяции, который определён парамет- ром Initial range; • Shrink управляет уровнем, в котором средний размер мутации уменьшается. Стандартное отклонение уменьшается линейно так, чтобы его окончательное значение равнялось 1 - Shrink раз его начального значения в первом поколении. Если Shrink имеет значение по умолчанию, равное 1, то размер мутации уменьшится до 0 на последнем шаге. Можно посмотреть эффект мутации, выбирая опции гра- фика Distance и Range и затем выполняя генетический алго- ритм для проблемы, такой как функция Растригина. Резуль- таты приведены на рис. 7.10. 57
Average Dis:an се between individuals 2r H' +""' ■/"' q| 1 1 \ 1 1 1 1 1 г"' t 10 2C 3C 40 50 60 70 80 90 100 „ * .,. _genera:ion Best, Worst, and Mean scores 200 г Q| , I , ' ■ "^ ' ,0 20 40 60 80 100 120 btoP I generation Рис. 7.10 Верхний график выводит на экран среднее расстояние между точками в каждом поколении. Поскольку размер му- тации уменьшается, то уменьшается и среднее расстояние между особями, которое приблизительно равно нулю в за- ключительной популяции. Нижний график выводит на экран вертикальную линию в каждом поколении, показывающую диапазон от самого ма- ленького до самого большого значения пригодности, а также среднее значение пригодности. Поскольку сумма мутации уменьшается, уменьшается и диапазон. Эти графики показывают, что сокращение размера мутации уменьшает разнообразие последующих поколений. Для сравнения на рис. 7.11 приведены графики для Distance и Range, когда устанавливается Shrink в 0.5. С Shrink равным 0.5 средний размер мутации уменьшается с коэффи- циентом 1/2 заключительной популяции. В результате сред- нее расстояние между особями уменьшается приблизительно с тем же коэффициентом. 58
Average Distance between individuals ■o 20 :iC 43 EC 60 7Й generation Best, Vvorst, and Mean scores 90 100 12П Рис. 7.11 Параметры доли скрещивания. Поле Crossover fraction в параметрах Reproduction определяет часть каждой популя- ции, кроме элитных потомков, которая составлена из потомков скрещивания. Crossover fraction, равная 1, означает, что все потомки, кроме элитных, - потомки скрещивания, в то время как Crossover fraction = 0 означает, что все потомки являются потомками мутации. Следующий пример показывает это. Ни одно из этих экстремальных значений не является эф- фективной стратегией оптимизации функции. В примере используется функция пригодности, значение которой в точке - сумма абсолютных значений координат точек, т.е. f(xl9x2,...9xn) = \хх\+|х2|+...+1*„| Можно определить эту функцию как анонимную, введя значение параметра Fitness function как @(х) sum(abs(x)) Выполним пример. 59
• введите Fitness function как @(x) sum (abs (x))\ • введите Number ofvariables равное 10; • задайте Initial range равным [-1; 1]; • выберите Best fitness и Distance в панели Plot func- tions. Выполните пример со значением по умолчанию 0.8 для Crossover fraction, в панели Options > Reproduction. Это воз- вращает лучшее значение пригодности приблизительно 0.2 и выводит графики, приведенные на рис. 7.12. ■с о1— stop | Best: 0.23492 Mean: 0.48445 10 20 зс 73 40 50 60 Generation Average Distance between individuals SO 10 20 3C 40 50 60 generation 7II BO 90 100 Si С 103 Рис. 7.12 Скрещивание без мутации. Чтобы посмотреть, как ге- нетический алгоритм выполняется, когда нет никакой мута- ции, задайте Crossover fraction равным 1.0 и нажмите Start. Это возвращает значение лучшей пригодности приблизи- тельно 1.3 и выводит графики, приведенные на рис. 7.13. 60
Best: 1.3161 Mean: 1.3161 1 I i i i i i i i i i i 10 20 30 40 50 60 70 80 90 100 Generation Average Distance between individuals 2.5 г 2 Г l.bk 11 \. qI ■ '- i i i i ■ ' ' ' ' slo 10 20 30 40 50 60 70 80 90 100 I generation РИС. 7.13 В этом случае алгоритм выбирает гены от особей в на- чальной популяции и повторно комбинирует их. Он не может создать новые гены, потому что нет никакой мутации. Алго- ритм генерирует лучшую особь, какую можно получить, ис- пользуя эти гены, в поколении номер 8, где лучшая пригод- ность выходит на постоянный уровень. После этого создают- ся новые копии лучшей особи, которые затем выбираются для следующего поколения. В поколении номер 17 все особи становятся лучшими. Когда это происходит, среднее рас- стояние между особями равно 0. Так как алгоритм не может улучшить значение пригодности после генерации 8, она не изменяется после еще 50 поколений, потому что Stall generations установлены в 50. Мутация без скрещивания. Чтобы посмотреть, как ге- нетический алгоритм выполняется, когда нет никакого скре- щивания, задайте значение Crossover fraction равным 0 и на- жмите Start. Ga возвращает лучшее значение пригодности 61
приблизительно 3.5 и выводит графики, приведенные на рис. 7.14. Best: 3.493 Mean: 11.2376 25г ... 20 [ '*•*••"% а * * *\ _^ | з» 'э Г .*• ♦ .*» (Л * .*. .. <в 10I 0 I ' ' ' ' ' ' ' ' ' ' 10 20 30 40 50 60 70 80 90 100 Generation Average Distance between individuals 14 г . 12 [■ «*' •' ' 4 "" • • • 4 I ' ' ' ' ' ' ' ' ' ' I 10 20 30 40 50 60 70 80 90 100 stop ' generation Рис. 7.14 В этом варианте случайные изменения, которые применяет алгоритм, никогда не улучшают значение пригодности лучшей особи в первом поколении. В то время как улучшаются отдель- ные гены других особей, как видно на верхнем графике по уменьшению среднего значения функции пригодности, эти улучшенные гены никогда не объединяются с генами лучшей особи, потому что скрещивание отсутствует. В результате лучший график пригодности - постоянный уровень и, алго- ритм останавливается на поколении номер 50. Сравнение результатов для изменения параметров скрещивания. Демонстрационный пример deterministicstudy.m, который включен в программное обес- печение, сравнивает результаты применения генетического алгоритма для функции Растригина со следующими значе- ниями параметра Crossover fraction: 0, .2, .4, .6, .8, и 1. Де- монстрационный пример выполняется за 10 поколений. В каждом поколении пример графически изображает средние и 62
стандартные отклонения лучших значений пригодности во всех предыдущих поколениях для каждого значения Crossover fraction. Запустите демонстрационный пример, введя determinis- ticstudy в командном окне Matlab. Когда пример закончится, появятся графики, приведенные на рис. 7.15. After 10 iIterations 0 0.2 0.4 0.6 0.8 1 CrossoverFraction Рис. 7.15 Нижний график показывает средние и стандартные от- клонения значения лучшей пригодности более чем 10 поко- лений для каждого из значений параметра скрещивания. Верхний график показывает цветовую маркировку лучших значений пригодности в каждом поколении. Для этой функ- ции пригодности установка значения Crossover fraction, рав- ного 0.8, даёт лучший результат. Однако для иной функции пригодности другое значение могло бы привести к лучшему результату. Глобальный минимум по сравнению с локальным. Ино- гда цель оптимизации состоит в том, чтобы найти глобаль- ный минимум или максимум функции - точку, где значение функции меньше или больше, чем в любой другой точке в 63
пространстве поиска. Однако алгоритмы оптимизации иногда возвращают локальный минимум - точку, где значение функции меньше, чем в соседних точках, но возможно боль- ше, чем в удаленной точке в пространстве поиска. Генетиче- ский алгоритм может иногда преодолевать этот недостаток при правильных настройках. Рассмотрим следующую функцию: /(*) = _ J - ехр(- (лг/20)2 ) для х < 20, [-exp(-l)+ 0-20)0-22) для х>20. Её график приведен на рис. 7.16 У функции есть два локальных минимума: один при х = О, где значение функции равно - 1, и другой при х = 21, где значение функции равно -1 - 1/е. Таким образом, последнее значение меньше и глобальный минимум достигается в точ- ке л: = 21. Выполним генетический алгоритм для этого примера: 1. Наберите следующий код в новом М-файле в редакто- ре Matlab. function у = two_min(x) if х<=20 у = -ехр(-(х/20).л2); 64
else y = -exp(-l) + (x-20)*(x-22); end 2. Сохраните файл как twojnin.m на диске, в доступной для Matlab папке. 3. в Optimization Tool: • в поле Fitness function введите: @two_min; • в поле Number of variables (число переменных) введите 1. • нажмите Start. Генетический алгоритм возвращает точку очень близко к локальному минимуму в точке х = О (рис. 7.17). Current iteration: |3] Clear Results 1 1 Optimization, running. IIOptimization terminated. [objective function value: -0.9999999894200482 [optimization terminated: average change in the fitness value lless than options.TolFun. ЖТ 1 Final point: 1 L~ -0.002 Рис. 7.17 Следующий пользовательский график (рис. 7.18) пока- зывает, почему алгоритм находит локальный минимум вме- сто глобального. График показывает диапазон особей в каж- дой популяции и лучшую особь. 65
Best: 0.00028487 _i I i i i i i i i i 10 20 30 40 50 60 70 80 90 100 Generation Рис. 7.18 Все особи находятся между -2 и 2.5. Хотя этот диапазон больше, чем Initial range {Начальный диапазон) по умолча- нию [0; 1], из-за мутации, этого недостаточно для исследова- ния точки около глобального минимума в х = 21. Один из способов заставить генетический алгоритм ис- следовать более широкий диапазон точек - увеличить разно- образие популяции, т.е. увеличить значение Initial range. На- чальный диапазон не должен включать точку х = 21, но дол- жен быть достаточно большим, чтобы алгоритм генерировал особей рядом с точкой jc = 21. Зададим Initial range: [0; 15], как показано на рис. 7.19. 66
В Population Population type: Population size: Creation function: Initial population: Initial scores: Initial range: Double Vector <? Use default: 20 Г" 5pecify: f Use constraint dependent default <£" Use default: [] С Specify: f <? Use default; [] С Specify: [ Г Use default: [0;1] <* Specify: |[0; 15]| A z\ Рис. 7.19 Затем нажмите Start. Генетический алгоритм возвращает точку очень близко к х=2\ (рис. 7.20). J 5Ь:'Р I Current iteration: Clear Results Changes pending. Changes applied.. Optimization running. Optimization terminated. Objective function value: -1.3675784348942295 Optimization terminated: average change in the fitness value less than options.TolFun. Final point: Рис. 7.20 На сей раз пользовательский график показывает намного более широкий диапазон особей (рис. 7.21). Во втором поколении особей значительно больше, чем 21, и популяцией номер 12 алгоритм находит лучшую особь, которая приблизительно равна 21. 67
■:,С Зез::20 9В75 10 20 30 40 50 60 70 80 90 100 Generation Рис. 7.21 Использование гибридной функции. Гибридная функция - функция оптимизации, которая выполняется после завер- шения генетического алгоритма, чтобы улучшить значение функции пригодности. Гибридная функция использует ко- нечную точку генетического алгоритма как начальную. Гиб- ридную функцию можно определить в параметрах Hybrid function. Этот пример использует функцию fminunc панели Optimization Toolbox, минимизация без ограничений. Сначала выполняют генетический алгоритм, чтобы найти точку, близ- кую к оптимальной точке, и затем используют эту точку в качестве начальной точки для fminunc. Определяется мини- мум функции Розенброка: f(xl9x2) = \00(x2-x?)2 +(\-хх)2 На рис. 7.22 показан график функции Розенброка. 68
Minimum at (1.1) Рис. 7.22 Программное обеспечение поддерживает М-файл, dejong2fcn.m, который вычисляет функцию Розенброка. Что- бы видеть демонстрационный пример, введите hybriddemo в командном окне Matlab. Введите optimtool {'ga*), чтобы открыть Optimization Tool для использования генетического алгоритма. Затем: • определите Fitness function как: @dejong2fcn; • определите Number of variables равной 2; • задайте Population size равной 10. Прежде чем добавить гибридную функцию, нажмите Start, чтобы выполнить генетический алгоритм самостоя- тельно. Генетический алгоритм выводит на экран результаты в панели Run solver and view results (рис. 7.23). Конечная точка близка к истинному минимуму в (1, 1). Можно улучшить этот результат, установив для Hybrid func- tion значение fminunc (в параметрах Hybrid function) (рис. 7.24). 69
Функция fminunc использует конечную точку генетиче- ского алгоритма как свою начальную. Это возвращает более точный результат, как показано в панели Run solver and view results (рис. 7.25). Start I Current iteration: [3 Op t im i z at i о n r uiir. i ng. Optimization terminated. Objective functicn value: 0.013555355151668522 Optimization terminated: average change in the fitness value less than cptions.TolFun. Final point: Рис. 7.23 В Hybrid function Hybrid function: | Options: (* Use default: [ ] С Specify: Рис. 7.24 70
Start | Pai Current iteration: Щ | Stop | Clear Results Optimization running. Switching to hybrid, function. Optimization terminated. Objective function value: 2.031019786495234E-11 Optimization terminated: average change in the fitness value less than opt ions.TolFun. FMINUNC: Optimization terminated: relative infinity-norm of gradient less than opt ions.TolFun. ~3 I Final point: 1 L. Рис. 7.25 Можно установить параметры для гибридной функции отдельно от вызова функции. Используйте optimset или psoptimset, чтобы создать структуру параметров: hybridopts = optimset(fdisplay7iterVLargeScale7off); В Optimization Tool введите имя структуры параметров в поле Options под Гибридной функцией (рис. 7.26). В Hybrid function Hybrid function: frrinunc Options: jhybridopts | "3 Рис. 7.26 В командной строке синтаксис следующий: options = gaoptimset(lHybridFcnl,{@fminunc,hybridopts}); hybridopts должен существовать прежде, чем установите па- раметры (опции). Установка максимального количества поколений. Оп- ция Generations в Stopping criteria {Критерии останова) оп- ределяет максимальное число поколений выполнения гене- 71
тического алгоритма. Увеличение параметров Generations часто улучшает окончательный результат. Измените настройки в Optimization Tool следующим об- разом: • укажите Fitness function как @rastriginsfcn; • определите Number of variables равной 10; • выберите Best fitness в панели Plot functions', • установите Generations как Inf • установите Stall generations как Inf • установите Stall time как Inf Выполните генетический алгоритм приблизительно для 300 поколений и нажмите Stop. Получающийся лучший график пригодности после 300 поколений приведен на рис. 7.27. Алгоритм устанавливается приблизительно на поколе- нии номер 170, т.е. не происходит никакого улучшения функции пригодности после популяции 170. Если восстана- вится параметр Stall generations в его значение, по умолча- нию равное 50, алгоритм завершится на поколении прибли- зительно 230. Если генетический алгоритм неоднократно в течение нескольких поколений устанавливается с текущими параметрами для Generations, можно попытаться увеличить параметры и Generations и Stall generations для улучшения результатов. Однако изменение других опций может быть более эффективным. 72
Best: 5.С44Л Wean: 48.7926 10Q 3D ED 70 ■': : :■ f s я 5 40 ?j ::■ •:■ ^p0 | 50 1DD 15C V 200 25D 100 ' Gen erationX Gwelк algorithm slab Рис. 7.27 Когда Mutation function установлена в Gaussian, увеличе- ние значений в Generations может фактически ухудшить окончательный результат. Это может произойти потому, что Гауссова функция мутации уменьшает среднюю сумму мута- ции в каждом поколении в степени, которая зависит от зна- чений, определённых в Generations. Следовательно, установ- ки для Generations влияют на поведение алгоритма. Векторизация функции пригодности. Генетический ал- горитм обычно работает быстрее, если векторизовать функ- цию пригодности. Это означает, что генетический алгоритм вызывает функцию пригодности только один раз, но при этом она вычисляет пригодность для всех особей в текущей популяции сразу. Для векторизации функции пригодности следует: • записать М-файл, который вычисляет функцию так, чтобы она принимала матрицу с произвольным числом строк, соответствующим особям в популяции. Например, для векторизации функции 2 2 /(x1?x2) = хх + 2ххх2 + 6хх + х2 - 6х2 запишите М-файл, используя следующий код: 73
function z = myfun(x) z = x (: , 1).л2 - 2*x (: , l).*x (:, 2) + 6*x (:, 1) + x (: , 2).л2 - 6*x (:, 2); Двоеточие в первой записи х указывает все строки х так, чтобы х (: , 1) был вектор. Операторы .Л и .* выполняют по- элементные операции над векторами; • установить параметру Vectorized значение 'on' с помо- щью функции gaoptimset в командном режиме или задать для User function evaluation > Evaluate objective/fitness and constraint functions значение vectorized, если используется графический интерфейс. Обязательно нужно передать структуру параметров ре- шателю. Использование myjun в качестве векторизованной функции пригодности для ga в командном режиме: options = gaoptimset(fVectorized7on'); [х fval] = ga(@my_fiin,2,[],[],[],[],[],[],[],options); Следующее сравнение, выполненное в командной стро- ке, показывает улучшение скорости при установке Vectorized в On: tic;ga(@rastriginsfcn,20);toc Elapsed time is 1.444426 seconds. options=gaoptimset(fVectorized7onf); tic;ga(@rastriginsfcn,20,[],[],[],[],[],[],[],options);toc Elapsed time is 0.112004 seconds. Если есть нелинейные ограничения, целевая функция и нелинейные ограничения должны быть векторизованы. Векторизация ограничений. Решатель ga может вычис- лять функции нелинейных ограничений набора векторов в одном вызове функции. Этот метод занимает меньше време- ни, чем вычисления функций для каждого вектора последо- вательно. Этот подход назван вызовом векторизованной функции. Чтобы решатель работал в векторной форме, нужно векторизовать и функцию пригодности, и функцию нелиней- ных ограничений. 74
Предположим, что имеются нелинейные ограничения для трехмерной проблемы: Xi/4 + xl/9 + x^/25<6, хъ >cosh(xj + х2), Следующий код дает эти нелинейные ограничения в век- торизованном виде, предполагая, что строки входной матри- цы х являются популяцией или входными векторами: function [с ceq] = nlinconst(x) с(:Д) = х(:,1).Л2/4 + х(:,2).л2/9 + х(:,3).л2/25 - 6; c(:,2) = cosh(x(:,l) + x(:,2))-x(:,3); ceq = x(:,l).*x(:,2).*x(:,3)-2; Например, минимизируется векторизованная квадратич- ная функция: function у = vfun(x) у = -х(:Д).л2-х(:,2).л2-х(:,3).л2; по области с ограничениями nlinconst: options = gaoptimsetCVectorizedVon'); [х fval] = ga(@vfun,3,[],[],[],[],[],[],@nlinconst,options) Optimization terminated: maximum number of generations ex- ceeded. x = -1.4098 -0.1216 11.6664 fval = -138.1066 8. ОГРАНИЧЕННАЯ МИНИМИЗАЦИЯ ПРИ ПОМОЩИ GA Предположим, что требуется минимизировать простую функцию пригодности двух переменных jci и х2 , min^ f(x) = 100(jt!2 - jc2)2 + (1 - xx)2 подверженных следующим нелинейным ограничениям: 75
xl x2 + xx - x2 +1.5 < 0 (iaeeiaeiia iadaie-^aie a) 10-^X2 <0 (iaeeiaeiia iadaie-^aie a) 0 < xx < 1 (adaieoa ) 0< x2 <13 (adaieoa ) Начните с создания функции пригодности и функции ограничений. Во-первых, создайте М-файл с именем simple Jitness.m следующим образом: function у = simple_fltness (х) у = 100 * (х (1) А2 - х (2)) А2 + (1 - х (1)) А2; Функция генетического алгоритма, ga, предполагает, что функция пригодности будет иметь один вход х9 где у х есть столько элементов, сколько переменных в проблеме. Функ- ция пригодности вычисляет значение функции и возвращает скалярную величину в её одном выходном параметре у. Затем создайте М-файл, simple_constraint.m, содержащий ограничения: function [с, ceq] = simple_constraint (х) с = [1.5 + х (1) *х (2) + х (1) - х (2);... -х(1)*х(2)+10]; ceq=[]; Функция ga предполагает, что функция ограничений возьмет входной х9 где х имеет столько же элементов, сколь- ко переменных в проблеме. Ограничительная функция вы- числяет значения всех неравенств и равенств ограничений и возвращает два вектора - с и ceq соответственно. Здесь ceq - пустая строка, поскольку ограничений в форме равенства нет. Чтобы минимизировать функцию пригодности, нужно передать указатель на функцию пригодности как первый па- раметр функции ga, а также определить число переменных как второй параметр. Нижние и верхние границы предусмот- рены как LB и UB соответственно. Кроме того, также нужно передать указатель на функцию нелинейных ограничений: ObjectiveFunction = @simple_fitness; nvars = 2; % Число переменных LB = [0 0]; % Нижняя граница UB = [1 13]; % Верхняя граница 76
ConstraintFunction = @simple_constraint; [x, fval] = ga (ObjectiveFunction, nvars, [], [], [], [], LB, UB, ... ConstrainFunction) Предупреждение: функция мутации 'mutationgaussian' только для минимизации без ограничений; используйте функцию мутации @mutationadaptfeasible. Введите @mutationadaptfeasible как опции MutationFcn, используя GAOPTIMSET. Оптимизация завершилась: текущий допуск на/(х) 1е- 007 меньше, чем options. TolFun, и нарушение ограничения меньше, чем options. TolCon: х = 0.8122 12.3122 fval = 1.3578е+004 Для проблемы минимизации с ограничениями функция ga изменила функцию мутации на @mutationadaptfeasible. Функция мутации по умолчанию, @mutationgaussian, подхо- дит только для проблемы минимизации без ограничений. Решатель генетического алгоритма обрабатывает линей- ные ограничения и границы иначе, чем нелинейные ограни- чения. Все линейные ограничения и границы удовлетворяют- ся в течение оптимизации. Однако ga может не удовлетво- рить все нелинейные ограничения в каждом поколении. Если ga сходится к решению, нелинейные ограничения будут удовлетворены в этом решении. GA использует функции му- тации и скрещивания, чтобы произвести новых особей в каж- дом поколении, удовлетворяет линейным и связанным огра- ничениям при помощи функций мутации и скрещивания, ко- торые генерируют только допустимые точки. Например, в предыдущий вызов ga функция мутации по умолчанию mutationguassian не будет удовлетворять линейным ограни- чениям, и поэтому вместо неё используется mutationadaptfeasible. Если применять пользовательскую функцию мутации, то она должна генерировать точки, удов- летворяющие линейным и связанным ограничениям. Все включенные функции скрещивания генерируют точки, кото- 77
рые удовлетворяют линейным ограничениям и границам, кроме функции crossoverheuristic. Определите mutationadaptfeasible как функцию мутации для проблемы минимизации при помощи функции gaoptimset: options = gaoptimset (fMutationFcn\@mutationadaptfeasible); Затем запустите ga - решатель: [х, fVal] = ga (ObjectiveFunction, nvars, [], [], [], [], LB, UB, ConstraintFunction, options) Оптимизация завершалась: текущий допуск на/(х) 1е- 007 меньше, чем options. TolFun, и нарушение ограничений меньше, чем options. TolCon: х = 0.8122 12.3122 fval = 1.3578е+004 Теперь используйте функцию gaoptimset, чтобы создать структуру опций, которая будет выбирать две функции гра- фика. Первая функция - gaplotbestf, которая изображает луч- шую и сред- нюю оценки популяции для каждой популяции. Вторая - gaplotmaxconstr - графически изображает максимальное на- рушение нелинейных ограничений в каждой популяции. Можно также визуализировать прогресс алгоритма, выводя на экран (рис. 8.1) информацию в командное окно, используя опцию 'Display9: options = gaoptimse^options/PlotFcns'jK^gaplotbestf^gaplotmaxconstrl/Display' /iter'); 78
enetic Algorithm File Edit View Insert Tools Desktop Window Help 15000 10000 5000 a 6 4 stop 10 10 Bes:: 13578.1801 Mean: 13578.1801 _i_ _i_ _i_ 40 50 60 Generation Max constraint: 0 70 40 50 Generation 70 Best fitness lulsan Tltness 80 80 90 100 100 Рис. 8.1 Повторно выполните ga-решатель: [x,fval] = ga(ObjectiveFunction,nvars,[ ],[ ],[ ],[ ],... LB,UB,ConstraintFunction,options) Generation 1 2 3 4 5 f-count 849 1567 2334 3043 3752 Best f(x) 14915.8 13578.3 13578.3 13578.3 13578.3 max constraint 0 0 0 0 0 Stall Generations 0 0 1 2 3 Optimization terminated: current tolerance on f(x) le-009 is less than options.TolFun and constraint violation is less than options.TolCon. x = 0.8122 12.3123 fval = 79
1.3578е+004 Можете предоставить ga стартовую точку для миними- зации определением параметра InitialPopulation. Функция ga будет использовать первую особь из этого параметра как стартовую точку для ограниченной минимизации: ХО = [0.5 0.5]; %Стартовая точка (вектор- строка) options = gaoptimset (options, 'InitialPopulation', ХО); Теперь повторно выполните ga-решатель: [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],... LB,UB,ConstraintFunction,options) Generation 1 2 3 f-count 965 1728 2422 Best f(x) 13579.6 13578.2 13578.2 max constraint 0 1.776e-015 0 Stall Generations 0 0 0 Optimization terminated: current tolerance on f(x) le-007 is less than options.TolFun and constraint violation is less than options.TolCon. x = 0.8122 12.3122 fval = 1.3578e+004 9. РЕШЕНИЕ СМЕШАННОЙ ЦЕЛОЧИСЛЕННОЙ ПРОБЛЕМЫ ИНЖЕНЕРНОГО ПРОЕКТИРОВАНИЯ С ИСПОЛЬЗОВАНИЕМ ГЕНЕТИЧЕСКОГО АЛГО- РИТМА 9.1. Проблема проектирования ступенчатой консольной балки Ступенчатая консольная балка закреплена на одном конце и нагружена на свободном конце, как показано на рис. 9.1. Требуется минимизировать объем балки при соблюдении ряда ограничений. Балка должна выдержать заданную нагрузку Р 80
на фиксированном расстоянии L от места заделки. Можно из- менить ширину bt и высоту hi каждой секции. Каждая секция имеет одинаковую длину /. Объем балки V является суммой объемов отдельных сек- ций: Рис. 9.1 Ограничение 1 - напряжение при изгибе. Рассмотрим консольную балку с началом координат в центре сечения на свободном ее конце. Напряжение при изгибе в точке (x,y,z) балки выражаются уравнением аь=М(х)у/1, где М(х) - изгибающий момент, х - расстояние от места при- ложения нагрузки, /-момент инерции сечения балки. В ступенчатой консольной балке, показанной на рис. 9.1, максимальный момент каждой секции равен PDh где Д - максимальное расстояние от места приложения нагрузки Р для каждой секции. Поэтому максимальное напряжение G/ для 1-й секции балки а,=Щ(А,/2)//,, 81
где максимальное напряжение появляется на краю балки для у = ht /2. Момент инерции сечения i-й секции балки Подставив это в уравнение для а,, получим а^бРД./бД2. Напряжение при изгибе в каждой части консоли не должно превышать максимального допустимого напряжения, атах . Следовательно, можно сформулировать пять ограниче- ний напряжения при изгибе (по одному для каждого шага консоли): 6Р//б5А52<атах; 6/>(2/)/г>4й42<атах; 6/>(3/)/^<W 6/>(4/)/б2А22<атах; 6P(5l)/btf<omax. Ограничение 2 - отклонение концевого сечения. От- клонение конца консоли можно вычислить, используя вто- рую теорему Кастиглиано, утверждающую, что 5 = dU/dP, где 8 - отклонение балки, U - энергия, сохраненная из-за приложенной силы Р; U = jLM2/2EIdx, где М - момент приложенной силы в jc. Учитывая, что М = Рх для консольной балки, можно записать вышеупомя- нутое уравнение так: U = P2/2EJl[(x + 4l)2/ll + (x + 3l)2/l2+(x + 2l)2/l3+(x + l)2/l4 +x2/l5]dx, где In - момент инерции сечения /-й части консоли. Вычис- ление интеграла дает следующее выражение для U: 82
U = (/>2/2)(/3/3£)(61/A + 37//2 +19//3 + HU +V's) Применяя теорему Кастиглиано, отклонение конца балки 5 = Р1ъ/ЪЕ{б\11х + 37//2 +19//3 + 7//4 +1//5 ) Теперь отклонение конца консоли 5, должно быть мень- ше, чем максимально допустимое отклонение 8тах, которое даёт нам следующее ограничение: Р1ъ1ъЕ{в\11х +37/12 +19//3 +7//4 +1//5)<8тах. Ограничения 3 - соотношение сторон. Для каждой ступени консоли соотношение сторон не должно превышать максимально допустимое соотношение ятах . Тогда ^•/МЯтах'ДЛ* * = 1,...,5. Теперь можно сформулировать проблему определения оптимальных параметров для ступенчатой консольной балки с установленными ограничениями. Устанавливаются: Х\=Ь^ х2 = \, хъ~^2-> х^=п2, х5 = 639 Х6="Ъ> Xj=b^, х8=А4, Хд = Ь$, х10 = А5. Минимизируется объём: V = /^XiX9 "г •Х'зХл ~г ХсХ^ "г ХпХо т -^о^Ю/ * 6P(2l)/x7xi < amax; 6P(3l)/x5x26 < vmax > 6Р(4/)Д3^<атах; 6Р(5/)Д,А22<атах. "У ^L(244/(Xlxl) + m/(x3xl) + 76/(x5xl) + 28/(х7х|) + У^))^ 8„ 83
x2/xi < 20, x4/x3 < 20, x6/x5 < 20, x%/x7 < 20, xl0/x9 < 20. Первая ступень балки может быть обработана с точно- стью до сантиметра, т.е. jci и х2 должны быть целочисленны- ми. Остающиеся переменные непрерывны. Границы для переменных: 1 < хх < 5 ; 30 < х2 < 65; 2.4<jc3,jc5<3.1; 45<л:4,х6 <60; 1<х7,х9 <5; 30<x8,x10 <65. Параметры для этой проблемы. Для проблемы, кото- рая решается в этом примере, балка должна выдерживать на- грузку, равную Р = 50000 Н. Общая длина балки L = 500 см, длина отдельной ступени / = 50 см, максимальное отклонение конца балки 5тах = 2,7 см, максимально допустимое напряжение на каждой ступени балки, отах = 14000 Н/см2, модуль Юнга каждой ступени балки £ = 2х 107 Н/см2. 9.2. Решение смешанной целочисленной проблемы оптимизации Определение функций пригодности и ограничений. Полезно изучить файлы Matlab cantileverVolume.m и cantile- verConstraints.т, чтобы понять, как реализованы функции пригодности и ограничений. Когда имеются линейные ограничения в ga9 то обычно они определяются через входные параметры: A, b, Aeq и beq. В рассматриваемом примере они определены через нелиней- ную ограничительную функцию. Это вызвано тем, что позже в этом примере некоторые переменные станут дискретными. 84
Если есть дискретные переменные, то намного проще опре- делить линейные ограничения в нелинейной ограничитель- ной функции. Альтернативный путь предполагает изменение матрицы линейных ограничений, чтобы работать в преобра- зованном пространстве переменных, который нетривиален и, возможно, невыполним. Кроме того, в смешанном целочис- ленном решателе ga линейные ограничения по-другому ни- как не преобразовать в нелинейные ограничения независимо от того, как они определены изначально. Установка границ. Создаются векторы, содержащие нижнюю границу (lb) и верхнюю границу (ub) ограничений: lb = [130 2.4 45 2.4 45 1 30 1 30]; ub = [5 65 3.1 60 3.1 60 5 65 5 65]; Задание параметров. Чтобы получить более точное ре- шение, увеличиваются параметры PopulationSize и Genera- tions по сравнению с их значениями по умолчанию и уменьшаются параметры EliteCount и TolFun. Эти настройки заставляют ga использовать более многочисленную популя- цию (увеличенный PopulationSize), увеличить пространство поиска (уменьшенный EliteCount) и продолжать работать, пока его лучший элемент не станет изменяться очень мало (небольшой TolFun). Также определяется графическая функ- ция, чтобы контролировать функцию штрафа, оценивая, как выполняется ga. Для задания указанных параметров используется функ- ция gaoptimset: opts = gaoptimset(... 'PopulationSize', 150,... 'Generations', 200,... 'EliteCount', 10,... 'TolFun', le-8,... 'PlotFcns', @gaplotbestf); Вызов ga для решения проблемы. Теперь можно вызвать ga, чтобы решить проблему. В данном примере jci и хг явля- ются целочисленными переменными. Это задаётся переда- чей на вход ga индексного вектора [1 2] после ввода нели- нейного ограничения и перед вводом параметров. Также 85
здесь задаются параметры генератора случайных чисел, по- зволяющие воспроизвести результаты: rng(0, 'twister');% параметры генератора [xbest, fbest, exitflag] = ga(@cantileverVolume, 10, [],[]>[]>[]> lb, ub, @cantileverConstraints, [1 2], opts); Optimization terminated: average change in the penalty fitness value lesst and constraint violation is less than options.TolCon. Результат показан на рис. 9.2. 12 10 0 (С Jr 6 ее с Q_ L 2 и x Ю4 Best: Б3295.4 Wean: 7038Б.З 4 ♦ Best penalty value Mean penalty value V 49 + + + - о 20 40 go so 100 120 uo igo ieo 20: Step ] [ Pause ] Gens rat ion Рис. 9.2 Анализ результатов. Если у проблемы есть целочис- ленные ограничения, ga повторно формулирует её внутренне. В частности, функция пригодности в проблеме заменяется штрафной функцией, которая обрабатывает ограничения. Для выполнимых особей функция штрафа совпадает с функцией пригодности. Решение, возвращенное ga, приведено ниже. Обратите внимание на то, что секция, ближайшая к заделке, ограниче- 86
на тем, что должна иметь целочисленные ширину (х\) и вы- соту (х2% и это ограничение соблюдено GA: display(xbest); xbest = Columns 1 through 7 3.0000 60.0000 2.8306 56.5985 2.5625 51.1946 2.2258 Columns 8 through 10 44.4991 1.7684 35.3489 Можно также попросить ga вернуть оптимальный объем балки: fprintf('\nCost function returned by ga = %g\n\ fbest); Cost function returned by ga = 63295.4 Добавление дискретных нецелочисленных ограниче- ний переменных. Предположим, что вторая и третья секции консоли могут иметь ширину и высоту, выбранные из стан- дартного набора. Покажем, как добавить это ограничение к проблеме оптимизации. Во-первых, зададим дополнительные ограничения, кото- рые будут добавлены к вышеупомянутой оптимизации: • ширина вторых и третьих секций балки должна быть выбрана из следующего набора: [2.4, 2.6, 2.8, 3.1] см; • высота вторых и третьих секций балки - из следующе- го набора: [45, 50, 55, 60] см. Чтобы решить эту проблему, нужно иметь возможность определить переменные хз, *4, *5? *б как дискретные. Компо- нент Xj определяется как принимающий дискретные значе- ния из множества S = и1,...,иЛ: и оптимизируется целочис- ленная переменная из диапазона от 1 до А:. В результате S(xj) используется как дискретное значение. Определяется диапа- зон (от 1 до к), устанавливается 1 как нижняя граница и к как верхняя граница. Таким образом, сначала преобразовываются границы дискретных переменных. Каждый набор возможных значе- 87
ний имеет четыре элемента, и дискретные переменные ото- бражаются в целые числа в диапазоне [1, 4]. Чтобы отобра- зить эти переменные в целые числа, устанавливается нижняя граница, равная 1, и верхняя граница, равная 4, для каждой из переменных: lb = [1 30 1 1 1 1 1 30 1 30]; ub = [5 65 4 4 4 4 5 65 5 65]; Преобразованные (целочисленные) версии л:3, *4, *5> *б будут теперь переданы функциям пригодности и ограниче- ний при вызове решателя ga. Для правильной оценки этих функций хз, JC4, х5, хв должны быть преобразованы в элемен- ты соответствующего дискретного набора. Посмотреть, как это сделано можно, изучив файлы Matlab: cantileverVolume- WithDisc.m, cantileverConstraintsWithDisc.m и cantileverMap- Variables.m. Теперь можно вызвать ga, чтобы решить проблему с дискретными переменными. В этом случае xb...,x6 являются целыми числами. Это означает, что передаётся индексный вектор 1:6 решателю ga для определения целочисленных пе- ременных. Результат приведен на рис. 9.3. rng(0, 'twister'); [xbestDisc, fbestDisc, exitflagDisc] = ga(@cantileverVolumeWithDisc, 10, [],[]>[ L [ L lb, ub, @cantileverConstraintsWithDisc, 1:6, opts); Optimization terminated: average change in the penalty fitness value less t and constraint violation is less than options.TolCon. 88
12 1' L 10 KID Best: 6457B.9 Wean: GS5GO.G Brst pcrratty value Mean penalty value 4 V + J 2D 40 GO 80 100 120 140 1G0 180 20D I stop ] [ Pause ] Generation Рис. 9.3 Анализ результатов. xbestDisc (3:6) возвращены ga как целые числа (т.е. в их преобразованном состоянии). Нужно произвести обратное преобразование, чтобы получить их реальные значения: xbestDisc = cantileverMapVariables(xbestDisc); display(xbestDisc); xbestDisc = Columns 1 through 7 3.0000 60.0000 3.1000 55.0000 2.6000 50.0000 2.2808 Columns 8 through 10 45.6154 1.7500 35.0000 Как и прежде, решение, возвращенное ga, соблюдает ог- раничение для jci и лег, которые являются целыми числами. Можно также видеть, что хз и jc5 выбраны из набора [2.4, 2.6, 89
2.8,3.1] см и jc4, хв из набора [45, 50, 55, 60] см. Вспомним, что были добавлены дополнительные огра- ничения для переменных х(3), х(4), х(5) и х(6). Как ожида- лось, когда есть дополнительные дискретные ограничения на этих переменных, у оптимального решения получается более высокий минимальный объем: fprintf('\nCost function returned by ga = %g\n', fbestDisc); Cost function returned by ga = 64578.9 Этот пример иллюстрирует, как использовать решатель генетического алгоритма, чтобы решить ограниченную нели- нейную проблему оптимизации, у которой есть целочислен- ные ограничения. Пример также показывает, как решить проблемы, у которых есть дискретные переменные. 10. МНОГОЦЕЛЕВАЯ ОПТИМИЗАЦИЯ Что такое многоцелевая оптимизация? Может потре- боваться сформулировать проблему, используя несколько целей, если единственная цель с несколькими ограничениями не может соответствующим образом ее представить. Можно записать вектор целей: F(x)^[Fl(x),F2(x),...,Fm(x)], который нужно откорректировать. Относительная важность этих целей обычно неизвестна, пока не определены лучшие возможности системы и не выяснены полностью компро- миссы между целями. С увеличением числа целей компро- миссы, вероятно, будут усложняться и труднее определяться количественно. Разработчик должен положиться на интуи- цию. Таким образом, требования для многоцелевой стратегии проектирования должны включать естественную формули- ровку, которая будет в состоянии решить проблему и ввести предпочтения в цифровой форме. 90
Многоцелевая оптимизация касается минимизации век- тора цели F(x% который может быть подвержен многим огра- ничениям: min nF(x), с учётом G((x) = 0, i = l,...,ke; G((x)<0, i = ke + \,...,k\ l<x<u. F(x) является вектором, и если какие-либо из компонен- тов F(x) конкурируют, то нет единственного решения этой проблемы. Используется понятие оптимума по Парето. Не- худшее решение - то, в котором улучшение одной цели тре- бует ухудшения другой. Для определения этого понятия бо- лее точно рассмотрим допустимую область, Q, в пространст- ве параметров; х - элемент «-мерных вещественных чисел х е Rn, который удовлетворяет всем ограничениям, т.е. Q = {xeRn}, с ограничениями Gt(x) = 09 i = l,...9ke; Gt(x)<0, i = ke+l9...,k; 1<х<и. Это позволяет определить соответствующую допусти- мую область для пространства целевой функции Л : A = {yeRm: j; = F(jc), х € Q}. Вектор F(x) отображает пространство параметров в про- странство целевой функции, как представлено для двухмер- ного случая на рис. 10.1. Точка нехудшего решения теперь может быть определе- на так: точка х* е Q является нехудшим решением, если для некоторого окружения jc* не существует Ах такого, что (х*+Ах)е£1 и F((x* + Ax)<Ft(x*)9 / = l,...,m, и Fj(x* + Ах) < Fj(x*) хотя бы для одногоу. 91
Рис. 10.1 В двумерном представлении на рис. 10.2 множество не- худших решений находится на кривой между точами С и D. Точки А и В представляют определенные нехудшие точки. Это действительно нехудшие точки решения, потому что улучшение одной целевой функции F\ требует ухудшения другой - F2, т.е. F\B < F\A, F2b > F2a- Так как любая точка в Q, которая является нижней (худшей) точкой, представляет точку, в которой улучшение может быть достигнуто во всех целях, то такая точка не представляет ценности. Поэтому многоцелевая оптимизация касается генерации и выбора не- худших точек решения. - N опллГeri or solutd ans FZAF4B Рис. 10.2 92
Нехудшие решения также вызывают оптимумом по Па- рето. Общая цель многоцелевой оптимизации - это получе- ние оптимума по Парето. Алгоритм реализован в функции gamultiobj. Формулировка проблемы. Решатель gamultiobj пытается создать набор решений, оптимальных по Парето для много- целевой минимизации. Можно дополнительно установить границы и линейные ограничения на переменные. Функция gamultiobj использует генетический алгоритм для того, чтобы найти локальный Парето-оптимум. Как в функции ga, можно определить начальную популяцию или предложить решате- лю генерировать её автоматически. Функция пригодности для использования в gamultiobj должна возвратить вектор типа double. Популяция может быть типа double, двоичной строкой (bit string vector) или вектором пользовательского типа. Как в ga, если использует- ся пользовательский тип популяции, то должны быть напи- саны собственные функции создания, мутации и скрещива- ния, которые принимают входы этого типа популяции и оп- ределяют эти функции в следующих полях: Creation function (CreationFcn), Mutation function (MutationFcn), Crossover function (CrossoverFcn). Можно установить начальную популяцию различными путями. Предположим, что выбирается популяция размером т. (Численность популяции по умолчанию в 15 раз превыша- ет число переменных п.) Можно установить популяцию: • как матрицу m-на-и, где строки представляют т осо- бей; • как матрицу А>на-л, где к < т. Оставшиеся (к - т) осо- би генерируются функцией создания (Creation function)', • вся популяция может быть сформирована функцией создания. Использование gamultiobj при помощи Инструмента оптимизации. Введите: optimtool ('gamultiobj') в командной строке. Затем нужно выбрать gamultiobj из меню Solver. Можно также запустить инструмент из меню Start Matlab (рис. 10.3). 93
Если панель справки закрыта, можно открыть ее щелч- ком по кнопке «»» в верхнем правом углу панели инстру- I ; ^"-у ; мента GUI: I ! rfff*s ; . Все доступные параметры кратко объяснены в панели справки. Можно создать структуру параметров в Инструменте оптимизации, экспортировать его в рабочую область Matlab и использовать структуру в командной строке. <fX Model-Based Calibration <ф, Neural Network <#OPC <ф, MATLAB <ф, Partial Differential Equation #RF <ф, Robust Control <$k Signal Processing <ф, Spline ф, Statistics ф, Symbolic Math <ф, System Identification ► 4* Virtual Reality i\ Wavelet ф Help ■§-■ Demos V5 Product Page (Web) КГ Щ Simulink Ш Blocksets .._/•] Shortcuts ЗУ Desktop Tools Q) Web *^j Preferences... g) Find Files... c^> Help *ф- Demos I Start Рис. 10.3 Пример. Есть функция пригодности fix) с двумя целями, где х также двумерный: function f = mymultil(x) 94
f(l) = х(1)л4 - 10*х(1)л2+х(1)*х(2) + х(2)л4 - (х(1)л2)*(х(2)л2); f(2) = х(2)л4 - (х(1)л2)*(х(2)л2) + х(1)л4 + х(1)*х(2); Создайте М-файл для этой функции. 1. Чтобы определить проблему оптимизации, нужно за- пустить Инструмент оптимизации и установить параметры, как показано на рис. 10.4. 2. Задать параметры для проблемы (рис. 10.5). Solver: | gamultiobj - Multiobjective optimization using Genetic Algori.,. ^ | Problem Fitness Function: Number oF variables: Constraints: Linear inequalities: Linear equalities: Bounds: T |<3>mvmultil -1- N A: | b: | Aeq: \ Lower: |[-5.-5] beq: \ Upper: |[5.5] Рис. 10.4 95
В Population Population type: Population size: | Double Vector Г Use default: 15*numberOf Variables <? Spedfy: |60 _i "3 ^^^^^^^^^ш В Multiobjective problem settings Distance measure function: (* Use default: @distancecrov\ding С Specify: | Pareto front population fraction; С Use default: 0.35 (? Specify: \j В Plot functions Plot interval: P Distance Г" Selection Г" Average Pareto distance P Custom function: 1 Г Genealogy P Stopping Г Rank histogram 1 Г Score diversity П7 Pareto front Г Average Pareto spread Рис. 10.5 3. Начать выполнение оптимизации щелчком по Start под Run solver and view results. Появится график (рис. 10.6), который показывает ком- промисс между двумя компонентами функции Дх). Результа- ты оптимизации появляются в нижеприведенной таблице, содержащей значения целевых функций и переменных. Можно сортировать таблицу, щелкая по заголовку. По- вторный щелчок по заголовку сортирует в обратном порядке. Результат щелчка по заголовку f\ показан на рис. 10.7. 96
Genetic Algorithm File Edt View Insert Tools Desktop WHdow Help ^Ш)х| 35 30 25 20 15 10 5 0 с * ~"SF ft ft "ft""' s 4 ft! Pareto front ^*ft *Ъ * * i i *** ft . ! J-—.-**—*-*-< i i ►—*- -A -40 -35 Stop | Pause | -30 -25 -20 Objective 1 -15 -10 Рис. 10.6 97
[Optimization running. loptimization terminated. [Optimization terminated: average chana^ in t.h.= [spread of Pareto solutions less ttian loptions.To1Fun. ^rw 1 Pareto front - function values and decision variables Index 1 2 3 4 5 6 7 3 " :: и 12 13 14 15 16 17 18 Fl -5.276 -38.325 -38.102 -36.608 -35.542 -32.215 -35.147 -20.527 -23.171 -13.605 -19.606 -38.23 -32.625 -38.281 -15.005 -5.276 -37.953 -33.579 F2 -0.25 32.745 27.784 19.667 17.129 10.845 15.884 2.142 3.879 0,408 1.897 29.507 12.019 30.518 0.724 -0.25 26.353 12.685 xl L. 0.709 2.666 2.567 2.372 2.295 2.075 2.25? 1.506 1.645 1.184 1.466 2.603 2.113 2.623 1.254 0.709 2.536 2.151 x2 -0.706 1.951 -1.888 -1.743 -1.833 -1.476 -1.777 -1.19 -1.03 -0.915 -1.076 -1.914 -1.77 -1.932 -0.903 -0.706 1.902 -1.583 Л. | '1 Ё4\ ►r P 1 - — 98
жт Pareto front - function values and dedsicn variables 1 Index 1 16 22 21 40 24 10 15 32 34 11 S 29 19 9 31 35 41 fl г -5.275 -5.276 -6.374 -8.299 -9.001 ■11.575 ■13.605 -15.005 -16.122 -17,394 -19.60S -20.527 -21.411 -22.33 ■23.171 ■25. HI ■26.413 -27.3 fe -D.25 -0.25 -0.195 -0.164 -0.119 0.105 0.403 0.724 0.9 1.365 1.897 2.142 2.791 3,014 3,974 4,341 5,115 6,131 xl 0,709 0,709 0,786 0,902 0,942 1 081 1,184 1,254 1,305 1,37 1.466 1.506 1.556 1,594 1,645 1,717 1,776 1,342 *2 -0,706 -0,706 -0,871 -0,874 -0,909 -0.889 -0,915 -0,903 -1,156 -0.933 -1.076 -1.19 -1,04 -1,145 -1,03 -1.3BB -1,367 -1,355 Д1 1 Pareto rent - function values and decision variables index 2 25 1 + 12 3 Г 38 30 28 33 4 27 5 ■ 26 37 36 18 fl L -38.325 -38.31+ -38.281 -38.23 -33,102 -37.953 -37.781 -37.517 -37.307 -37.121 -36.608 -36.188 -35.542 -35.147 -34.822 -34.511 -34.14 -33.579 fz 32.745 31.576 30.518 29,507 27.784 26.353 25.19 23.592 23.55 21.966 19.567 18.75 17.129 15.384 14.928 14.306 13.534 12.585 XI 2.666 2.641 2.623 2,50: 2.567 2.53Ё 2.509 2.472 2.467 2.431 2.372 2.341 2.295 2.25S 2.23 2.20S 2.18Ё 2.151 XZ -1.951 -1.946 -1.932 -1.914 -1.B8S -1.902 -1.B2E -1.B82 -1.717 -1.737 -1.743 -1.B48 -1.B33 -1.777 -1.67e| ■1.654 -i.es ■1.5вз| 1 .1 A. 1 Рис. 10.7 Выполнение оптимизации в командной строке. 1. Введите параметры: options = gaoptimset ('PopulationSize', 60,... 'ParetoFraction', 0.7, TlotFcn',@gaplotpareto); 2. Выполните оптимизацию, используя параметры: [х fval flag output population] = gamultiobj (@mymultil,2,... [], [], [], [], [-5,-5], [5,5], опции); Есть другие способы решения проблемы. На рис. 10.8 изображены кривые уровня двух целевых функций, границы Парето, вычисленные с помощью gamultiobj (квадраты), и х- значения истинных границ Парето (ромбы, соединенные поч- ти прямой линией). Точки истинных границ Парето располо- жены там, где кривые уровня целевых функций параллельны. График изображен в пространстве параметров. 99
Рис. 10.8 С помощью функции gamultiobj определены границы ли- нейного сегмента, обозначая найденный предел границ Паре- то. Параметры и синтаксису отличные от ga. Синтаксис и параметры для gamultiobj подобны имеющимся у ga, со следующими различиями: • нет нелинейных ограничений, таким образом, у функ- ции меньше входных параметров; • имеется параметр DistanceMeasureFcn, функция, кото- рая присваивает каждой особи критерий удалённости отно- сительно её соседей; • имеется параметр ParetoFraction, число между 0 и 1, которое определяет часть популяции на лучшей границе Па- рето для сохранения во время оптимизации. Если есть только одна граница Парето, то этот параметр игнорируется; 100
• используется только турнирная {Tournament) функция отбора; • используются элитные особи иначе, чем ga. Сортиру- ются нехудшие особи выше худших - автоматически; • есть только одна гибридная функция -fgoalattain; • нет ограничения по времени останова; • имеются в наличии различные функции для графиков; • нет выбора масштабирующей функции. 11. ПАРАМЕТРЫ ГЕНЕТИЧЕСКОГО АЛГОРИТМА Инструмент оптимизации по сравнению с командной строкой. Есть два способа опредения параметров генетиче- ского алгоритма, в зависимости от того, используется ли Ин- струмент оптимизации {Optimization Tool) или функция ga вызывается из командной строки: 1) если используется Инструмент оптимизации {optimtool), то параметр выбирается из выпадающего списка или его значение вводится в текстовом поле; 2) если ga вызывается из командной строки, то создается структура параметров, используя функцию gaoptimset, сле- дующим образом: options = gaoptimset (ТагатГ, valuel, Taram2f, value2...); В этом разделе каждый параметр упоминается двумя способами: меткой, соответствующей ему в Инструменте оптимизации, и именем поля в структуре параметров. Например: Population type — метка параметра в Инст- рументе оптимизации. PopulationType - соответствующее поле структуры пара- метров. Параметры графика. Параметры графика позволяют изобразить данные генетического алгоритма во время его выполнения. Когда выбраны функции графика и выполняется генетический алгоритм, графическое окно выводит на экран графики на отдельных осях. Щелкните по любому подграфи- 101
ку, чтобы просмотреть увеличенную версию графика в от- дельном графическом окне. Можно остановить алгоритм в любое время, щелкнув по кнопке Stop графического окна. Plot interval определяет число поколений между последова- тельными вызовами графической функции. Можно выбрать любую из следующих графических функций на панели Plot functions: • Best fitness (@gaplotbestf) - лучшее значение функции для поколения; • Expectation (@gaplotexpectation) - ожидаемое число потомков по сравнению с необработанным множеством в ка- ждом поколении. • Score diversity (@gaplotscorediversity) - гистограммы множества в каждом поколении; • Stopping (@plotstopping) - графики уровня останавли- вающих критериев; • Best individual (@gaplotbestindiv) - векторные записи осо- би с лучшим значением функции пригодности в каждом по- колении; • Genealogy (@gaplotgenealogy) - генеалогия особей. Линии от одного поколения до следующего имеют цветовую кодировку: красные линии указывают потомков мутации, синие линии указывают потомков, полученных скрещивани- ем, черные - элитных потомков; • Scores (@gaplotscores) - множество особей в каждом поколении; • Max constraint (@gaplotmaxconstr) - максимальное на- рушение нелинейного ограничения в каждом поколении; • Distance (@gaplotdistance) - среднее расстояние между особями в каждом поколении. • Range (@gaplotrange) - минимум, максимум и среднее значение функции пригодности в каждом поколении. • Selection (@gaplotselection) - гистограммы родителей. Custom function (Пользовательская функция) позволяет использовать собственные функции графика. Для определе- 102
ния функции графика, если используется Инструмент оп- тимизации, следует выбрать Custom function, ввести @myfun в текстовое поле, где myfun - имя Вашей функции. Чтобы вывести на экран график при вызове ga из ко- мандной строки, установите для поля PlotFcns структуры op- tions, в качестве его значения - указатель на графическую функцию. Например, для выведения на экран графика лучшей при- годности установите параметры следующим образом: options = gaoptimset ('PlotFcns', @gaplotbestf); Чтобы вывести на экран несколько графиков, используй- те синтаксис: options =gaoptimset ('PlotFcns', {@plotfunl, @plotfun2... }); где @plotfunl, @plotfun2 и т.д. являются указателями на гра- фические функции. Структура графических функций. У первой строки функции графика есть форма: function state = plotfun(options, state, flag) Входные параметры функции: • options - структура, содержащая все текущие настрой- ки параметров; • state - структура, содержащая информацию о текущем поколении; • flag - строка, которая указывает текущую стадию вы- полнения алгоритма. Структура состояния. Структура состояния, которая является входным параметром для графика, мутации и выхо- дов функций, содержит следующие поля: • Population - популяция в текущем поколении; • Score - множество текущей популяции; • Generation - номер текущего поколения; 103
• StartTime - время, когда генетический алгоритм стар- товал; • StopFlag - строка, содержащая причину остановки; • Selection - индексы особей, выбранных для элиты, скрещивания и мутации; • Expectation - ожидание выбора особей; • Best - вектор, содержащий лучшую оценку в каждом поколении; • Lastlmprovement - поколение, в котором произошло последнее улучшение пригодности; • LastlmprovementTime - время, в которое произошло по- следнее улучшение; • Nonlinlneq - нелинейные ограничения неравенства, выведенные на экран только когда определена нелинейная ограничительная функция; • NonlinEq - нелинейные ограничения равенства, выво- дятся на экран только когда определена нелинейная ограни- чительная функция. Параметры популяции. Параметры популяции позво- ляют определить характеристики популяции, для которой используется генетический алгоритм. Population type опреде- ляет тип входных данных функции пригодности. Можно ус- тановить Population type одного из следующих типов: • Double Vector - используется, если особи в популяции имеют тип double. Это - значение по умолчанию; • Bit string - используется, если особи в популяции явля- ются строками битов; • Custom - пользовательский тип. Используется при соз- дании популяции, тип которой не совпадает ни с одним из вышеперечисленных. Если используется пользовательский тип популяции, то требуется написать собственные функции создания, мутации и скрещивания, которые будут принимать входные данные этого типа, и определить эти функции в следующих полях соответственно: Creation function, Mutation function, Crossov- er function. 104
Population size определяет, сколько особей находится в каждом поколении. С большим размером популяции генети- ческий алгоритм исследует пространство решения более тщательно, таким образом уменьшая шанс того, что он воз- вратит локальный минимум, а не глобальный. Однако значи- тельный размер популяции заставляет алгоритм работать более медленно. Если Population size задаётся как вектор, то генетический алгоритм создает множество подпопуляций, число которых равно длине вектора. Размер каждой подпопуляций - соот- ветствующая запись вектора. Creation function {CreationFcn) определяет функцию, ко- торая создает начальную популяцию для ga. Можно выбрать из следующих функций: • Uniform (@gacreationuniform) - создает случайную на- чальную популяцию, распределённую по равномерному за- кону. Это - значение по умолчанию, если нет никаких огра- ничений; • Feasible population (@gacreationlinearfeasible) - созда- ет случайную равномерно распределённую начальную попу- ляцию, которая удовлетворяет всем границам и линейным ограничениям. При этом особи смещаются и попадают на границы, чтобы получить хорошо рассеянную популяцию. Это - значение по умолчанию, если есть линейные ограниче- ния; • Custom - позволяет записать свою собственную функ- цию создания, которая должна генерировать данные типа, который определяется в Population type. Для определения функции создания, если используется Инструмент оптими- зации, следует: задать Creation function как Custom, задать Function пате как @myfun, где myfun - имя пользователь- ской функции. Если используете функцию ga, введите options = gaoptimset ('CreationFcn', @myfun); Собственная функция создания должна иметь следую- щий синтаксис вызова: function Population = myfun(GenomeLength, FitnessFcn, options) 105
Входные параметры функции: Genomelength - число не- зависимых переменных для функции пригодности; FitnessFcn - функция пригодности; options - структура параметров. Функция возвращает Population начальную популяцию для генетического алгоритма. Initial population (InitialPopulation) определяет началь- ную популяцию для генетического алгоритма. Значение по умолчанию [ ], когда ga использует Creation function по умолчанию, для создания начальной популяции. Если вво- дится непустой массив в поле Initial population, у массива не должно быть строк больше, чем Population size, и точно Num- ber of variables столбцов. В этом случае генетический алго- ритм вызывает Creation function, чтобы генерировать остаю- щихся особей, при необходимости. Initial score s{InitialScores) определяет начальное множе- ство для начальной популяции. Начальное множество может также быть частичным. Initial range (PopInitRange) определяет диапазон векторов в начальной популяции, которая сгенерирована функцией создания. Можно установить Initial range матрицей с двумя строками и Initial range столбцов, каждый столбец которой имеет вид [lb; ub], где lb - нижняя граница и ub - верхняя граница для входных координат. Если Initial range определя- ется как вектор 2x1,то каждый вход расширяется до строки констант длиной Initial range. Параметры масштабирования пригодности. Масшта- бирование пригодности преобразовывает необработанное множество пригодности, которое возвращено функцией при- годности к значениям в диапазоне, подходящем для функции отбора. Можно определить параметры для масштабирования пригодности на панели Fitness scaling. Scaling function (FitnessScalingFcn) определяет функцию, которая выполняет масштабирование. Параметры: • Rank (@fitscalingrank) - функция масштабирования пригодности по умолчанию, масштабирует необработанное множество на основе разряда каждой особи вместо её оценки. Разряд особи - её позиция в отсортированном множестве. 106
Разряд самой подходящей особи равен 1, следующей, наибо- лее подходящей, 2 и т.д. Разряд масштабирования пригодно- сти удаляет эффект расползания необработанного множества; • Proportional (@fitscalingprop) - пропорциональное масштабирование делает масштабированное значение особи пропорциональным её необработанной оценке пригодности; • Top (@fitscalingtop) - главное масштабирование - масштабирует главных особей одинаково. Выбор Тор выводит на экран дополнительное поле - Quantity (Количество), определяющее число особей, которым присвоены положительные масштабируемые значения. Quantity может быть целым числом между 1 и численностью популяции или дробью от 0 до 1, определяющей часть чис- ленности популяции. Значение по умолчанию 0,4. Каждой из особей, которые производят потомков, при- сваивается равное масштабированное значение, в то время как остальным - значение 0. Масштабированные значения имеют форму [0 \1п \1п 0 0 \1п 0 0 1/и...]. Чтобы изменить значение по умолчанию для Quantity в командной строке, используйте следующий синтаксис: options = gaoptimset(TitnessScalingFcn', {@fitscalingtop, quanti- ty}), где quantity - значение Quantity, Shift linear (@fitscalingshiftlinear) сдвигает линейные масштабы необработанного множества так, чтобы математи- ческое ожидание самой подходящей особи было равно кон- станте, умноженной на среднюю оценку. Определяется кон- станта в поле Max survival rate (выживаемости), которое вы- водится на экран, когда выбирается Shift linear. Значение по умолчанию равняется 2. Изменить значение по умолчанию для Max survival rate в командной строке, можно, используя следующий синтаксис: options = gaoptimset(TitnessScalingFcn', {@fitscalingshiftlinear, rate}), где rate (уровень) - значение Max survival rate; 107
Custom позволяет записать свою собственную функцию масштабирования. Для определения функции масштабирова- ния, используя Инструмент оптимизации, следует устано- вить Scaling function как Custom, задать Function пате как @myfun, где myfun - имя собственной функции. Если используется ga в командной строке, то введите options = gaoptimset(TitnessScalingFcn', @myfun); У собственной функции масштабирования должен быть следующий синтаксис вызова: function expection = myfun(scores, nParents) Входные параметры функции: scores - вектор скаляров, один для каждого члена популяции; nParents - число роди- телей, необходимое от этой популяции. Функция возвращает expectation (мат. ожидание), вектор-строку скаляров той же длины, как и scores, дающую масштабированные значения каждого элемента популяции. Сумма записей expectation должна равняться nParents. Параметры выбора. Параметры выбора определяют, как генетический алгоритм выбирает родителей для следующего поколения. Можно определить функцию, которую алгоритм будет использовать в поле Selection function (SelectionFcn) параметра Selection. Возможности следующие: • Stochastic uniform (@selectionstochuniJ) - функция вы- бора по умолчанию - размечает строку, в которой каждый родитель соответствует отрезку строки длиной, пропорцио- нальной ее масштабированному значению. Алгоритм прохо- дит строку шагами равного размера. На каждом шаге алго- ритм выделяет родителя из раздела, на который он попадает. Первый шаг - универсальное случайное число, меньше, чем размер шага; • Remainder (@selectionremainder) - остаточный отбор - назначает родителей детерминированно по целой части мас- штабированного значения каждой особи, и затем использует- ся выбор с помощью рулетки для остающейся дробной части. 108
Например, если масштабированное значение особи 2.3, то эта особь назначается дважды как родитель, потому что целая часть равняется 2. После того, как родители были назначены согласно целым частям масштабированных значений, ос- тальная часть родителей выбирается стохастическим обра- зом. Вероятность того, что родитель будет выбран на этом шаге, пропорциональна дробной части его масштабированого значения; • Uniform {@selectionuniform) - универсальный отбор - выбирает родителей, используя ожидания {expectations) и число родителей. Полезен для отладки и тестирования, но не является очень эффективной поисковой стратегией; • Roulette (@selectionroulette) - выбирает родителей, мо- делируя колесо рулетки, в котором площадь сектора, соот- ветствующего особи, пропорциональна его ожида- нию (expectation). Алгоритм использует случайное число, чтобы выбрать один из секторов с вероятностью, равной его площади; • Tournament (@selectiontournament) - турнирная селек- ция - назначает каждого родителя, случайно выбрав Tournament size игроков, и затем лучшего из них отсылает в родители. Tournament size должен быть, по крайней мере, ра- вен 2. Значение по умолчанию - 4. Для изменения значения по умолчанию Tournament size в командной строке используется синтаксис: options = gaoptimset('SelectionFcn', {@selecttournament, size}), где size - значение Tournament size; • Custom - позволяет написать свою собственную функ- цию выбора. Для определения функции выбора, используя Инструмент оптимизации, следует задать Selection function как Custom, указать Function пате как @myfun, где myfun - имя собственной функции. Если используется ga в командной строке, введите options = gaoptimset('SelectionFcn', @myfun); Собственная функция выбора должена иметь следующий синтаксис вызова: 109
function parents = myfun(expectation, nParents, options) Входные параметры функции: expectation - ожидаемое число потомков для каждой особи; nParents - число родите- лей для отбора; options - структура параметров генетическо- го алгоритма. Функция возвращает parents, вектор-строку длиной nParents, содержащую индексы родителей, которых выбрали. Параметры воспроизведения. Параметры воспроизве- дения определяют, как генетический алгоритм создает до- черние элементы для следующего поколения. Elite count (EliteCount) определяет число особей, которые гарантировано доживут до следующего поколения. Значение Elite count - это положительное целое число, меньшее или равное численности популяции. Значение по умолчанию рав- няется 2. Crossover fraction (CrossoverFraction) определяет часть следующего поколения, кроме элитных потомков, которая произведена скрещиванием. Значение Crossover fraction - это дробь от 0 до 1, вводится в строку редактирования либо пе- ремещением ползунка. Значение по умолчанию - 0,8. Параметры мутации. Параметры мутации определяют, как генетический алгоритм делает небольшие случайные из- менения в особях популяции, чтобы создать потомков мута- ции. Мутация обеспечивает генетическое разнообразие и да- ёт возможность исследовать более широкое пространство. Можно определить функцию мутации в поле Mutation function (MutationFcn) панели параметров Mutation: • Gaussian (mutationgaussian) - функция мутации по умолчанию, Gaussian, добавляет случайное число, взятое от распределения Гаусса со средним значением 0 к каждой за- писи родительского вектора. Стандартное отклонение этого распределение определено параметрами Scale и Shrink, кото- рые выводятся на экран, когда выбирается Gaussian, и Initial range, установленные в параметрах Population. Параметр Scale определяет стандартное отклонение в первом поколении. Если устанавливается Initial range, как вектор v размером 2x1, начальное стандартное отклонение то по
же во всех координатах родительского вектора и задаётся как &flfe*(v(2)-v(l)). Если устанавливается Initial range, как вектор v с двумя строками и Number of Variables столбцов, то начальное стан- дартное отклонение в координате / родительского вектора задаётся как Scale*{v (i, 2) - v (i, 1)). Параметр Shrink определяет, как стандартное отклонение уменьшается от поколения к поколению. Если устанавлива- ется Initial range как вектор 2х 1, то стандартное отклонение в k-м поколении, а*, является одинаковым для всех координат родительского вектора и задаётся рекурсивной формулой ( к Л ок = ок_А 1 - Shrink . V Generations J Если устанавливается Initial range, как вектор с двумя строками и Number of Variables столбцов, то стандартное от- клонение в координате / родительского вектора в k-м поколе- нии, dfk, задаётся рекурсивной формулой ( к Л О; к = О} к_А 1 - Shrink . V Generations J Если устанавливается Shrink в 1, алгоритм уменьшает стандартное отклонение в каждой координате линейно, пока оно не достигнет нуля в последнем поколении. Отрицатель- ная величина Shrink заставляет стандартное отклонение вы- расти. Значение Scale и Shrink по умолчанию равняется еди- нице. Для изменения значений по умолчанию в командной строке используется синтаксис options = gaoptimset('MutationFcn', {@mutationgaussian, scale, shrink}), где scale и shrink - значения Scale и Shrink, соответственно; • Uniform (mutationuniform) - универсальная мутация - двухступенчатый процесс. Во-первых, алгоритм выбирает часть векторных записей особи для мутации, где у каждой записи есть Rate (Уровень) вероятности того, чтобы подвергнуться мутации. Значение по 111
умолчанию для Rate равно 0,01. На втором шаге алгоритм заменяет каждую выбранную запись случайным числом, вы- бранным однородно из диапазона для этой записи. Чтобы изменить значение по умолчанию Rate в команд- ной строке, используется синтаксис options = gaoptimset('MutationFcn', {@mutationuniform, rate}), где rate - значение Rate; • Adaptive Feasible (mutationadaptfeasible) - в произволь- ном порядке генерирует направления, которые адаптивны относительно последнего успешного или неуспешного поко- ления. Выполнимая область подвержена ограничениям. Длина шага выбирается вдоль каждого направления так, что- бы линейные ограничения и границы были удовлетворены; • Custom - позволяет записать свою собственную функ- цию мутации. Для определения функция мутации, используя Инструмент оптимизации, следует задать Mutation function, как Custom, указать Function пате, как @myfun, где myfun - имя собственной функции. Если используется ga, введите options = gaoptimset('MutationFcn', @myfun); Собственная функция мутации должна иметь следующий синтаксис вызова: function mutationChildren = myfun(parents, options, nvars, ... FitnessFcn, state, thisScore, thisPopulation) Параметры функции: parents - вектор-строка родителей, выбранных функцией выбора; options - структура парамет- ров; nvars - число переменных; FitnessFcn - функция при- годности; state - структура, содержащая информацию о те- кущем поколении; thisScore - вектор оценок текущей попу- ляции; thisPopulation - матрица особей текущей популяции. Функция возвращает mutationChildren - видоизмененных потомков - как матрицу, строки которой соответствуют по- томкам. Число столбцов матрицы равно Number of variables. 112
Параметры скрещивания. Параметры скрещивания оп- ределяют, как генетический алгоритм комбинирует двух осо- бей или родителей, чтобы сформировать потомков скрещи- вания для следующего поколения. Crossover function (CrossoverFcn) определяет функцию, которая выполняет скрещивание. Можно выбрать из следую- щих функций: • Scattered (@crossoverscattered) - функция скрещивания по умолчанию - создает случайный двоичный вектор и вы- бирает гены для потомка в зависимости от значений в этом векторе. Если в векторе 1, то берётся ген от первого родите- ля, если в векторе 0, то - от второго. Отобранные гены фор- мируют потомка. Например, если pi и р2 родители: pi = [a b с d е f g h] р2 = [1 2 3 4 5 6 7 8] и двоичный вектор [1100100 0], функция возвращает сле- дующего потомка: childl = [ab 3 4 е 6 7 8] • Single point (@crossoversinglepoint) выбирает случай- ное целое число п между 1 и Number of variables и затем: - выбирает векторные записи, с номерами меньше или равные п от первого родителя; - выбирает векторные записи, с номерами больше, чем п от второго родителя; - связывает эти записи, чтобы сформировать дочерний вектор. Например, если pi и р2 - родители pi = [ab cde fgh] р2 = [1234 5 67 8] и точка скрещивания равняется 3, то функция возвращает следующего потомка: child = [abc45 67 8] • Two point (@crossovertwopoint) - выбирает два случай- ных целых числа тип между 1 и Number of variables. Функ- ция выбирает: 113
- векторные записи с номерами меньше или равными т от первого родителя; - векторные записи, с номерами т+1 до и, включительно, от второго родителя; - векторные записи с номерами больше, чем п от первого родителя. Алгоритм связывает эти гены, чтобы сформировать единственный ген. Для примера, если pi и р2 - родители pi = [abcde fgh] р2 = [12345678] и точки скрещивания равняются 3 и 6, то функция возвраща- ет следующего потомка: child = [abc456gh] • Intermediate {@crossoverintermediate) - создает потом- ка, беря взвешенное среднее родителей. Можно определить веса единственным параметром - Ratio, который может быть скаляром или вектором-строкой длиной Number of variables. Значение по умолчанию - вектор из единиц. Функция создает потомка от parentl и parent!, используя следующую форму- лу: child = parentl + rand * Ratio * (parentl - parentl) . Если все записи Ratio находятся в диапазоне [0, 1], то произведенные потомки расположены в гиперкубе, опреде- ленном размещением родителей в противоположных верши- нах. Если Ratio не находится в этом диапазоне, то потомки могут быть вне гиперкуба. Если Ratio - скаляр, тогда все по- томки лежат на строке между родителями. Чтобы изменить значение по умолчанию для Ratio в ко- мандной строке, используется синтаксис: options = gaoptimset('CrossoverFcn', {@crossoverintermediate, ra- tio}), где ratio - значение Ratio; • Heuristic (@crossoverheuristic) - возвращает потомка, который лежит на линии, связывающей двух родителей, на маленьком расстоянии от родителя с лучшим значением 114
пригодности в направлении, противоположном родителю с худшим значением пригодности. Можно определить, как да- лек дочерний элемент от лучшего родителя параметром Ratio, который появляется, когда выбирается Heuristic. Зна- чение по умолчанию для Ratio равно 1,2. Если parent 1 и parent! - родители, и у parentl имеется лучшее значение пригодности, то функция возвращает потомка: child = parentl + Ratio * {parentl - parentl) . Чтобы изменить значение по умолчанию Ratio в ко- мандной строке, используется синтаксис options=gaoptimset(,CrossoverFcn', {@crossoverheuristic,ratio}), где ratio - значение Ratio; • Arithmetic (@crossoverarithmetic) - создает потомков, которые являются взвешенным среднеарифметическим двух родителей. Потомки всегда выполнимы относительно линей- ных ограничений и границ; • Custom - позволяет записать свою собственную функ- цию скрещивания. Для определения собственной функции скрещивания, используя Инструмент оптимизации, следует задать Crossover function как Custom, задать Function name как @myfun, где myfun - имя собственной функции. Если используется ga, введите options = gaoptimsetCCrossoverFcn'^myfun); Собственная функция скрещивания должена иметь сле- дующий синтаксис вызова: xoverKids = myfun(parents, options, nvars, FitnessFcn, un- used,thisPopulation) Параметры функции: parents - вектор-строка родителей, выбранных функцией выбора; options - структура парамет- ров; nvars - число переменных; FitnessFcn - функция при- годности; unused - заполнитель, неиспользуемый; thisPopulation - матрица, представляющая текущую популя- 115
цию. Число строк матрицы равно Population size, число столбцов равно Number of variables. Функция возвращает xoverKids - потомков скрещивания - как матрицу, чьи строки соответствуют потомкам. Число столбцов матрицы равно Number of variables. Параметры миграции. Параметры миграции определя- ют, как особи перемещаются между подпопуляциями. Ми- грация происходит, если устанавливается Population size как вектор с длиной больше 1. Когда миграция происходит, луч- шие особи одной подпопуляции заменяют худших в другой. Особи, мигрирующие из одной подпопуляции в другую, про- сто копируются. Они не удаляются из исходной подпопуля- ции. Можно управлять выполнением миграции следующими тремя полями на панели параметров Migration: 1. Direction (MigrationDirection) - миграция может иметь место в одном или обоих направлениях. Если устанавливается Direction, как Forward (forward*), то миграция имеет место к последней подпопуляции, т.е. п-я подпопуляция мигрирует в (и+1)-ю. Если устанавливаете Direction, как Both ('both*), то п- я подпопуляция мигрирует и в (п-1)-ю и в (и+1)-ю. Миграция переносится в концах подпопуляции, т.е. последняя подпопу- ляция мигрирует в первую и первая может мигрировать в по- следнюю. 2. Interval (Migrationlnterval) - определяет, сколько поко- лений проходит между миграциями. Например, если уста- навливается Interval равное 20, то миграция имеет место че- рез каждые 20 поколений. 3. Fraction (MigrationFraction) - определяет, сколько особей перемещается между подпопуляциями. Fraction опре- деляет часть меньшей из двух подпопуляции, которая пере- мещается. Например, если особи мигрируют из подпопуля- ции, насчитывающей 50 особей, в подпопуляцию численно- стью 100 особей и устанавлено значение Fraction равное 0,1, то число мигрирующих особей равно 0,1 * 50 = 5. 116
Настройки алгоритма. Настройки алгоритма определя- ют некоторые параметры алгоритма. Параметры, которые мо- гут быть определены для алгоритма с нелинейными ограниче- ниями, включают: • Initial penalty (InitialPenalty) - определяет начальное значение параметра штрафа, который используется алгорит- мом. Initial penalty должен быть больше или равен единице; • Penalty factor (Penaltyf"actor) - увеличение параметра штрафа, когда проблема не решена с требуемой точностью и ограничения не удовлетворены. Penalty factor должен быть больше единицы. Многоцелевые параметры. Многоцелевые опции опре- деляют характеристику параметров многоцелевого генетиче- ского алгоритма. Можно определить следующие параметры: • DistanceMeasureFcn - определяет указатель функции, которая вычисляет меру удалённости особей, вычисленных в переменной решения или пространстве алгоритма (генотип) или в функциональном пространстве (фенотип). Например, значение по умолчанию функция меры удалённости - distancecrowding в функциональном пространстве или {@distancecrowding, 'phenotype'}\ • ParetoFraction - устанавливает часть особей для сохра- нения в первом выходе Парето, в то время как решатель вы- бирает особей из более высоких выходов. Этот параметр - скаляр между 0 и 1. Параметры гибридных функций. Гибридная функция - другая функция минимизации, которая выполняется после завершения генетического алгоритма. Можно определить гибридную функцию в параметрах Hybrid function (HybridFcn). Возможные варианты: [ ] - нет гибридной функции; fminsearch (@fminsearch) - использование Matlab функ- ции fminsearch для выполнения минимизации без ограниче- ний; 117
patternsearch (@patternsearch) - использование pattern search, чтобы выполнить минимизацию с ограничениями или без ограничений; fminunc {@fminunc) - использование функции fminunc панели Инструментов оптимизации {Optimization Toolbox) для выполнения минимизации без ограничений; fmincon (@fmincon) - использование функции fmincon панели Инструментов оптимизации (Optimization Toolbox) для выполнения минимизации с ограничениями. Можно установить отдельную структуру параметров для гибридной функции. Используется psoptimset или optimset для создания структуры, в зависимости от того, используется ли гибридная функция -patternsearch или нет: hybridopts = optimset(?displayViterVLargeScale',?off); Включаются гибридные параметры в структуру парамет- ров генетического алгоритма следующим образом: options = gaoptim- setfaptions/HybridFcn', {@fminunc,hybridopts}); hybridopts должен существовать прежде, чем установливается options. Параметры критериев останова. Останавливающие критерии определяют то, что заставляет алгоритм завершать- ся. Можно определить следующие параметры: • Generations (Generations) - определяют максимальное количество итерации для выполнения генетического алго- ритма. Значение по умолчанию равно 100; • Time limit (TimeLimit) - определяет максимальное вре- мя выполнения генетического алгоритма, в секундах, перед остановкой; • Fitness limit (FitnessLimit) - алгоритм останавливается, если лучшая пригодность имеет значение, меньшее или рав- ное величине Fitness limit; • Stall generations (StallGenLimit) - алгоритм останавли- вается, если взвешенное среднее изменение в значении 118
функции пригодности за число поколений, равное Stall generations, меньше, чем Function tolerance', • Stall time limit (StallTimeLimit) - алгоритм останавлива- ется, если нет улучшения значения лучшей пригодности в течение интервала времени в секундах, равного Stall time; • Function tolerance (TolFun) - алгоритм выполняется, пока совокупное изменение в значении функции пригодности по Stall generations поколениям не станет меньше или равным величине Function tolerance; • Nonlinear constraint tolerance (TolCon) - не использует- ся в качестве останавливающегося критерия. Используется, чтобы определить выполнимость относительно нелинейных ограничений. Параметры функций вывода. Функции вывода - функ- ции, которые генетический алгоритм вызывает в каждом по- колении. Доступны следующие параметры: • History to new window (@gaoutputgen) - выводит на эк- ран историю точек, вычисленных алгоритмом, в новом окне на каждой итерации, кратной значению Interval; • Custom - позволяет записать свою собственную функ- цию вывода. Для определения функции вывода, используя Инструмент оптимизации, следует выбрать Custom function, ввести @myfun в текстовое поле, где myfun - имя собствен- ной функции. Если используется ga, введите options = gaoptimset('OutputFcn',@myfun) Чтобы увидеть шаблон, который можно использовать, чтобы записать собственные функции вывода, введите edit gaoutputfcntemplate в командной строке Matlab. Структура функции вывода. У функции вывода есть следующий синтаксис вызова: [state,options,optchanged] = myfun(options,state,flag,interval) 119
Входные параметры: options - структура параметров; state - структура, содержащая информацию о текущей попу- ляции; flag - строка, указывающая текущий статус алгоритма следующим образом: 'init'- начальная стадия; 'iter' - выполнение алгоритма; 'interrupt'- промежуточная стадия; 'done'- алгоритм завершился; interval - дополнительный параметр интервала. Функция вывода возвращает следующие параметры ga: • state - структура, содержащая информацию о текущем поколении; • options - структура параметров, изменённая функцией вывода. Это параметр дополнительный; • optchanged - флаг, указывающий на изменения в пара- метрах. Параметры вывода в командное окно. Level of display {'Display') определяет, сколько информации выводится на экран в командной строке во время работы генетического алгоритма. Доступные параметры: • Off {'off)- нет вывода; • Iterative {'iter') - информация выводится на экран на каждой итерации; • Diagnose {'diagnose') - информация выводится на экран на каждой итерации. В дополнение диагностика перечисляет некоторую проблемную информацию и параметры, у кото- рых были изменены значения по умолчанию; • Final {'final') - причина остановки выводится на экран. Iterative и Diagnose выводят на экран следующую инфор- мацию: Generation - номер поколения; f-count - совокупное число оценок функции пригодности; Best f(x) - лучшее значение функции пригодности; Mean f(x) - среднее значение функции пригодности; Stall generations - число поколений, начиная с последне- го улучшения функции пригодности. 120
Когда определена нелинейная ограничительная функция, Iterative и Diagnose не будут выводить на экран Meanf(x), но дополнительно будет выведено Max Constraint - максималь- ное нарушение нелинейного ограничения. Значения по умолчанию для Level of display следующие: off в инструменте оптимизации, 'final' в структуре опций, созданной с использованием gaoptimset. Параметр векторизации. Параметр векториза- ции (vectorize) определяет, векторизовано ли вычисление пригодности. Установка значения параметра Set Objective function is vectorized в On указывает, что функция пригодно- сти векторизована. Когда этот параметр выключен (off), ал- горитм вызывает функцию пригодности для каждой особи заново, циклически по всей популяции. 12. СВОДНАЯ ХАРАКТЕРИСТИКА ФУНКЦИЙ ГЕНЕТИЧЕСКОГО АЛГОРИТМА ga. Назначение: находит минимум функции, используя гене- тический алгоритм. Синтаксис: х = ga(fitnessfcn,nvars) х = ga(fitnessfcn,nvars,A,b) х = ga(fitnessfcn,nvars,A,b,Aeq,beq) х = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB) x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon) x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options) x = ga(problem) [x,fval] = ga(...) [x,fval,exitflag] = ga(...) Описание: ga реализует генетический алгоритм в ко- мандной строке, чтобы минимизировать целевую функцию. х = ga (fitnessfcn, nvars) - находит локальный неограни- ченный минимум, jc, целевой функции fitnessfcn. nvars - раз- мерность (число переменных) функции fitnessfcn. Целевая 121
функция, fitnessfcn, принимает вектор х размера lxnvars и возвращает скаляр, определённый для входного х. х = ga (fitnessfcn, nvars, A, b) - находит локальный мини- мум х для fitnessfcn согласно линейным неравенствам A*x<b. Fitnessfcn принимает ввод х и возвращает значение скалярной функции, оценённое в х. Если у проблемы есть т линейных ограничений неравен- ства и п переменных, то А - матрица размера m-на-л; Ъ - век- тор длины т. Обратите внимание на то, что линейные огра- ничения не удовлетворены, когда параметр PopulationType установлен как 'bitString'или 'custom*. х = ga {fitnessfcn, nvars, A, b, Aeq, beq) - находит локаль- ный минимум x для fitnessfcn согласно линейным равенствам Aeq х х = beq , а также А*х<Ь. (Установите = [] и b = [], ес- ли никакие неравенства не существуют.) Если у проблемы есть г линейных ограничений равенства и п переменных, то Aeq - матрица размера r-на-и, beq - вектор длины г. Обрати- те внимание на то, что линейные ограничения не удовлетво- рены, когда параметр PopulationType установлен как 'bitString'или 'custom'. х = ga (fitnessfcn, nvars, A, b, Aeq, beq, LB, UB) - опреде- ляет ряд нижних и верхних границ для переменных х, так, чтобы решение было найдено в диапазоне LB<x<UB. Ис- пользуются пустые матрицы для LB и UB, если границы не существуют. Задают LB(i) = -inf если x(i) не ограничен снизу, и UB(i) = -inf, если jc(/) не ограничен сверху. х = ga (fitnessfcn, nvars, A, b, Aeq, beq, LB, UB, nonlcon) - предспавляет минимизацию с ограничениями, определеными в nonlcon. Функция nonlcon принимает х и возвращает векто- ры С и Ceq, представляющие нелинейные неравенства и ра- венства соответственно, ga минимизирует fitnessfcn так, что С (х) < О и Ceq(x)=0. (Задаётся LB = [] и UB = [], если никакие границы не существуют.) Обратите внимание на то, что нелинейные ограничения не удовлетворены, когда параметр PopulationType установлен как 'bitString' или 'custom'. 122
х = ga (fitnessfcn, nvars, A, b, Aeq, beq, LB, UB, nonlcon, options) - минимизирует с параметрами оптимизации по умолчанию, замененными значениями в структуре options, которая может быть создана, используя функцию gaoptimset. х = ga (problem) находит минимум для проблемы, где проблема - структура, содержащая следующие поля: fitnessfcn - функция пригодности, nvars - число переменных, Aineq - матрица для линейных ограничений неравенства, Bineq - вектор для линейных ограничений неравенства, Aeq - матрица для линейных ограничений равенства, Beq - вектор для линейных ограничений равенства, lb - нижняя граница на х, ub - верхняя граница на х, nonlcon - нелинейная ограничительная функция, rngstate - нобязательное поле, чтобы сбросить состояние генератора случайных чисел, intcon - вектор индексов целочисленных переменных, solver - *ga\ options - структура параметров, созданная, используя функцию gaoptimset. Создаётся структура problem, экспортируя проблему из Optimization Tool. [х, foal] = ga (...) - возвращает foal, значение функции пригодности в JC. [х, foal, exit/lag] = ga (...) - возвращает exit/lag - целое число, указывающее причину завершения алгоритма. Сле- дующий список поясняет значения exit/lag и соответствую- щие причины завершения алгоритма: 1 - среднее совокупное изменение значения пригодности в течение options.StallGenLimit поколений меньше, чем options. TolFun и нарушение ограничений меньше, чем options. TolCon; 2 - предел пригодности достигнут и нарушение ограни- чений меньше, чем options. TolCon; 3 - значение функции пригодности не изменилось за options.StallGenLimit поколений и нарушение ограничений меньше, чем options.TolCon; 123
4 - величина шага, меньшего, чем точность машины, и нарушение ограничений меньше, чем options. TolCon; О - максимальное количество поколений превышено; -1 - оптимизация, завершенна выводом или функцией графика; -2 - никакая допустимая точка не найдена; -4 - ограничение по времени останова превышено; -5 - ограничение по времени превышено. [х, foal, exit/lag, output] = ga (...) - возвращает output, структуру, которая содержит вывод от каждого поколения и другую информацию о выполнении алгоритма. Структура output содержит следующие поля: rngstate - поле, используемое для сброса состояния гене- ратора случайных чисел, при необходимости воспроизведе- ния результатов ga, generations - число обработанных поколений, funccount - число оценок функции пригодности, message - причина завершения алгоритма, maxconstraint - максимальное нарушение ограничения, если таковые имеются. [xfoal,exitflag,output,population] = ga{...) - возвращается матрица population, строки которой представляют заключи- тельную популяцию. [xfoal,exitflag,output,population,scores] = ga{...) - возвра- щается scores - множество заключительной популяции. Для проблем, которые используют тип населения Double Vector (значение по умолчанию), ga не принимает функции, вводы которых имеют тип complex. Чтобы решить проблемы, включающие комплексные данные, нужно написать функции так, чтобы они принимали реальные векторы, разделяя дей- ствительные и мнимые части. Пример. Даны следующие ограничения неравенства и нижние границы: И 2\и р 2 L 2 lJ L3J 124
следующий код находит минимум функции, Uncontest6, кото- рая имеется в Matlab: А = [11;-12;21]; Ь = [2;2;3]; lb = zeros (2,1); [х, fVal, exitflag] = ga (@lincontest6... 2, A, b, [],[], lb) Оптимизация завершилась: среднее изменение пригодно- сти оценивается меньше, чем options. TolFun. х = 0.7794 1.2205 fval = -8.03916 exitflag = 1 gamultiobj. Назначение: находит минимумы многократных функций, используя генетический алгоритм. Синтаксис: X = gamultiobj(FITNESSFCN,NVARS) X = gamultiobj(FITNESSFCN,NVARS,A,b) X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq) X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq,LB,UB) X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq,LB,UB,options) X = gamultiobj (problem) [XJFVAL] = gamultiobj(FITNESSFCN,NVARS,...) [X,FVAL,EXITFLAG] = gamultiobj(FITNESSFCN,NVARS,...) [X,FVAL,EXITFLAG,OUTPUT] = gamultiobj(FITNESSFCN,NVARS, ...) [X,FVAL,EXITFLAG,OUTPUT,POPULATION] = gamultiobj (FIT- NESSFCN,...) [X,FVAL,EXITFLAG,OUTPUT,POPULATION, SCORE] = gamultiobj(FITNESSFCN,...) 125
Описание: gamultiobj реализует генетический алгоритм в командной строке для минимизации многокомпонентной це- левой функции. X = gamultiobj (FITNESSFCN, NVARS) - определяет ло- кальное множество Парето X целевых функций, заданных параметром FITNESSFCN. NVARS - размерность проблемы оптимизации (число переменных решения). FITNESSFCN принимает век- тор X размером 1*NVARS и возвращает вектор размером 1 х numberOfObjectives, оценённый в переменной решения. X является матрицей, имеющей NVARS столбцов. Число строк в X совпадает с числом решений Парето. Все решения в мно- жестве Парето одинаково оптимальны; задача разработчика - выбрать решение во множестве Парето в зависимости от приложения. X = gamultiobj (FITNESSFCN NVARS, A, b) - находит ло- кальное множество Парето X из целевых функций, опреде- ленных в FITNESSFCN согласно линейному неравенству А*х<Ь. Линейные ограничения поддерживаются только для параметра PopulationType по умолчанию ('double Vector^). Другие типы популяции, например 'bitString' и 'custom', не поддерживаются. X = gamultiobj (FITNESSFCN NVARS, A, b, Aeq, beq) на- ходит локальное множество Парето X целевых функций, оп- ределенных в FITNESSFCN, согласно линейным равенствам Aeq хх = beq , а также линейным неравенствам А*х < Ь. (Ус- тановите А = [] и b = [], если неравенства не существуют.) Линейные ограничения поддерживаются только для парамет- ра PopulationType по умолчанию ('doubleVector'). Другие ти- пы популяции, например 'bitString' и 'custom', не поддержи- ваются. X = gamultiobj (FITNESSFCN NVARS, A, bf Aeq, beq, LB, UB) - задаёт множество нижних и верхних границ на пере- менных проекта X так, чтобы локальное множество Парето находилось в диапазоне LB <x<UB. Используется пустая матрица для LB и UB, если границы не существуют. Задаётся 126
LB(i) = -Inf, если X(i) не ограничены снизу, и UB(i) = Inf, если X(i) не ограничены сверху. Связанные ограничения поддер- живаются только для значения PopulationType по умолчанию ('doubleVector'). Другие типы популяции, например 'bitString' и 'custom', не поддерживаются. X = gamultiobj (FITNESSFCN, NVARS, А, Ъ, Aeq, beq, LB, UBf options) считает множество Парето, X, с параметрами оп- тимизации по умолчанию, замененными соответствующими значениями структуры options. Структура options может быть создана с помощью функции gaoptimset. X = gamultiobj (problem) находит множество Парето для проблемы (problem), где problem - структура, содержащая следующие поля: fitnessfcn - функция пригодности, nvars - число переменных, Aineq - матрица линейных ограничений неравенства, bineq - вектор для линейных ограничений неравенства, Aeq - матрица для линейных ограничений равенства, beq - вектор для линейных ограничений равенства, lb - нижняя граница на х, иЪ - верхняя граница на х, rngstate - необязательное поле, чтобы сбросить состоя- ние генератора случайных чисел, options - структура options созданная функцией gaoptim- set. Структура problem создаётся экспортом проблемы из Ин- струмента оптимизации. [X, FVAL] = gamultiobj (FITNESSFCN, NVARS,...) - воз- вращает матрицу FVAL, значение всех целевых функций, оп- ределенных в FITNESSFCN во всех решениях X. У FVAL есть numberOfObjectives столбцов и то же число строк, как у X. [X, FVAL, EXITFLAG] = gamultiobj (FITNESSFCN, NVARS...) - возвращает EXITFLAG, который описывает усло- вие выхода gamultiobj. Возможные значения EXITFLAG и со- ответствующих условий выхода: 127
1 - среднее изменение значений в множестве Парето по options. StallGenLimit поколениям меньше, чем options.TolFun; О - превышено максимальное количество поколений; -1 - оптимизация, завершенная выводом или графиком; -2 - не найдено ни одной допустимой точки; -5 - превышено ограничение по времени. [X, FVAL, EXITFLAG, OUTPUT] = gamultiobj (FIT- NESSFCN, NVARS,... ) - возвращает структуру OUTPUT со следующими полями: Output, rngstate - поле, используемое для сброса состоя- ния генератора случайных чисел, при необходимости вос- произведения результатов ga\ Output.generations - общее количество поколений, ис- ключая итерации гибридной функции (HybridFcn); Output.funccount - общее количество функциональных оценок; Output.maxconstraint - максимальное число нарушений ограничений, если они были; Output.message - завершающее сообщение функции ga- multiobj. [X, FVAL, EXITFLAG, OUTPUT, POPULATION] =gamultiobj (FITNESSFCN, ...) - возвращает заключительную популяцию {POPULATION) при завершении алгоритма. [X, FVAL, EXITFLAG, OUTPUT, POPULATION, SCORE] =gamultiobj (FITNESSFCN, ...) - возвращает численность (SCORE) заключительной популяции. Пример. Этот пример оптимизирует две цели, опреде- ленные функцией schaffer2: двухэлементная векторная функция с одним входным аргументом. М-файл функции: function у = schaffer2(x) % у имеет два столбца % Инициализация у для двух целей и для всех х у = zeros(length(x),2); % Оценка первой цели. % Эта цель кусочно-непрерывная. 128
for i= l:length(x) if x(i)<= 1 y(U) = -x(i); elseifx(i) <=3 y(i,l) = x(i)-2; elseifx(i)<=4 y(i,l) = 4-x(i); else y(i,l) = x(i)-4; end end % Оценка второй цели y(:,2) = (x-5)-2; Графики этих двух целей: х = -1:0.1:8; у = schaffer2(x); plot(x,y(:,l),\r'); hold on plot(x,y(:,2),\b'); Двухкомпонентные функции конкурируют в диапазоне [1, 3] и [4, 5]. Но оптимальный по Парето выход состоит только из двух разъединенных областей: [1, 2] и [4, 5]. Это вызвано тем, что область [2, 3] расположена ниже [1, 2]. Затем наложите связанное ограничение на х, -5 < х < 10, установив lb = -5; иЪ = 10. Лучший способ просмотреть результаты генетического алгоритма состоит в том, чтобы визуализировать выход Па- рето, непосредственно используя параметр @gaplotpareto. Для оптимизации функции Шаффера требуется большая чис- ленность населения, чем значение по умолчанию (15). Этот пример использует значение 60. Введите параметры оптими- зации: options = gaoptimset(TopulationSize\60,TlotFcns\@gaplotpareto); Теперь можно вызвать gamultiobj, определяя одну неза- висимую переменную и только связанные ограничения: 129
[x, f, exitflag] = gamultiobj (@schaffer2,l, [], [], [], [], lb, ub, op- tions); Оптимизация завершилась: среднее изменение в распре- делении решения Парето меньше, чем options. TolFun. exitflag exitflag = 1 Векторы *,/(: 1), и/(: 2) соответственно содержат мно- жество Парето и оценки обеих целей на множестве Парето. Демонстрационные примеры: gamultiobjfitness - решает простую проблему с одной пе- ременной решения и двумя целями; gamultiobjoptionsdemo - показывает, как установить па- раметры для многоцелевой оптимизации. gaoptimget. Назначение: получение значений структуры параметров генетического алгоритма. Синтаксис: val = gaoptimget(options, 'name') val = gaoptimget(options, 'name', default) Описание: val = gaoptimget (options, 'name') - возвращает значение параметра name структуры параметров options генетическо- го алгоритма, gaoptimget (options, 'пате') возвращает пустую матрицу [ ], если значение пате не определено в options. Только необходимо ввести достаточно ведущих символов пате, чтобы однозначно определить его. Функция gaoptimget игнорирует регистр в названиях параметров. val = gaoptimget(options, 'name', default) - возвращает 'name' параметр, но возвратит значение по умолчанию, если этот параметр не определён (или является [ ]) в options. gaoptimset. Назначение: создает структуру параметров генетическо- го алгоритма. Синтаксис: 130
gaoptimset options = gaoptimset options = gaoptimset(@ga) options = gaoptimset(@gamultiobj) options = gaoptimset('paramr,valuel,,param2,,value2,...) options = gaoptimset(oldopts,'paramr,valuel,...) options = gaoptimset(oldopts,newopts) Описание: gaoptimset (без параметров ввода или вывода) - выводит на экран полный список из параметров с их допустимыми зна- чениями. options = gaoptimset (без входных параметров) - создаёт структуру options, которая содержит опции или параметры, для генетического алгоритма и устанавливает параметры в [ ], указывая, что будут использоваться значения по умолча- нию. options = gaoptimset(@ga) - создаёт структуру options, ко- торая содержит параметры по умолчанию для генетического алгоритма. options = gaoptimset(@gamultiobj) - создаёт структуру options, которая содержит параметры по умолчанию для gamultiobj. options = gaoptimset(,paramr,valuel,'param2',value2,...) - создает структуру параметров и устанавливает для 'param Г значение value 1, для 'рагат2' значение value!, и т.д. Для лю- бых неуказанных параметров устанавливаются их значения по умолчанию. Достаточно ввести только достаточно веду- щих символов имени, чтобы достоверно определить название параметра. Регистр игнорируется для названий параметров. options = gaoptimset(oldopts,fparamr,valuel,...) - создаёт ко- пию oldopts, изменяя указанные параметры с указанными значениями. options = gaoptimset(oldoptsynewopts) - комбинирует су- ществующую структуру параметров, oldopts, с новой струк- турой параметров, new opts. Любые параметры в new opts с непустыми значениями перезаписывают соответствующие старые параметры в oldopts. 131
В таблице приведены параметры, которые можно устано- вить с помощью функции gaoptimset. Значения в фигурных скобках {} - по умолчанию. Можно также просмотреть пара- метры оптимизации и значения по умолчанию, вводя gaoptimset в командной строке. Параметр CreationFcn CrossoverFcn CrossoverFraction Display Описание Указатель на функцию, соз- дающую началь- ную популяцию Указатель на функцию, кото- рую алгоритм использует для скрещивания Часть популяции в следующем по- колении, не включающая элитных потом- ков, которая соз- даётся скрещива- нием Объём вывода на экран Значение @gacreationuniform | @gacreationlinearfeasible @crossoverheuristic {@crossoverscattered} @crossoverintermediate @crossoversinglepoint @crossovertwopoint @crossoverarithmetic Положительный скаляр | {0.8} 'off | 'iter' | 'diagnose' | {'final'} Параметр DistanceMeasureFcn Описание Указатель на функцию, кото- рая определяет меру удалённо- сти особей, вы- численных в переменной ре- Значение {@distancecro wding, 'phenotype'} 132
EliteCount FitnessLimit FitnessScalingFcn шения или в пространстве алгоритма (гено- тип) или в функ- циональном пространстве (фенотип) Положительное целое, опреде- ляющее, сколько особей текущего поколения га- рантированно попадёт в сле- дующее поколе- ние Если функция пригодности достигает значе- ния FitnessLimit, алгоритм оста- навливается Указатель на функцию, кото- рая масштабиру- ет значения функции при- годности Положительное целое число | {2} Скаляр | {-Inf} @fitscalingshiftlinear @fitscalingprop @fitscalingtop {@fitscalingrank} Параметр Generations Описание Положительное целое, опреде- ляющее макси- мальное коли- Значение Положительное целое чис- ло |{100} 133
HybridFcn InitialPenalty In itialPopulation InitialScores Параметр MigrationDirection чество итера- ций перед ос- тановкой алго- ритма Указатель на функцию, ко- торая продол- жает оптими- зацию после того, как ga завершится или матрица ячеек, опреде- ляющая гиб- ридную функ- цию и её структуру па- раметров Начальное зна- чение штраф- ного параметра Начальная по- пуляция, ис- пользуемая на старте генети- ческого алго- ритма; может быть задана частично Начальное мно- жество, исполь- зуемое для оп- ределения при- годности; мо- жет быть час- тичным Function handle | @fminsearch @patternsearch @fminunc @fmincon {[]} or l-by-2 cell array | {@solver, hybridoptions}, where solver = fminsearch, patternsearch, fminunc, or fmincon {[]} Положительный скаляр | {10} Матрица | {[]} Вектор-столбец | {[]} Описание Направление миграции Значение 'both' | {'forward'} 134
MigrationFraction Migrationlnterval MutationFcn OutputFcns ParetoFraction Скаляр между 0 и 1, определяю- щий долю осо- бей каждой под- популяции, миг- рирующую в другую подпо- пуляцию Положительное целое, опреде- ляющее число поколений, ко- торое проходит между миграци- ей особей между подпопуляциями Указатель на функцию, кото- рая производит дочерние эле- менты мутации Функция, кото- рую ga вызывает на каждой ите- рации Скаляр от 0 до 1, определяющий часть особей для сохранения на первом выходе Парето, в то вре- мя как решатель выбирает особей от более высоко- го уровня Скаляр | {0.2} Положительное целое {20} @mutationuniform @mutationadaptfeasible {@mutationgaussian} @gaoutputgen | {[]} Скаляр | {0.35} Параметр PenaltyFactor Описание Параметр обнов- Значение Положительный скаляр 135
PlotFcns Plotlnterval PopInitRange PopulationSize PopulationType SelectionFcn ления штрафа Массив указате- лей на графиче- ские функции, изображающие данные, вычис- ленные алгорит- мом Положительное целое, определяю- щее число поколе- ний между после- довательными вы- зовами функции графика Матрица или век- тор, определяющие диапазон особей в начальной популя- ции Размер популяции Сирока, опреде- ляющая тип дан- ных популяции Указатель на функцию, которая выбирает родите- лей при скрещива- нии и мутации 1100} @gaplotbestf @gaplotbestindiv @gaplotdistance @gaplotexpectation @gaplotgeneology @gaplotselection @gaplotrange @gaplotscorediversity @gaplotscores @gaplotstopping i{[]} Положительное целое | {i} Матрица или вектор | [0; 1] Положительное целое | {20} ■bristling' | 'custom11 {'doubleVector'} Обратите внимание на то, что линейные и нелиней- ные ограничения не удов- летворены когда Popula- tionType установлен в 'bitstring' или 'custom'. @selectionremainder @selectionuniform {@selectionstochunif} @selectionroulette @selectiontournament 136
Параметр StallGenLimit StallTimeLimit TimeLimit TolCon TolFun Описание Положительное целое. Алгоритм останавливается, если нет улучшения целевой функции за StallGenLimit поко- лений подряд Положительный скаляр. Алгоритм останавливается, если нет улучше- ния целевой функ- ции за StallTime- Limit секунд Положительный скаляр. Алгоритм останавливается при достижении времени выполне- ния, равного TimeLimit секунд Положительный скаляр. TolCon ис- пользуется, чтобы определить выпол- нимость относи- тельно нелинейных ограничений Положительный скаляр. Алгоритм выполняется, пока суммарное изме- нение значения функции пригод- ности за StallGenLimit по- колений не станет меньше, чем Значение Положительное целое | {50} Положительный скаляр |{Inf> Положительный скаляр |{Inf} Положительный скаляр 1 {1е-6} Положительный скаляр 1 {1е-6} 137
I TolFun Параметр UseParallel Vectorized Описание Вычисление функ- ции пригодности популяции парал- лельно Строка, опреде- ляющая, вектори- зовано ли вычис- ление функции пригодности Значение 'always11 {'never'} 'on' | {'off'} 138
ОГЛАВЛЕНИЕ ВВЕДЕНИЕ 3 1. НАЧАЛО РАБОТЫ С ГЕНЕТИЧЕСКИМ АЛГОРИТМОМ 4 1.1. Что такое генетический алгоритм 4 1.2. Написание М-файлов для оптимизируемых функций 4 1.3. Выполнение оптимизации с помощью генетического алгоритма 6 2. НАХОЖДЕНИЕ МИНИМУМА ФУНКЦИИ РАСТРИГИНА 9 2.1. Функция Растригина 9 2.2. Нахождение минимума с использованием графического интерфейса 11 2.3. Нахождение минимума из командной строки 13 2.4. Отображение графиков 14 3. ТЕРМИНОЛОГИЯ ГЕНЕТИЧЕСКОГО АЛГОРИТМА 16 4. КАК РАБОТАЕТ ГЕНЕТИЧЕСКИЙ АЛГОРИТМ 18 5. ИСПОЛЬЗОВАНИЕ ГЕНЕТИЧЕСКОГО АЛГОРИТМА С ПОМОЩЬЮ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА 24 6. ИСПОЛЬЗОВАНИЕ ГЕНЕТИЧЕСКОГО АЛГОРИТМА ИЗ КОМАНДНОЙ СТРОКИ 33 7. УЛУЧШЕНИЕ РЕЗУЛЬТАТОВ 42 8. ОГРАНИЧЕННАЯ МИНИМИЗАЦИЯ ПРИ ПОМОЩИ GA 75 9. РЕШЕНИЕ СМЕШАННОЙ ЦЕЛОЧИСЛЕННОЙ ПРОБЛЕМЫ ИНЖЕНЕРНОГО ПРОЕКТИРОВАНИЯ С ИСПОЛЬЗОВАНИЕМ ГЕНЕТИЧЕСКОГО АЛГОРИТМА 80 9.1. Проблема проектирования ступенчатой консольной балки 80 9.2. Решение смешанной целочисленной проблемы оптимизации 84 10. МНОГОЦЕЛЕВАЯ ОПТИМИЗАЦИЯ 90 11. ПАРАМЕТРЫ ГЕНЕТИЧЕСКОГО АЛГОРИТМА 101 12. СВОДНАЯ ХАРАКТЕРИСТИКА ФУНКЦИЙ ГЕНЕТИЧЕСКОГО АЛГО- РИТМА 121 Маслов Александр Анатольевич Генетический алгоритм в Matlab Редактор Г.М. Звягина Корректор Л. А. Петрова Подписано в печать 3.05.2014. Формат бумаги 60x84/16. Бумага документная. Печать трафаретная. Усл. печ. л. 7. Тираж 100 экз. Заказ № 97. Балтийский государственный технический университет Типография БГТУ 190005, С.-Петербург, 1-я Красноармейская ул., д.1
УДК 004.896(075.8) М31 Маслов, А.А. М31 Генетический алгоритм в Matlab: учебное пособие/ А.А. Маслов; Балт. гос. техн. ун-т. - СПб., 2014. - 122 с. ISBN 978-5-85546-816-8 Пособие содержит основные сведения, необходимые для освоения технологии применения генетического алгоритма для решения задач оптимизации, используя пакет Matlab. Излагаются технические детали назначения параметров ал- горитма, позволяющих улучшить качество его работы. При- водятся примеры решения задач инженерного проектирова- ния. Предназначено для студентов, обучающихся по специа- лизациям «Моделирование и информационные технологии проектирования ракетно-космических систем» и «Внешнее проектирование и эффективность авиационных и ракетных организационно-технических систем». Может быть полезно студентам, слушающим курсы «Системы искусственного интеллекта», «Нейросетевые технологии», «Технологии ис- кусственного интеллекта», а также всем желающим само- стоятельно ознакомиться с предметом изложения. УДК 004.896(075.8) Рецензент канд. техн. наук, проф. В А. Евстафьев Утверждено редакционно-издателъским советом университета ISBN 978-5-85546-816-8 © БГТУ, 2014 © А.А. Маслов, 2014