exponenta event banner

Влияние вариантов генетического алгоритма

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

Настройка проблемы для ga

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

График shufcn в диапазоне = [-2 2;-2 2] путем вызова plotobjective.

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

Figure contains an axes. The axes contains 2 objects of type surface, contour.

Для использования 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 is: %d\n', Output.generations);
The number of generations is: 124
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 5881
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: -186.71 Mean: -123.753 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Stopping Criteria contains an object of type bar.

Задать параметры заполнения

Опции заполнения могут оказывать большое влияние на производительность решателя. Скорость каждой итерации зависит от размера совокупности: большая совокупность приводит к более медленным итерациям. И наоборот, большая популяция приводит к ga более тщательное изучение, так что может привести к лучшему решению. Аналогичным образом, более широкий первоначальный ареал может привести к более тщательной разведке, но может потребовать, чтобы большая популяция исследовала более широкий ареал с аналогичной тщательностью.

Указать размер совокупности

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

opts.PopulationSize = 10;

Указать начальный диапазон заполнения

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

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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: -179.987 Mean: -78.6061 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Stopping Criteria contains an object of type bar.

fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 67
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 614
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -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 is: %g\n', Fval);
The best function value found is: -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 is: %g\n', Fval);
The best function value found is: -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 is: %g\n', Fval);
The best function value found is: -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 is: %g\n', Fval);
The best function value found is: -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 is: %g\n', Fval);
The best function value found is: -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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: -186.729 Mean: -186.202 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Stopping Criteria contains an object of type bar.

fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 299
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 2702
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -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 is: %d\n', Output.generations);
The number of generations is: 52
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 2497
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.417

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

См. также

Связанные темы