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