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

Этот пример показывает, как создать и управлять опциями для функции генетического алгоритма 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 : 6250
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 : 680
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 : 1510
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.692

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

ga запускается со случайного набора точек в генеральной совокупности и использует операторы, чтобы произвести следующее поколение генеральной совокупности. Различные операторы масштабируются, выбор, перекрестное соединение и мутация. Тулбокс обеспечивает несколько функций, чтобы выбрать из для каждого оператора. Здесь мы выбираем fitscalingprop for FitnessScalingFcn и selectiontournament for 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 : 7250
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -173.284

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