Установите опции для ga
при помощи optimoptions
.
options = optimoptions('ga','Option1','value1','Option2','value2');
Некоторые опции перечислены в italics
. Эти опции не появляются в объявлении, которое optimoptions
возвращает. Чтобы увидеть, почему 'optimoptions
скрывает эти значения опций, см. Опции, которые оптимизируют Скрытия.
Убедитесь, что вы передаете опции решателю. В противном случае, patternsearch
использует значения опций по умолчанию.
[x,fval] = ga(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
PlotFcn
задает функцию построения графика или функции, вызываемые при каждой итерации ga
или gamultiobj
. Установите PlotFcn
опция, которая должна быть встроенным именем функции построения графика или указателем на функцию построения графика. Остановить алгоритм можно в любой момент нажав кнопку Stop в окне plot. Для примера, чтобы отобразить лучшее значение функции, установите options
следующим образом:
options = optimoptions('ga','PlotFcn','gaplotbestf');
Чтобы отобразить несколько графиков, используйте массив ячеек со встроенными именами функций построения графика или cell-массив указателей на функцию:
options = optimoptions('patternsearch','PlotFcn', {@plotfun1, @plotfun2, ...});
где @plotfun1
, @plotfun2
и так далее указатели на функцию к функциям построения графика. Если вы задаете больше чем одну функцию построения графика, все графики появляются как подграфики в одном окне. Щелкните правой кнопкой мыши любой подграфик для получения большей версии в отдельном окне рисунка.
Доступные функции построения графика для ga
или для gamultiobj
:
'gaplotscorediversity'
строит гистограмму счетов для каждой генерации.
'gaplotstopping'
графики критерия остановки.
'gaplotgenealogy'
строит графики генеалогии индивидуумов. Линии от одной генерации к следующему закодированы следующим образом:
Красные линии указывают на детей мутации.
Синие линии указывают на дочерние элементы кроссовера.
Черные линии указывают на элитные индивидуумов.
'gaplotscores'
строит графики счетов лиц на каждой генерации.
'gaplotdistance'
строит графики среднего расстояния между индивидуумами в каждой генерации.
'gaplotselection'
строит гистограмму родительских элементов.
'gaplotmaxconstr'
строит графики максимального нелинейного нарушения ограничений для каждой генерации. Для ga
, доступно только, когда NonlinearConstraintAlgorithm
опция 'auglag'
(по умолчанию для нецелочисленных задач). Поэтому не доступны для целочисленных задач, так как они используют 'penalty'
нелинейный алгоритм ограничения.
Можно также создать и использовать собственную функцию построения графика. Структура Функций построения графика описывает структуру пользовательской функции построения графика. Передайте любую пользовательскую функцию как указатель на функцию.
Следующие функции построения графика доступны для ga
только:
'gaplotbestf'
строит графики оптимального значения баллов и среднего счета в зависимости от генерации.
'gaplotbestindiv'
строит графики векторных записей индивидуума с лучшим значением функции соответствия в каждой генерации.
'gaplotexpectation'
строит графики ожидаемого количества детей от необработанных счетов для каждой генерации.
'gaplotrange'
строит графики минимальных, максимальных и средних значений баллов в каждой генерации.
Следующие функции построения графика доступны для gamultiobj
только:
'gaplotpareto'
строит график фронта Парето для первых двух целевых функций.
'gaplotparetodistance'
строит графики на столбчатую диаграмму расстояния каждого отдельного человека от его соседей.
'gaplotrankhist'
строит гистограмму рангов индивидуумов. Индивидуумы 1 ранга находятся на границе с Парето. Индивидуумы ранга 2 ниже, чем, по крайней мере, один ранг 1 индивидуума, но не ниже, чем любые индивидуумы из других рангов и т.д.
'gaplotspread'
строит графики среднего расширения как функции от числа итераций.
Первая линия функции построения графика имеет следующую форму:
function state = plotfun(options,state,flag)
Входные параметры в функцию:
options
- Структура, содержащая все текущие настройки опций.
state
- Структура, содержащая информацию о текущем поколении. Структура состояния описывает области state
.
flag
- Описание этапа, в котором находится алгоритм. Для получения дополнительной информации смотрите Опции Выходной функции.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Выходной аргумент state
является также государственной структурой. Передайте входной параметр, измененный, если хотите; см. «Изменение структуры состояния». Чтобы остановить итерации, установите state.StopFlag
к непустому вектору символов, такому как 'y'
.
га. Структура состояния для ga
, который является входным параметром к графику, мутации и выходным функциям, содержит следующие поля:
Generation
- Номер текущего поколения.
StartTime
- Время запуска генетического алгоритма, возвращаемое tic
.
StopFlag
- Причина остановки, символьный вектор.
LastImprovement
- генерация, при которой произошло последнее улучшение значения соответствия.
LastImprovementTime
- Время, в которое произошло последнее улучшение.
Best
- Вектор, содержащий лучший счет в каждой генерации.
how
- The 'augLag'
алгоритм нелинейных ограничений сообщает об одном из следующих действий: 'Infeasible point'
, 'Update multipliers'
, или 'Increase penalty'
; см. Дополненный Лагрангианский Генетический Алгоритм.
FunEval
- Совокупное количество вычислений функции.
Expectation
- Ожидание выбора индивидуумов.
Selection
- Индексы индивидуумов, выбранных для элиты, кроссовера и мутации.
Population
- Население в текущем поколении.
Score
- Счета текущего населения.
NonlinIneq
- Нелинейные ограничения неравенства в текущей точке, присутствующие только, когда задана нелинейная функция ограничения, целочисленных переменных нет, flag
не 'interrupt'
, и NonlinearConstraintAlgorithm
является 'auglag'
.
NonlinEq
- Нелинейные ограничения равенства в текущей точке, присутствующие только, когда задана нелинейная функция ограничения, целочисленных переменных нет, flag
не 'interrupt'
, и NonlinearConstraintAlgorithm
является 'auglag'
.
EvalElites
- Логическое значение, указывающее, ga
оценивает функцию соответствия элитных индивидуумов. Первоначально это значение true
. В первой генерации, если элитные индивидуумы оценивают до своих предыдущих значений (что указывает на то, что функция соответствия является детерминированной), то это значение становится false
по умолчанию для последующих итераций. Когда EvalElites
является false
, ga
не переоценивает функцию соответствия элитных индивидуумов. Можно переопределить это поведение в пользовательской функции построения графика или пользовательской выходной функции путем изменения выхода state.EvalElites
.
HaveDuplicates
- Логическое значение, указывающее, ga
добавляет повторяющиеся индивидуумов для начальной генеральной совокупности. ga
использует небольшую относительную погрешность, чтобы определить, является ли индивидуум дублированным или уникальным. Если HaveDuplicates
является true
, затем ga
определяет местоположение уникальных индивидуумов и оценивает функцию соответствия только один раз для каждого уникального индивидуума. ga
копирует значения функций соответствия и ограничения для дублирования индивидуумов. ga
повторяет тест в каждой генерации, пока все индивидуумы не будут уникальными. Тест принимает порядок n*m*log(m)
операции, где m
- размер и n
населения является
nvars
. Чтобы переопределить этот тест в пользовательской функции построения графика или пользовательской выходной функции, установите выход state.HaveDuplicates
на false
.
gamultiobj. Структура состояния для gamultiobj
, который является входным параметром к графику, мутации и выходным функциям, содержит следующие поля:
Population
- Население в текущем поколении
Score
- Счета текущего населения, a Population
-by- nObjectives
матрица, где nObjectives
количество целей
Generation
- Номер текущего поколения
StartTime
- Время запуска генетического алгоритма, возвращаемое tic
StopFlag
- Причина остановки, символьный вектор
FunEval
- Совокупное количество вычислений функции
Selection
- Индексы лиц, выбранных для элиты, кроссовера и мутации
Rank
- Вектор рангов представителей в населении
Distance
- Вектор расстояний каждого представителя населения до близкого соседнего представителя
AverageDistance
- Стандартное отклонение (не среднее) Distance
Spread
- Вектор, где значения являются расширением в каждой генерации
mIneq
- Количество нелинейных ограничений неравенства
mEq
- Количество нелинейных ограничений равенства
mAll
- Общее количество нелинейных ограничений, mAll
= mIneq
+ mEq
C
- Нелинейные ограничения неравенства в текущей точке, a PopulationSize
-by- mIneq
матрица
Ceq
- Нелинейные ограничения равенства в текущей точке, a PopulationSize
-by- mEq
матрица
isFeas
- Выполнимость населения, логический вектор с PopulationSize
элементы
maxLinInfeas
- Максимальная недопустимость в отношении линейных ограничений для населения
Опции населения позволяют вам задать параметры населения, которые использует генетический алгоритм.
PopulationType
задает тип входа для функции соответствия. Типы и их ограничения:
'doubleVector'
- Используйте эту опцию, если индивидуумы в населении имеют тип double
. Используйте эту опцию для смешанного целочисленного программирования. Это значение по умолчанию.
'bitstring'
- Используйте эту опцию, если индивидуумы в населении имеют компоненты, которые 0
или 1
.
Внимание
Значение индивидуумов в Bit string
население являются векторами типа double
, а не строки или символы.
Для CreationFcn
и MutationFcn
, использовать 'gacreationuniform'
и 'mutationuniform'
или указатели на пользовательские функции. Для CrossoverFcn
, использовать 'crossoverscattered'
, 'crossoversinglepoint'
, 'crossovertwopoint'
или указатель на пользовательскую функцию. Вы не можете использовать HybridFcn
, и ga
игнорирует все ограничения, включая ограничения, линейные ограничения и нелинейные ограничения.
'custom'
- Указывает пользовательский тип населения. В этом случае необходимо также использовать пользовательский CrossoverFcn
и MutationFcn
. Вы должны предоставить или пользовательскую функцию создания или InitialPopulationMatrix
. Вы не можете использовать HybridFcn
, и ga
игнорирует все ограничения, включая ограничения, линейные ограничения и нелинейные ограничения.
PopulationSize
определяет, сколько индивидуумы в каждой генерации. При большом размере населения генетический алгоритм более тщательно ищет пространство решений, тем самым уменьшая вероятность того, что алгоритм вернёт локальный минимум, который не является глобальным минимумом. Однако большой размер населения также заставляет алгоритм запускаться медленнее. Значение по умолчанию является '50 when numberOfVariables <= 5, else 200'
.
Если вы задаете PopulationSize
для вектора генетический алгоритм создает несколько поднаселений, число которых является длиной вектора. Размер каждого поднаселения является соответствующей записью вектора. Обратите внимание, что эта опция не является полезной. См. раздел «Опции миграции».
CreationFcn
задает функцию, которая создает начальную генеральную совокупность для ga
. Не задавайте функцию создания с целочисленными задачами, потому что ga
переопределяет любой выбор, который вы делаете. Выберите из:
[]
использует функцию создания по умолчанию для вашего типа задачи.
'gacreationuniform'
создает случайную начальную генеральную совокупность с равномерным распределением. Это значение по умолчанию, когда нет линейных ограничений или когда есть целочисленные ограничения. Равномерное распределение находится в начальной генеральной совокупности области значений (InitialPopulationRange
). Значения по умолчанию для InitialPopulationRange
являются [-10;10]
для каждого компонента или [-9999;10001]
при наличии целочисленных ограничений. Эти границы сдвигаются и масштабируются, чтобы соответствовать любым существующим границам lb
и ub
.
Внимание
Не используйте 'gacreationuniform'
когда у вас есть линейные ограничения. В противном случае ваше население может не удовлетворить линейным ограничениям.
'gacreationlinearfeasible'
является значением по умолчанию, когда существуют линейные ограничения и нет целочисленных ограничений. Этот выбор создает случайную начальную генеральную совокупность, которая удовлетворяет всем границам и линейным ограничениям. Если существуют линейные ограничения, 'gacreationlinearfeasible'
создает много индивидуумов на контурах ограничительной области, и создает хорошо рассеянное население. 'gacreationlinearfeasible'
игнорирует InitialPopulationRange
. 'gacreationlinearfeasible'
вызовы linprog
создать допустимое население относительно границ и линейных ограничений.
Пример, показывающий его поведение, см. в разделах Пользовательская функция построения графика и Линейные ограничения в ga.
'gacreationnonlinearfeasible'
- функция создания по умолчанию для 'penalty'
нелинейный алгоритм ограничения. Для получения дополнительной информации см. раздел «Параметры ограничений».
Указатель на функцию позволяет вам записать свою собственную функцию создания, которая должна генерировать данные того типа, в котором вы задаете PopulationType
. Для примера,
options = optimoptions('ga','CreationFcn',@myfun);
Функция создания должна иметь следующий синтаксис вызова.
function Population = myfun(GenomeLength, FitnessFcn, options)
Входные параметры в функцию:
Genomelength
- Количество независимых переменных для функции соответствия
FitnessFcn
- Функция соответствия
options
- Опции
Функция возвращается Population
, начальная генеральная совокупность для генетического алгоритма.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Внимание
Когда у вас будут ограничения или линейные ограничения, убедитесь, что ваша функция создания создает индивидуумов, которые удовлетворяют этим ограничениям. В противном случае ваше население может не удовлетворить ограничениям.
InitialPopulationMatrix
задает начальную генеральную совокупность для генетического алгоритма. Значение по умолчанию []
, в каком случае ga
использует значение по умолчанию CreationFcn
для создания начальной генеральной совокупности. Если вы вводите непустой массив в InitialPopulationMatrix
массив должен иметь не более PopulationSize
строки, и точно nvars
столбцы, где nvars
- количество переменных, второй вход в ga
или gamultiobj
. Если у вас есть partial начальная генеральная совокупность, это означает меньше PopulationSize
строки, затем генетический алгоритм вызывает CreationFcn
чтобы сгенерировать остальных индивидуумов.
InitialScoreMatrix
задает начальные счета для начальной генеральной совокупности. Начальные счета также могут быть частичными. Не задавайте начальные счета с целочисленными задачами, потому что ga
переопределяет любой выбор, который вы делаете.
InitialPopulationRange
задает область значений векторов в начальной генеральной совокупности, которая генерируется gacreationuniform
функция создания. Можно задать InitialPopulationRange
быть матрицей с двумя строками и nvars
столбцы, каждый столбец которых имеет вид [lb;ub]
, где lb
- нижняя граница и ub
- верхняя граница для значений в этой координате. Если вы задаете InitialPopulationRange
чтобы быть вектором 2 на 1, каждый элемент расширяется до постоянной строки длины nvars
. Если вы не задаете InitialPopulationRange
, по умолчанию является [-10;10]
([-1e4+1;1e4+1]
для целочисленных задач), измененных так, чтобы соответствовать любым существующим границам. 'gacreationlinearfeasible'
игнорирует InitialPopulationRange
. См. пример в разделе Set Initial Range (Задать начальную область значений).
Масштабирование соответствия преобразует необработанные счета соответствия, которые возвращаются функцией соответствия, в значения в области значений, который подходит для функции выбора.
FitnessScalingFcn
задает функцию, которая выполняет масштабирование. Опции:
'fitscalingrank'
- функция масштабирования соответствия по умолчанию, 'fitscalingrank'
, масштабирует необработанные счета на основе ранга каждого индивидуума вместо его счета. Рангом индивидуума является его позиция в отсортированных счетах. Индивидуум с рангом r имеет масштабированный счет, пропорциональный . Таким образом, масштабированный счет самой подгоняемой индивидуума пропорциональен 1, масштабированный счет следующей самой подгонки пропорциональен и так далее. Ранговое масштабирование соответствия удаляет эффект распространения необработанных счетов. Квадратный корень делает плохо ранжированный индивидуумов более почти равный по счету, по сравнению с рангом оценкой. Для получения дополнительной информации см. «Масштабирование соответствия».
'fitscalingprop'
- Пропорциональное масштабирование делает масштабированное значение индивидуума пропорциональным его необработанному счету соответствия.
'fitscalingtop'
- Масштабирование сверху масштабирует верхние индивидуумов одинаково. Можно изменить масштабирование сверху с помощью дополнительного параметра:
options = optimoptions('ga','FitnessScalingFcn',{@fitscalingtop,quantity})
quantity
задает количество индивидуумов, которым присвоены положительные масштабированные значения. quantity
может быть целым числом от 1 до размера населения или дробью от 0 до 1, задающей долю размера населения. Значение по умолчанию 0.4
. Каждому из индивидуумов, которые производят потомство, присваивается равное масштабное значение, в то время как остальным присваивается значение 0. Масштабированные значения имеют вид [01/n 1/n 0 1/n 0 0 1/n...].
'fitscalingshiftlinear'
- Сдвиньте линейное масштабирование масштабирует необработанные счета так, чтобы ожидание самого подходящего индивидуума было равно константе называемой rate
умноженный на средний счет. Можно изменить rate
параметр:
options = optimoptions('ga','FitnessScalingFcn',... {@fitscalingshiftlinear, rate})
Значение по умолчанию rate
является 2
.
Указатель на функцию позволяет вам записать свою собственную функцию масштабирования.
options = optimoptions('ga','FitnessScalingFcn',@myfun);
Ваша функция масштабирования должна иметь следующий синтаксис вызова:
function expectation = myfun(scores, nParents)
Входные параметры в функцию:
scores
- вектор скаляров, по одному для каждого представителя населения;
nParents
- Количество родителей, необходимых от этого населения
Функция возвращается expectation
, вектор-столбец скаляров той же длины, что и scores
, придавая масштабные значения каждому представителю населения. Сумма записей expectation
должен равняться nParents
.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Для получения дополнительной информации смотрите Fitness Scaling.
Опции выбора определяют, как генетический алгоритм выбирает родительские элементы для следующей генерации.
The SelectionFcn
опция задает функцию выбора. Не используйте с целочисленными задачами.
gamultiobj
использует только 'selectiontournament'
функция выбора.
Для ga
опции:
'selectionstochunif'
- The ga
функция выбора по умолчанию, 'selectionstochunif'
, выкладывает строку, в которой каждый родительский элемент соответствует сечению линии длины, пропорциональному ее масштабируемому значению. Алгоритм перемещается вдоль линии в шагах равного размера. На каждом шаге алгоритм выделяет родительский элемент из секции, в которую он входит. Первый шаг является равномерным случайным числом, меньше, чем размер шага.
'selectionremainder'
- Оставшийся выбор присваивает родительским элементам детерминированно из целочисленной части масштабируемого значения каждого индивидуума, а затем использует выбор рулетки на оставшейся дробной части. Например, если масштабированное значение индивидуума составляет 2,3, этот индивидуум числится дважды как родительский элемент, потому что целочисленная часть равна 2. После того, как родительские элементы были назначены в соответствии с целочисленными частями масштабированных значений, остальные родительские элементы выбираются стохастически. Вероятность того, что родительский элемент выбран на этом шаге, пропорциональна дробной части его масштабируемого значения.
'selectionuniform'
- Единообразный отбор выбирает родительские элементы, используя ожидания и количество родительских элементов. Равномерный выбор полезен для отладки и проверки, но не очень эффективная стратегия поиска.
'selectionroulette'
- Выбор рулетки выбирает родительские элементы путем моделирования колеса рулетки, в котором площадь участка колеса, соответствующего индивидууму, пропорциональна ожиданиям индивидуума. Алгоритм использует случайное число, чтобы выбрать один из разделов с вероятностью, равной его площади.
'selectiontournament'
- Выбор турнира выбирает каждый родительский элемент путем выбора size
игроки наугад и затем выбирают лучшего индивидуума из этого набора, чтобы быть родительским элементом. size
должно быть не менее 2. Значение по умолчанию size
является 4
. Задайте size
к другому значению следующим образом:
options = optimoptions('ga','SelectionFcn',... {@selectiontournament,size})
Когда NonlinearConstraintAlgorithm
является Penalty
, ga
использует 'selectiontournament'
с size 2
.
Указатель на функцию позволяет вам записать свою собственную функцию выбора.
options = optimoptions('ga','SelectionFcn',@myfun);
Функция выбора должна иметь следующий синтаксис вызова:
function parents = myfun(expectation, nParents, options)
ga
предоставляет входные параметры expectation
, nParents
, и options
. Ваша функция возвращает индексы родительских элементов.
Входные параметры в функцию:
expectation
Для ga
, expectation
является вектор-столбец масштабированной соответствия каждого представителя населения. Масштабирование происходит из опций масштабирования соответствия.
Совет
Можно убедиться, что у вас есть вектор-столбец, используя expectation(:,1)
. Для примера, edit selectionstochunif
или любая другая встроенная функция выбора.
Для gamultiobj
, expectation
- матрица, чей первый столбец является отрицательным рангом индивидуумов, и чей второй столбец является мерой расстояния индивидуумов. См. «Мультиобъективные опции».
nParents
- Количество родительских элементов.
options
- Генетический алгоритм options
.
Функция возвращается parents
, a вектора-строки длины nParents
содержащие индексы выбранных родительских элементов.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Для получения дополнительной информации см. раздел «Выбор».
Опции размножения определяют, как генетический алгоритм создает детей для следующей генерации.
EliteCount
определяет количество индивидуумов, которые гарантированно доживут до следующей генерации. Задайте EliteCount
быть положительным целым числом, меньшим или равным размеру населения. Значение по умолчанию ceil(0.05*PopulationSize)
для непрерывных задач и 0.05*(default PopulationSize)
для смешано-целочисленных задач.
CrossoverFraction
задает долю следующей генерации, кроме элитных дочерних элементов, которые производятся с помощью кроссовера. Задайте CrossoverFraction
быть дробью между 0
и 1
. Значение по умолчанию 0.8
.
Пример см. в разделе Установка перекрестной дроби.
Опции мутации определяют, как генетический алгоритм производит небольшие случайные изменения у индивидуумов в населении, чтобы создать детей мутаций. Мутация обеспечивает генетическое разнообразие и позволяет генетическому алгоритму искать более широкое пространство. Задайте функцию мутации в MutationFcn
опция. Не используйте с целочисленными задачами.
MutationFcn
опции:
'mutationgaussian'
- функция мутации по умолчанию для задач без ограничений, 'mutationgaussian'
, добавляет случайное число, взятое из Гауссова распределения со средним 0, к каждой записи родительского вектора. Стандартное отклонение этого распределения определяется параметрами scale
и shrink
, и по InitialPopulationRange
опция. Задайте scale
и shrink
следующим образом:
options = optimoptions('ga','MutationFcn', ... {@mutationgaussian, scale, shrink})
The scale
параметр определяет стандартное отклонение при первой генерации. Если вы задаете InitialPopulationRange
быть вектором 2 на 1 v
начальное стандартное отклонение одинаково во всех координатах родительского вектора и определяется scale
*(v(2)-v(1))
.
Если вы задаете InitialPopulationRange
быть вектором v
с двумя строками и nvars
столбцы, начальное стандартное отклонение в координатных i
родительского вектора задается как scale
*(v(i,2) - v(i,1))
.
The shrink
параметр управляет тем, как стандартное отклонение сокращается по мере генерации. Если вы задаете InitialPopulationRange
чтобы быть вектором 2 на 1, стандартное отклонение на k-й генерацией, σ k, одинаково во всех координатах родительского вектора и задается рекурсивной формулой
Если вы задаете InitialPopulationRange
быть вектором с двумя строками и nvars
столбцы, стандартное отклонение в i координат родительского вектора на k-м генерации, σi,k, задается рекурсивной формулой
Если вы задаете shrink
на 1
алгоритм сжимает стандартное отклонение в каждой координате линейно, пока оно не достигает 0 в последней генерации достигнуто. Отрицательное значение shrink
приводит к росту стандартного отклонения.
Значение по умолчанию для обоих scale
и shrink
равен 1.
Внимание
Не используйте mutationgaussian
когда у вас есть ограничения или линейные ограничения. В противном случае ваше население не обязательно удовлетворяет ограничениям. Вместо этого используйте 'mutationadaptfeasible'
или пользовательскую функцию мутации, которая удовлетворяет линейным ограничениям.
'mutationuniform'
- Однородная мутация является двухэтапным процессом. Во-первых, алгоритм выбирает часть векторных записей индивидуума для мутации, где каждый вход имеет вероятность rate
быть мутированным. Значение по умолчанию rate
является 0.01
. На втором этапе алгоритм заменяет каждую выбранную запись случайным числом, выбранным равномерно из области значений для этой записи.
Чтобы изменить значение по умолчанию rate
,
options = optimoptions('ga','MutationFcn', {@mutationuniform, rate})
Внимание
Не используйте mutationuniform
когда у вас есть ограничения или линейные ограничения. В противном случае ваше население не обязательно удовлетворяет ограничениям. Вместо этого используйте 'mutationadaptfeasible'
или пользовательскую функцию мутации, которая удовлетворяет линейным ограничениям.
'mutationadaptfeasible'
функция мутации по умолчанию, когда существуют ограничения, случайным образом генерирует направления, которые являются адаптивными относительно последней успешной или неудачной генерации. Мутация выбирает направление и длину шага, которая удовлетворяет границам и линейным ограничениям.
Указатель на функцию позволяет вам записать свою собственную функцию мутации.
options = optimoptions('ga','MutationFcn',@myfun);
Ваша функция мутации должна иметь этот синтаксис вызова:
function mutationChildren = myfun(parents, options, nvars,
FitnessFcn, state, thisScore, thisPopulation)
Аргументы к функции:
parents
- Вектор-строка родителей, выбранный функцией выбора
options
- Опции
nvars
- Количество переменных
FitnessFcn
- Функция соответствия
state
- Структура, содержащая информацию о текущем поколении. Структура состояния описывает области state
.
thisScore
- Вектор счетов текущего населения
thisPopulation
- Матрица индивидуумов в текущем населении
Функция возвращается mutationChildren
- мутировавшее потомство - как матрица, где строки соответствуют детям. Количество столбцов матрицы nvars
.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Внимание
Когда у вас будут ограничения или линейные ограничения, убедитесь, что ваша функция мутации создает индивидуумов, которые удовлетворяют этим ограничениям. В противном случае ваше население не обязательно удовлетворяет ограничениям.
Опции Crossover определяют, как генетический алгоритм объединяет двух индивидуумов, или родительские элементы, чтобы сформировать ребенка-кроссовера для следующей генерации.
CrossoverFcn
задает функцию, которая выполняет кроссовер. Не используйте с целочисленными задачами. Вы можете выбрать из следующих функций:
'crossoverscattered'
Функция кроссовера по умолчанию для задач без линейных ограничений создает случайный бинарный вектор и выбирает гены, где вектор является 1 от первого родительского элемента, и гены, где вектор является 0 от второго родительского элемента, и объединяет гены, чтобы сформировать дочерний элемент. Для примера, если p1
и p2
являются родительскими элементами
p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
и двоичный вектор [1 1 0 0 1 0 0 0], функция возвращает следующий дочерний элемент:
child1 = [a b 3 4 e 6 7 8]
Внимание
Когда ваша задача имеет линейные ограничения, 'crossoverscattered'
может дать плохо распределенную население. В этом случае используйте другую функцию кроссовера, такую как 'crossoverintermediate'
.
'crossoversinglepoint'
выбирает случайное целое число n между 1 и nvars
а затем
Выбирает из первого родительского элемента векторные записи, пронумерованные меньше чем или равные n.
Выбирает векторные записи, пронумерованные больше n от второго родительского элемента.
Объединяет эти записи в дочерний вектор.
Для примера, если p1
и p2
являются родительскими элементами
p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
и точка кроссовера 3, функция возвращает следующий дочерний элемент.
child = [a b c 4 5 6 7 8]
Внимание
Когда ваша задача имеет линейные ограничения, 'crossoversinglepoint'
может дать плохо распределенную население. В этом случае используйте другую функцию кроссовера, такую как 'crossoverintermediate'
.
'crossovertwopoint'
выбирает два случайных целого числа m
и n
между 1
и nvars
. Функция выбирает
Векторные записи пронумерованы меньше или равны m
от первого родительского элемента
Векторные записи, пронумерованные из m+1
на n
, включительно, от второго родительского элемента
Векторные записи пронумерованы больше n
от первого родительского элемента.
Затем алгоритм конкатенирует эти гены с образованием единственного гена. Для примера, если p1
и p2
являются родительскими элементами
p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
и точки кроссовера 3 и 6, функция возвращает следующий дочерний элемент.
child = [a b c 4 5 6 g h]
Внимание
Когда ваша задача имеет линейные ограничения, 'crossovertwopoint'
может дать плохо распределенную население. В этом случае используйте другую функцию кроссовера, такую как 'crossoverintermediate'
.
'crossoverintermediate'
Функция перекрестия по умолчанию, когда существуют линейные ограничения, создает дочерние элементы, принимая взвешенное среднее значение родительских элементов. Можно задать веса одним параметром, ratio
, который может быть скаляром или вектором-строкой длины nvars
. Значение по умолчанию ratio
является вектором всех 1-х. Установите ratio
параметр следующим образом.
options = optimoptions('ga','CrossoverFcn', ... {@crossoverintermediate, ratio});
'crossoverintermediate'
создает дочерний элемент из parent1
и parent2
используя следующую формулу.
child = parent1 + rand * Ratio * ( parent2 - parent1)
Если все значения ratio
лежат в области значений [0, 1], производимые дочерние элементы находятся в гиперкубе, заданном помещением родительских элементов в противоположные вершины. Если ratio
не находится в этой области значений, дети могут лежать вне гиперкуба. Если ratio
является скаляром, тогда все дети лежат на линии между родительскими элементами.
'crossoverheuristic'
возвращает ребенка, который лежит на линии, содержащей два родительских элементов, на небольшом расстоянии от родительского элемента с лучшим значением соответствия в направлении от родительского элемента с худшим значением соответствия. Можно задать, как далеко ребенок находится от лучшего родительского элемента, по параметру ratio
. Значение по умолчанию ratio
равен 1.2. Установите ratio
параметр следующим образом.
options = optimoptions('ga','CrossoverFcn',... {@crossoverheuristic,ratio});
Если parent1
и parent2
являются родительские элементы, и parent1
имеет лучшее значение соответствия, функция возвращает ребенка
child = parent2 + ratio * (parent1 - parent2);
Внимание
Когда ваша задача имеет линейные ограничения, 'crossoverheuristic'
может дать плохо распределенную население. В этом случае используйте другую функцию кроссовера, такую как 'crossoverintermediate'
.
'crossoverarithmetic'
создает дочерние элементы, которые являются средневзвешенным значением арифметики двух родительских элементов. Дочерние элементы всегда допустимы относительно линейных ограничений и границ.
Указатель на функцию позволяет вам записать свою собственную функцию кроссовера.
options = optimoptions('ga','CrossoverFcn',@myfun);
Функция кроссовера должна иметь следующий синтаксис вызова.
xoverKids = myfun(parents, options, nvars, FitnessFcn, ...
unused,thisPopulation)
Аргументы к функции:
parents
- Вектор-строка родителей, выбранный функцией выбора
options
- опции
nvars
- Количество переменных
FitnessFcn
- Функция соответствия
unused
- Заполнитель не используется
thisPopulation
- Матрица, представляющая текущее население. Количество строк матрицы PopulationSize
и количество столбцов nvars
.
Функция возвращается xoverKids
- потомство кроссовера - как матрица, где строки соответствуют дочерним элементам. Количество столбцов матрицы nvars
.
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Внимание
Когда у вас будут ограничения или линейные ограничения, убедитесь, что ваша функция перекрестия создает индивидуумов, которые удовлетворяют этим ограничениям. В противном случае ваше население не обязательно удовлетворяет ограничениям.
Примечание
Subpopulations обратитесь к форме параллельной обработки для генетического алгоритма. ga
в настоящее время не поддерживает эту форму. В поднаселениях каждый рабочий принимает несколько индивидуумов. Эти индивидуумы являются поднаселением. Рабочий развивает поднаселение независимо от других работников, за исключением тех случаев, когда миграция заставляет некоторые индивидуумов перемещаться между работниками.
Поскольку ga
в настоящее время не поддерживает эту форму параллельной обработки, нет никаких преимуществ в установке PopulationSize
в вектор или в настройку MigrationDirection
, MigrationInterval
, или MigrationFraction
опции.
Опции миграции определяют, как индивидуумы перемещаются между поднаселениями. Миграция происходит, если вы задаете PopulationSize
быть вектором длиной более 1. Когда происходит миграция, лучшие индивидуумы из одного поднаселения заменяют худшие индивидуумов в другом поднаселении. Индивидуумы, которые мигрируют из одного поднаселения в другую, копируются. Они не удаляются из исходного поднаселения.
Управлять тем, как происходит миграция, можно следующими тремя опциями:
MigrationDirection
- Миграция может происходить в одном или обоих направлениях.
Если вы задаете MigrationDirection
на 'forward'
миграция происходит к последнему поднаселению. То есть n-й поднаселение мигрирует в (n + 1) -й поднаселение.
Если вы задаете MigrationDirection
на 'both'
, а nth Поднаселение мигрирует как в (n -1) -й, так и в (n + 1) -й поднаселение.
Миграция оборачивается в концах поднаселений. То есть последнее поднаселение мигрирует в первую, а первая может мигрировать в последнюю.
MigrationInterval
- Определяет, сколько генерация проходит между миграциями. Для примера, если вы задаете MigrationInterval
на 20
миграция происходит каждая 20 генерация.
MigrationFraction
- Определяет, сколько индивидуумов перемещаются между поднаселениями. MigrationFraction
задает долю меньшей из двух поднаселений. Например, если индивидуумы мигрируют из поднаселения 50 индивидуумов в поднаселение 100 индивидуумов, и вы устанавливаете MigrationFraction
на 0.1
количество индивидуумов, которые мигрируют, 0,1 * 50 = 5.
Параметры ограничения относятся к решателю нелинейных ограничений. Для получения дополнительной информации об алгоритме см. «Нелинейные алгоритмы решателя ограничений».
Выберите между нелинейными алгоритмами ограничений путем установки NonlinearConstraintAlgorithm
опция для 'auglag'
(Дополненный Лагрангиан) или 'penalty'
(Алгоритм штрафа).
InitialPenalty
- задает начальное значение параметра штрафа, который используется нелинейным алгоритмом ограничения. InitialPenalty
должно быть больше или равно 1
, и имеет значение по умолчанию 10
.
PenaltyFactor
- Увеличивает параметр штрафа, когда задача не решена до необходимой точности и ограничения не выполняются. PenaltyFactor
должно быть больше 1
, и имеет значение по умолчанию 100
.
Алгоритм штрафа использует 'gacreationnonlinearfeasible'
функция создания по умолчанию. Эта функция создания использует fmincon
найти допустимые индивидуумов. 'gacreationnonlinearfeasible'
запуски fmincon
из множества начальных точек в границах от InitialPopulationRange
опция. Опционально 'gacreationnonlinearfeasible'
может запускаться fmincon
параллельно по начальным точкам.
Можно задать параметры настройки для 'gacreationnonlinearfeasible'
использование следующих пар "имя-значение".
Имя | Значение |
---|---|
SolverOpts | fmincon опции, созданные с помощью optimoptions или optimset . |
UseParallel | Когда true , run fmincon параллельно по начальным точкам; по умолчанию является false . |
NumStartPts | Количество начальных точек, положительное целое число до sum(PopulationSize) в значении. |
Включите пары "имя-значение" в массив ячеек вместе с @gacreationnonlinearfeasible
.
options = optimoptions('ga','CreationFcn',{@gacreationnonlinearfeasible
,...
'UseParallel',true,'NumStartPts',20});
Мультиобъективные опции определяют параметры, характерные для gamultiobj
алгоритм. Можно задать следующие параметры:
ParetoFraction
- Устанавливает долю индивидуумов, чтобы сохранить на первом фронте Парето, в то время как решатель выбирает индивидуумов с более высоких фронтов. Эта опция является скаляром между 0 и 1.
Примечание
Доля индивидуумов на первом фронте Парето может превысить ParetoFraction
. Это происходит, когда на шаге 6 итераций слишком мало индивидуумов других рангов.
DistanceMeasureFcn
- задает указатель на функцию, которая вычисляет меру расстояния индивидуумов, вычисленную в пространстве переменных принятия решений (генотип, также называемый пространством конструктивных переменных) или в пространстве функций (фенотип). Например, функция измерения расстояния по умолчанию является 'distancecrowding'
в функциональном пространстве, то же самое что и {@distancecrowding,'phenotype'}
.
«Расстояние» измеряет скопление каждого индивидуума в населении. Выберите один из следующих вариантов:
'distancecrowding'
, или эквивалентное {@distancecrowding,'phenotype'}
- Измерьте расстояние в функциональном пространстве соответствия.
{@distancecrowding,'genotype'}
- Измерьте расстояние в пространстве переменных принятия решений.
@distancefunction
- Написание пользовательской функции расстояния с помощью следующего шаблона.
function distance = distancefunction(pop,score,options) % Uncomment one of the following two lines, or use a combination of both % y = score; % phenotype % y = pop; % genotype popSize = size(y,1); % number of individuals numData = size(y,2); % number of dimensions or fitness functions distance = zeros(popSize,1); % allocate the output % Compute distance here
gamultiobj
проходит население в pop
, вычисленные счета для населения в scores
и опции в options
. Ваша функция расстояния возвращает расстояние от каждого представителя населения к ссылке, такой как ближайший соседний в некотором смысле. Для получения примера отредактируйте встроенный файл distancecrowding.m
.
ga
Гибридная функцияГибридная функция является другой функцией минимизации, которая запускается после завершения генетического алгоритма. Можно задать гибридную функцию в HybridFcn
опция. Не используйте с целочисленными задачами. Выбор:
[]
- Нет гибридной функции.
'fminsearch'
- Использует MATLAB® функция fminsearch
для выполнения минимизации без ограничений.
'patternsearch'
- Использует поиск шаблона для выполнения минимизации с ограничениями или без ограничений.
'fminunc'
- Использует функцию Optimization Toolbox™ fminunc
для выполнения минимизации без ограничений.
'fmincon'
- Использует функцию Optimization Toolbox fmincon
для выполнения ограниченной минимизации.
Примечание
Убедитесь, что ваша гибридная функция принимает ваши ограничения задачи. В противном случае, ga
выдает ошибку.
Можно задать отдельные опции для гибридной функции. Использовать optimset
для fminsearch
, или optimoptions
для fmincon
, patternsearch
, или fminunc
. Для примера:
hybridopts = optimoptions('fminunc','Display','iter','Algorithm','quasi-newton');
options
следующим образом:options = optimoptions('ga',options,'HybridFcn',{@fminunc,hybridopts});
hybridopts
должен существовать до того, как вы задаете options
.См. гибридную схему в Генетическом алгоритме для примера. Смотрите, когда использовать гибридную функцию.
gamultiobj
Гибридная функцияГибридная функция является другой функцией минимизации, которая запускается после завершения мультиобъективного генетического алгоритма. Можно задать гибридную функцию 'fgoalattain'
в HybridFcn
опция.
При использовании в качестве мультиобъективной гибридной функции решатель делает следующее:
Вычислите максимум и минимум каждой целевой функции в решениях. Для объективных j в k решения позвольте
Вычислите общий вес для каждого k решения,
Вычислите вес для каждой целевой функции j при каждом k решения,
Для каждого k решения выполните задачу достижения цели с вектором Fk (j) и вектором p (j, k).
Для получения дополнительной информации смотрите раздел 9.6 Deb [3].
Критерий остановки определяет, что заставляет алгоритм прекращать работу. Можно задать следующие опции:
MaxGenerations
- Задает максимальное количество итераций для выполнения генетического алгоритма. Значение по умолчанию является 100*numberOfVariables
.
MaxTime
- Задает максимальное время в секундах, которое генетический алгоритм запускает перед остановкой, как измерено tic
и toc
. Этот предел применяется после каждой итерации, поэтому ga
может превысить предел, когда итерация занимает значительное время.
FitnessLimit
- Алгоритм останавливается, если лучшее значение соответствия меньше или равно значению FitnessLimit
. Не применяется к gamultiobj
.
MaxStallGenerations
- Алгоритм останавливается, если среднее относительное изменение наилучшего значения функции соответствия над MaxStallGenerations
меньше или равно FunctionTolerance
. (Если StallTest
опция 'geometricWeighted'
, затем тест предназначен для геометрического взвешенного среднего значения относительного изменения.) Для задачи с нелинейными ограничениями, MaxStallGenerations
применяется к подпрограмме (см. «Алгоритмы нелинейного решателя ограничений»).
Для gamultiobj
, если геометрическое среднее относительное изменение в spread решений Парето по MaxStallGenerations
меньше FunctionTolerance
, и конечный спред меньше, чем средний спред за последнюю MaxStallGenerations
, затем алгоритм останавливается. Геометрический средний коэффициент ½. Спред является мерой движения фронта Парето. См. Алгоритм Гамультиобj.
MaxStallTime
- Алгоритм останавливается, если нет улучшения наилучшего значения соответствия для интервала времени в секундах, заданных MaxStallTime
, как измерено tic
и toc
.
FunctionTolerance
- Алгоритм останавливается, если среднее относительное изменение наилучшего значения функции соответствия над MaxStallGenerations
меньше или равно FunctionTolerance
. (Если StallTest
опция 'geometricWeighted'
, затем тест предназначен для геометрического взвешенного среднего значения относительного изменения.)
Для gamultiobj
, если геометрическое среднее относительное изменение в spread решений Парето по MaxStallGenerations
меньше FunctionTolerance
, и конечный спред меньше, чем средний спред за последнюю MaxStallGenerations
, затем алгоритм останавливается. Геометрический средний коэффициент ½. Спред является мерой движения фронта Парето. См. Алгоритм Гамультиобj.
ConstraintTolerance
- The ConstraintTolerance
не используется в качестве критерия остановки. Он используется, чтобы определить допустимость относительно нелинейных ограничений. Кроме того, max(sqrt(eps),ConstraintTolerance)
определяет допустимость относительно линейных ограничений.
См. пример в разделе «Установка максимального количества поколений и сваливных поколений».
Выходные функции являются функциями, которые вызывает генетический алгоритм при каждой генерации. В отличие от других решателей, ga
выходная функция может не только считать значения состояния алгоритма, но и изменять эти значения. Выходная функция может также остановить решатель в соответствии с установленными условиями.
options = optimoptions('ga','OutputFcn',@myfun);
Для нескольких выходных функций введите cell-массив указателей на функцию:
options = optimoptions('ga','OutputFcn',{@myfun1,@myfun2,...});
Чтобы увидеть шаблон, который можно использовать для записи собственных выходных функций, введите
edit gaoutputfcntemplate
в командной строке MATLAB.
Для получения примера смотрите Пользовательскую Выходную Функцию для Генетического Алгоритма.
Ваша выходная функция должна иметь следующий синтаксис вызова:
[state,options,optchanged] = myfun(options,state,flag)
MATLAB передает options
, state
, и flag
данные к вашей выходной функции, и выходная функция возвращает state
, options
, и optchanged
данные.
Примечание
Чтобы остановить итерации, установите state.StopFlag
к непустому вектору символов, такому как 'y'
.
Выходная функция имеет следующие входные параметры:
options
- Опции
state
- Структура, содержащая информацию о текущем поколении. Структура состояния описывает области state
.
flag
- Текущее состояние алгоритма:
'init'
- Состояние инициализации
'iter'
- Состояние итерации
'interrupt'
- Итерация подпрограммы нелинейно ограниченной задачи для 'auglag'
нелинейный алгоритм ограничения. Когда flag
является 'interrupt'
:
Значения state
поля применяются к итерациям подпроблемы.
ga
не принимает изменения в options
, и игнорирует optchanged
.
The state.NonlinIneq
и state.NonlinEq
поля недоступны.
'done'
- Окончательное состояние
Передача дополнительных параметров объясняет, как предоставить дополнительные параметры функции.
Выходная функция возвращает следующие аргументы в ga
:
state
- Структура, содержащая информацию о текущем поколении. Структура состояния описывает области state
. Чтобы остановить итерации, установите state.StopFlag
к непустому вектору символов, такому как 'y'
.
options
- Опции, измененные выходной функцией. Этот аргумент необязателен.
optchanged
- Логический флаг, указывающий на изменения в options
. Как изменить options
для последующих итераций установите optchanged
на true
.
Внимание
Изменение структуры состояния небрежно может привести к несогласованным или ошибочным результатам. Обычно можно добиться тех же или лучших изменений состояния с помощью мутационных или перекрестных функций, вместо изменения структуры состояния в функция построения графика или выходной функции.
ga
выходные функции могут изменить state
структура (см. «Структура состояния»). Будьте осторожны при изменении значений в этой структуре, так как вы можете передать несогласованные данные назад к ga
.
Совет
Если ваша структура output изменяет Population
поле, затем обязательно обновите Score
поле, и, возможно, Best
, NonlinIneq
, или NonlinEq
полей, так что они содержат непротиворечивую информацию.
Как обновить Score
поле после изменения Population
поле, сначала вычислите значения функций соответствия населения, затем вычислите масштабирование соответствия для населения. См. Раздел «Опции масштабирования соответствия»
'Display'
задает, какой объем информации отображается в командной строке во время работы генетического алгоритма. Доступные опции:
'final'
(по умолчанию) - Отображается причина остановки.
'off'
или эквивалентное 'none'
- Вывод не отображается.
'iter'
- Информация отображается при каждой итерации.
'diagnose'
- Информация отображается при каждой итерации. В сложение диагностика списков некоторые информации о задаче и опции, которые были изменены по умолчанию.
Оба 'iter'
и 'diagnose'
отобразить следующую информацию:
Generation
- Номер генерации
f-count
- Совокупное количество вычислений функции соответствия
Best f(x)
- Лучшее значение функции соответствия
Mean f(x)
- Среднее значение функции соответствия
Stall generations
- Количество поколений с момента последнего улучшения фитнес-функции
Когда нелинейная функция ограничения была задана, 'iter'
и 'diagnose'
не отображать Mean f(x)
, но дополнительно отобразит:
Max Constraint
- Максимальное нелинейное нарушение ограничений
Можно выбрать, чтобы ваши функции соответствия и ограничения оценивались последовательно, параллельно или векторизированно. Установите 'UseVectorized'
и 'UseParallel'
опции с optimoptions
.
Когда 'UseVectorized'
является false
(по умолчанию), ga
вызывает функцию соответствия для одного индивидуума за раз, когда она закольцовывается через население. (Это предполагает 'UseParallel'
значение по умолчанию false
.)
Когда 'UseVectorized'
является true
, ga
вызывает функцию соответствия сразу для всего населения в один вызов функции соответствия.
Если существуют нелинейные ограничения, функция соответствия и нелинейные ограничения все должны быть векторизированы в порядок, чтобы алгоритм вычислял векторизированным образом.
Смотрите Векторизацию Функции Соответствия для примера.
Когда UseParallel
является true
, ga
вызывает функцию соответствия параллельно, используя установленную вами параллельное окружение (см. «Как использовать параллельную обработку в Global Optimization Toolbox»). Задайте UseParallel
на false
(по умолчанию) для последовательного вычисления.
Примечание
Вы не можете одновременно использовать векторизованные и параллельные расчеты. Если вы задаете 'UseParallel'
на true
и 'UseVectorized'
на true
, ga
оценивает ваши функции соответствия и ограничения векторизированно, а не параллельно.
Как оцениваются функции соответствия и ограничения
UseVectorized = false | UseVectorized = true | |
---|---|---|
UseParallel = false | Последовательный | Векторизованный |
UseParallel = true | Параллель | Векторизованный |