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