MATLAB Answers

0

Customised output function for ga

Asked by Yaser Khojah on 18 May 2018 at 16:40
Latest activity Commented on by Walter Roberson
on 18 May 2018 at 21:33

I have been looking how to create my own output function in GA to get each x and fval of each iteration and generation. Although I have looked into all the answered questions for such a question, nothing has been working so far. Here is my output function and please help me with what I'm missing.

function [state,options,optchanged] = gaoutfun(options,state,flag)
persistent history_pop history_Best history_Score
history_pop     = [];
history_Best    = [];
history_Score   = [];
optchanged = false;
switch flag
  case 'init'
          history_pop   = [history_pop;state.Population];
          assignin('base','gapopulationhistory',history_pop);
          history_Best  = [history_Best;state.Best];
          assignin('base','gabesthistory',history_Best);
          history_Score = [history_Score;state.Score];
          assignin('base','gascorehistory',history_Score);
    case 'iter'
          history_pop   = [history_pop;state.Population];
          assignin('base','gapopulationhistory',history_pop);
          history_Best  = [history_Best;state.Best];
          assignin('base','gabesthistory',history_Best);
          history_Score = [history_Score;state.Score];
          assignin('base','gascorehistory',history_Score);
    case 'done'
          history_pop   = [history_pop;state.Population];
          assignin('base','gapopulationhistory',history_pop);
          history_Best  = [history_Best;state.Best];
          assignin('base','gabesthistory',history_Best);
          history_Score = [history_Score;state.Score];
          assignin('base','gascorehistory',history_Score);        
end

  0 Comments

Sign in to comment.

2 Answers

Answer by Walter Roberson
on 18 May 2018 at 19:42
 Accepted Answer

function [state,options,optchanged] = gaoutfun(options,state,flag)
    persistent state_record 
    if isempty(state_record)
      state_record = struct('Population', {}, 'Best', {}, 'Score', {});
    end
    if nargin == 0
      state = state_record;
      options = [];
      optchanged = [];
    else
      state_record(end+1) = struct('Population', state.Population, 'Best', state.Best', 'Score', state.Score);
      optchanged = false;
    end

Before re-using this function, call

clear gaoutfun

Let the function be called as usual. Do not expect any changes outside the function when it is called.

After the ga run is finished, call

record = gaoutfun();

with no inputs. A structure of the state information will be returned.

However, this is likely to be a bit inefficient because the struct is expanded each iteration. I would suggest that when isempty() succeeds, that options be examined to find the maximum generations, and that state_record be initialized that large. Use state.Generation as the index for the output instead of end+1

  2 Comments

Dear Walter Roberson,

Thank you so much for your help I have been looking for two days and nothing helped as much you did.

I added the last part for future users as you suggested.

clear gaoutfun
options  = optimoptions('ga','OutputFcn',@gaoutfun);
fun      = @gaintobj;
[x,fval] = ga(fun,nvar,[],[],[],[],lb,ub,[],IntCon,options);
record   = gaoutfun();

Is there away to extract all these data and put them in on matrix? or I should use the Excel sheet to do that?

gapopulationhistory = vertcat(record.Population);
gabesthistory = vertcat(record.Best);
gascorehistory = vertcat(record.Score);
gahistory = [gascorehistory, gabesthistory, gapopulationhistory];

Sign in to comment.


Answer by Alan Weiss
on 18 May 2018 at 17:04

Have you looked at the documentation example that creates a history in an output function for ga?

Alan Weiss

MATLAB mathematical toolbox documentation

  1 Comment

Dear Alan,

Yeah I did and could not get any close. I saw this example https://uk.mathworks.com/help/gads/custom-output-function-for-genetic-algorithm.html#d119e19384 and I tried to make something similar but nothing worked. Is there away you spot what I missing in my code? Thank you so much.

I saw this one too https://uk.mathworks.com/help/matlab/math/output-functions.html but does not work for GA. I'm lost now and been working on it for awhile and can't get what I need.

Sign in to comment.


Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today