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

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

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

См. также

Похожие темы