Этот пример показывает эффекты некоторых опций для функции генетического алгоритма 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 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.
Опции населения могут оказать большое влияние на эффективность решателя. Скорость каждой итерации зависит от численности населения: более многочисленное население приводит к более медленным итерациям. С другой стороны более многочисленное население приводит к 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.
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.
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
Лучшее значение функции может улучшиться или ухудшиться на основе заданных операторов. Экспериментирование с различными операторами часто является лучшим способом определить, какой набор операторов работает лучше всего на вашу проблему.