Опции генетического алгоритма

Опции для генетического алгоритма

Установите опции для 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/r. Таким образом, масштабированный счет самой подгоняемой индивидуума пропорциональен 1, масштабированный счет следующей самой подгонки пропорциональен 1/2и так далее. Ранговое масштабирование соответствия удаляет эффект распространения необработанных счетов. Квадратный корень делает плохо ранжированный индивидуумов более почти равный по счету, по сравнению с рангом оценкой. Для получения дополнительной информации см. «Масштабирование соответствия».

  • '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, одинаково во всех координатах родительского вектора и задается рекурсивной формулой

      σk=σk1(1СжатьсяkГенерация).

      Если вы задаете InitialPopulationRange быть вектором с двумя строками и nvars столбцы, стандартное отклонение в i координат родительского вектора на k-м генерации, σi,k, задается рекурсивной формулой

      σi,k=σi,k1(1Сжаться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' использование следующих пар "имя-значение".

ИмяЗначение
SolverOptsfmincon опции, созданные с помощью 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 опция.

При использовании в качестве мультиобъективной гибридной функции решатель делает следующее:

  1. Вычислите максимум и минимум каждой целевой функции в решениях. Для объективных j в k решения позвольте

    Fmax(j)=maxkFk(j)Fmin(j)=minkFk(j).

  2. Вычислите общий вес для каждого k решения,

    w(k)=jFmax(j)Fk(j)1+Fmax(j)Fmin(j).

  3. Вычислите вес для каждой целевой функции j при каждом k решения,

    p(j,k)=w(k)Fmax(j)Fk(j)1+Fmax(j)Fmin(j).

  4. Для каждого 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 = falseUseVectorized = true
UseParallel = falseПоследовательныйВекторизованный
UseParallel = trueПараллельВекторизованный