problem with output of ga data in fitness function
4 views (last 30 days)
Show older comments
I do have a problem with the output of my ga. I formulated a ga problem in any form. My fitness and output function are shown below. The output function is pritty much a modified copy of the Matlab Docu example.
I want my ga to give me other values, then the actual score as an output. I highlighted it down in the code:
problem.fitnessfcn = @(x) myfitnessfun(x,otherParameter);
problem.options = optimoptions('ga','UseParallel', true,'PopulationSize',10,'OutputFcn',{@gaoutfun},'Display','iter');
[x,fval,exitflag,output,population,scores] = ga(problem);
%% This is my fitness function
function K = myfitnessfun(x,otherParameter)
% Definition of persistent variables for the history
persistent n k my_output_history
% the struct variable my_output is calculated with the function my_special_function as a function of x and otherParameter
[my_output] = my_special_function(x,otherParamter)
% The scalar fitness is calculted with a operator function make_scalar_value
K = make_scalar_value(my_output);
%% Here I use the persistent variables to store and save the values of my_output in the workspace.
% This is only working in serial run of the ga. It is not working for the parallel run
% I save all the data of all runs of the finess function in the cell array my_out_history
if isempty(n)
n=1;
k=1;
my_output_history = cell(1e4,2);
end
if rem(n,1) == 0
my_output_history{k,1} = my_output;
my_output_history{k,2} = x; % For the later assignement of the values i also store the vector of x in the cell array
assignin('base','my_output_history', my_output_history);
k = k+1;
end
n = n+1;
%% I want to access and save all the different values of my_output into the workspace.
% Here i want something like:
my_output_history(state.Individual) = my_output;
assignin('base','my_output',my_output_history);
end
%% This is my output function
% I cannot hand over the gaoutfun other values than options, state and flag
function [state,options,optchanged] = gaoutfun(options,state,flag)
persistent pophistory scorehistory bestscorehistory
optchanged = false;
switch flag
case 'init'
pophistory(:,:,1) = state.Population;
scorehistory(:,1) = state.Score;
bestscorehistory(1) = min(scorehistory(:,1));
assignin('base','gapopulationhistory',pophistory);
assignin('base','gascorehistory',scorehistory);
assignin('base','gabestscorehistory',bestscorehistory);
case 'iter'
% Update the pophistory every 10 generations.
if rem(state.Generation,1) == 0
ss = size(pophistory,3);
pophistory(:,:,ss+1) = state.Population;
scorehistory(:,ss+1) = state.Score;
bestscorehistory(ss+1,1) = min(scorehistory(:,ss+1));
assignin('base','gapopulationhistory',pophistory);
assignin('base','gascorehistory',scorehistory);
assignin('base','gabestscorehistory',bestscorehistory);
ibest = state.Best(end);
ibest = find(state.Score == ibest,1,'last');
bestx = state.Population(ibest,:);
disp(['best x in population: ', num2str(bestx)]);
% pause(0.01)
end
case 'done'
% Include the final population in the pophistory.
ss = size(pophistory,3);
pophistory(:,:,ss+1) = state.Population;
scorehistory(:,ss+1) = state.Score;
bestscorehistory(ss+1,1) = min(scorehistory(:,ss+1));
assignin('base','gapopulationhistory',pophistory);
assignin('base','gascorehistory',scorehistory);
assignin('base','gabestscorehistory',bestscorehistory);
end
end
Is there a way, i can access the actual state of the ga in the fitness function like it is done in the output function? At the moment I`m using the version that can be found above, but this i not working for parallel computing.
Basically i want at the end: The history not only of the scores (scalar values) and the population information but also of my own variable (struct) my_output, that is calculated as a function of x in the fitness function.
Any good ideas how do do this?
Thanks a lot!
1 Comment
Matt J
on 14 Dec 2020
Since you are using UseParallel what does "history" even mean? In parallel computing, there is no well-defined sequence of anything.
Answers (0)
See Also
Categories
Find more on Nonlinear Optimization in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!