Эффекты опций генетического алгоритма

Этот пример показывает эффекты некоторых опций для функции генетического алгоритма ga. Вы создаете и изменяете опции при помощи optimoptions функция.

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

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

Постройте shufcn в области значений = [-2 2;-2 2] путем вызова plotobjective.

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 стохастический алгоритм.

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

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

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

Чтобы визуализировать эффективность решателя при выполнении, установите 'PlotFcn' опция с помощью optimoptions. В этом случае выберите две функции построения графика в массиве ячеек. Установите gaplotbestf, который строит лучший и средний счет населения при каждой генерации. Также установите gaplotstopping, который строит процент критерия остановки, которому удовлетворяют.

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

Запустите ga решатель, включая opts аргумент.

[x,Fval,exitFlag,Output] = ...
    ga(FitnessFunction,numberOfVariables,[],[],[],[],[],[],[],opts);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

Задайте опции населения

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

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

opts.PopulationSize = 10;

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

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

Population = [-10,-10] + 20*rand(3,2);

Начальная область значений может быть установлена путем изменения 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 также обнаруживает, если нет никакого изменения в лучшем значении фитнеса, в течение некоторого времени даваемом в секундах (остановите ограничение по времени), или для некоторого количества поколений (максимальные поколения останова). Другой критерии является максимальным ограничением по времени в секундах. Измените критерий остановки, чтобы увеличить максимальное число поколений к 300 и максимальных поколений останова к 100.

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

Повторно выполните 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 : 299
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 2702
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.729

Выберите 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 : 52
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 2497
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : -186.417

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

Смотрите также

Похожие темы