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