exponenta event banner

Создание пользовательской функции печати

Сведения о пользовательских функциях печати

Если ни одна из функций графика, поставляемых вместе с программным обеспечением, не подходит для вывода, который требуется построить, можно написать собственную пользовательскую функцию графика, которую генетический алгоритм вызывает в каждом поколении для создания графика. В этом примере показано, как создать функцию графика, отображающую изменение значения наилучшего фитнеса от предыдущего поколения к текущему поколению.

Создание пользовательской функции печати

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

Связанные темы