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

В этом примере показано, как создать и справиться, опции для генетического алгоритма функционируют ga использование optimoptions в Global Optimization Toolbox.

Подготовка проблемы для ga

ga поиски минимума функции с помощью генетического алгоритма. Для этого примера мы будем использовать ga чтобы минимизировать фитнес функционируют shufcn. shufcn действительная функция двух переменных.

Мы можем использовать функциональный plotobjective в тулбоксе, чтобы построить функциональный shufcn в области значений = [-2 2;-2 2].

plotobjective(@shufcn,[-2 2; -2 2]);

Использовать ga решатель, мы должны обеспечить по крайней мере два входных параметра, функцию фитнеса и количество переменных в проблеме. Первые два выходных аргумента возвращены ga x, лучшая точка, найденная, и Fval, значение функции в лучшей точке. Третий выходной аргумент, exitFlag говорит вам причину почему ga остановленный. ga может также возвратить четвертый аргумент, Output, который содержит информацию о производительности решателя.

FitnessFunction = @shufcn;
numberOfVariables = 2;

Запустите ga решатель.

rng default % For reproducibility
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The number of generations was : %d\n', Output.generations);
The number of generations was : 124
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 5881
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.199

Если при запуске этот пример без rng default команда, ваш результат может отличаться. Это поведение объяснено позже в этом примере.

Как работает генетический алгоритм

Генетический алгоритм работает над населением, использующим набор операторов, которые применяются к населению. Население является набором точек на пробеле проекта. Начальная генеральная совокупность сгенерирована случайным образом по умолчанию. Следующее поколение населения вычисляется с помощью физической формы индивидуумов в текущем поколении.

Добавление визуализации

ga может принять одну или несколько функций построения графика через options аргумент. Эта функция полезна для визуализации производительности решателя во время выполнения. Функции построения графика могут быть выбраны с помощью optimoptions.

Здесь мы используем optimoptions выбрать две функции построения графика. Первой функцией построения графика является gaplotbestf, который строит лучший и средний счет населения при каждой генерации. Второй функцией построения графика является gaplotstopping, который строит процент критерия остановки, которому удовлетворяют.

opts = optimoptions(@ga,'PlotFcn',{@gaplotbestf,@gaplotstopping});

Запустите ga решатель.

[x,Fval,exitFlag,Output] = ...
    ga(FitnessFunction,numberOfVariables,[],[],[],[],[],[],[],opts);

Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

Определение опций населения

Начальная генеральная совокупность по умолчанию создается с помощью универсального генератора случайных чисел. Значения по умолчанию для численности населения и области значений начальной генеральной совокупности используются, чтобы создать начальную генеральную совокупность.

Задайте численность населения

Численность населения по умолчанию используется ga 50, когда количество переменных решения меньше 5 и 200 в противном случае. Этот размер может быть плохим для некоторых проблем; меньшая численность населения может быть достаточной для меньших проблем. Поскольку у нас только есть две переменные, мы задаем численность населения 10. Мы непосредственно устанавливаем значение опции PopulationSize к 10 в наших ранее созданных опциях, opts.

opts.PopulationSize = 10;

Укажите диапазон начальной генеральной совокупности

Метод по умолчанию для генерации начальной генеральной совокупности использует универсальный генератор случайных чисел. Это создает начальную генеральную совокупность, где все точки находятся в области значений от 0 до 1. Например, население размера 3 в проблеме с двумя переменными могло быть похожим:

Population = rand(3,2)
Population = 3×2

    0.0149    0.0858
    0.3852    0.9966
    0.3954    0.4020

Начальная область значений может быть установлена путем изменения InitialPopulationRange опция. Область значений должна быть матрицей с двумя строками. Если область значений имеет только один столбец, т.е. это 2 1, то область значений каждой переменной является данной областью значений. Например, если мы устанавливаем область значений на [-1; 1], затем начальная область значений для обеих наших переменных-1 к 1. Чтобы указать различный начальный диапазон для каждой переменной, диапазон должен быть указан как матрица с двумя строками и numberOfVariables столбцы. Например, если мы устанавливаем область значений на [-1 0; 1 2], затем первая переменная будет в области значений-1 к 1, и вторая переменная будет в области значений от 0 до 2 (таким образом, каждый столбец будет соответствовать переменной).

Мы непосредственно изменим значение опции InitialPopulationRange в наших ранее созданных опциях, opts.

opts.InitialPopulationRange = [-1 0; 1 2];

Запустите ga решатель.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);

Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The number of generations was : %d\n', Output.generations);
The number of generations was : 67
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 614
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -179.987

Репродуцирование ваших результатов

По умолчанию, ga запускается со случайной начальной генеральной совокупности, которая создается с помощью генераторов случайных чисел MATLAB®. Следующее поколение производится с помощью ga операторы, которые также используют эти те же генераторы случайных чисел. Каждый раз случайное число сгенерировано, состояние изменения генераторов случайных чисел. Это означает, что, даже если вы не изменяете опций, когда вы запускаетесь снова, можно получить различные результаты.

Здесь мы запускаем решатель дважды, чтобы показать это явление.

Запустите ga решатель.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.484

Запустите ga снова.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -185.867

В предыдущих двух запусках, ga дал различные результаты. Результаты отличаются, потому что состояния генераторов случайных чисел изменились от одного запуска до другого.

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

thestate = rng;

Запустите ga.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.467

Сбросьте поток и повторно выполните ga. Результаты идентичны предыдущему запуску.

rng(thestate);
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.467

Однако вы не можете понять, что хотели бы попытаться воспроизвести результаты прежде, чем запустить ga. В этом случае пока у вас есть output структура, можно сбросить генератор случайных чисел можно следующим образом.

strm = RandStream.getGlobalStream;
strm.State = Output.rngstate.State;

Повторно выполните ga. Снова, результаты идентичны.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.467

Изменение критерия остановки

ga использование четыре различных критерия, чтобы определить, когда остановить решатель. ga остановки, когда максимальное количество поколений достигнуто; по умолчанию этот номер равняется 100. ga также обнаруживает, если нет никакого изменения в лучшем значении фитнеса, в течение некоторого времени даваемом в секундах (остановите ограничение по времени), или для некоторого количества поколений (максимальные поколения останова). Другой критерии является максимальным ограничением по времени в секундах. Здесь мы изменяем критерий остановки, чтобы увеличить максимальное число поколений к 150 и максимальных поколений останова к 100.

opts = optimoptions(opts,'MaxGenerations',150,'MaxStallGenerations', 100);

Запустите ga решатель снова.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);

Optimization terminated: maximum number of generations exceeded.
fprintf('The number of generations was : %d\n', Output.generations);
The number of generations was : 150
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 1361
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.692

Выбор ga Операторы

ga запускается со случайного набора точек в населении и использует операторы, чтобы произвести следующее поколение населения. Различные операторы масштабируются, выбор, перекрестное соединение и мутация. Тулбокс обеспечивает несколько функций, чтобы выбрать из для каждого оператора. Здесь мы выбираем fitscalingprop для FitnessScalingFcn и selectiontournament для SelectionFcn.

opts = optimoptions(@ga,'SelectionFcn',@selectiontournament, ...
                        'FitnessScalingFcn',@fitscalingprop);

Запустите ga решатель.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
fprintf('The number of generations was : %d\n', Output.generations);
The number of generations was : 144
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 6821
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -173.284

Лучшее значение функции может улучшиться, или оно может ухудшиться путем выбора различных операторов. Выбор хорошего набора операторов для вашей проблемы часто лучше всего делается экспериментированием.