Если ни одна из функций графика, поставляемых вместе с программным обеспечением, не подходит для вывода, который требуется построить, можно написать собственную пользовательскую функцию графика, которую генетический алгоритм вызывает в каждом поколении для создания графика. В этом примере показано, как создать функцию графика, отображающую изменение значения наилучшего фитнеса от предыдущего поколения к текущему поколению.
Чтобы создать функцию печати для этого примера, скопируйте и вставьте следующий код в новый файл в редакторе MATLAB ® Editor.
function state = gaplotchange(options, state, flag) % GAPLOTCHANGE Plots the logarithmic change in the best score from the % previous generation. % persistent last_best % Best score in the previous generation if(strcmp(flag,'init')) % Set up the plot xlim([1,options.MaxGenerations]); axx = gca; axx.YScale = 'log'; hold on; xlabel Generation title('Log Absolute Change in Best Fitness Value') end best = min(state.Score); % Best score in the current generation if state.Generation == 0 % Set last_best to best. last_best = best; else change = last_best - best; % Change in best score last_best = best; if change > 0 % Plot only when the fitness improves plot(state.Generation,change,'xr'); end end
Сохранить файл как gaplotchange.m в папке на пути MATLAB.
Чтобы использовать пользовательскую функцию печати, включите ее в опции.
rng(100) % For reproducibility options = optimoptions('ga','PlotFcn',{@gaplotbestf,@gaplotchange}); [x,fval] = ga(@rastriginsfcn,2,[],[],[],[],[],[],[],options)

Optimization terminated: maximum number of generations exceeded. x = -0.0003 0.0014 fval = 4.2189e-04
На сюжете показаны только изменения, превышающие 0, которые являются улучшениями в лучшем фитнесе. Логарифмическая шкала позволяет увидеть небольшие изменения в лучшей фитнес-функции, которую не раскрывает верхний график.
Функция графика использует информацию, содержащуюся в следующих структурах, которую генетический алгоритм передает функции в качестве входных аргументов:
options - Текущие параметры настройки
state - Информация о текущем поколении
flag - Текущее состояние алгоритма
Наиболее важными линиями функции графика являются следующие:
persistent last_best
Создание постоянной переменной last_best- лучший балл в предыдущем поколении. Постоянные переменные сохраняются в нескольких вызовах функции графика.
xlim([1,options.MaxGenerations]);
axx = gca;
axx.YScale = 'log';
Настройка графика перед запуском алгоритма. options.MaxGenerations - максимальное число поколений.
best = min(state.Score)
Область state.Score содержит оценки всех людей в текущей популяции. Переменная best - минимальный балл. Полное описание полей состояния структуры см. в разделе Структура функций графика.
change = last_best - best
Переменное изменение является лучшим баллом в предыдущем поколении минус лучший балл в текущем поколении.
if change > 0
Заговаривать только при наличии изменения в лучшем фитнесе.
plot(state.Generation,change,'xr')
График изменения в текущей генерации, номер которой содержится в state.Generation.
Код для gaplotchange содержит много тех же элементов, что и код для gaplotbestf, функция, которая создает лучший фитнес-сюжет.