Error with passing a fitness function into a GA command

1 view (last 30 days)
Hi There,
I created a fitness function in an m file called NSD_Fitness as follows:
*******************************************
function y = NSD_Fitness(X)
global CombinedYieldRank CombinedPPIRank r
y = 1/...
( ( X(1) + X(2) + X(3) ) * ( r * CombinedYieldRank(1,1) + (1-r) * CombinedPPIRank(1,1) ) + ( X(4) + X(5) + X(6) ) * ( r * CombinedYieldRank(1,2) + (1-r) * CombinedPPIRank(1,2) ) + ( X(7) + X(8) + X(9) ) * ( r * CombinedYieldRank(1,3) + (1-r) * CombinedPPIRank(1,3) ) + ( X(10) + X(11) + X(12) ) * ( r * CombinedYieldRank(1,4) + (1-r) * CombinedPPIRank(1,4) ) + ...
...
( X(85) + X(86) + X(87) ) * ( r * CombinedYieldRank(8,1) + (1-r) * CombinedPPIRank(8,1) ) + ( X(88) + X(89) + X(90) ) * ( r * CombinedYieldRank(8,2) + (1-r) * CombinedPPIRank(8,2) ) + ( X(91) + X(92) + X(93) ) * ( r * CombinedYieldRank(8,3) + (1-r) * CombinedPPIRank(8,3) ) + ( X(94) + X(95) + X(96) ) * ( r * CombinedYieldRank(8,4) + (1-r) * CombinedPPIRank(8,4) ) );
end
*******************************************
In another m file called NSD_Main, I used below statement to create a function handle of NSD_Fitness and passed it into a GA command like below:
*******************************************
...
FitFcn = @NSD_Fitness;
options = optimoptions( 'ga','ConstraintTolerance',1e-3,'CreationFcn',[],'MaxStallGenerations',500,...
'FunctionTolerance',0,'PopulationSize',200,...
'CrossoverFraction',0.9,...
'PlotFcn',{@gaplotbestf,@gaplotstopping});
[x,Fval,exitFlag,Output] = ga(FitFcn,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options);
*******************************************
Interestingly, I was able to see the GA plots but received the error message below after:
*******************************************
Undefined function 'NSD_Fitness' for input arguments of type 'double'.
Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});
Error in gapenalty
Error in gapenalty
Error in gaminlp
Error in ga (line 394)
[x,fval,exitFlag,output,population,scores] = gaminlp(FitnessFcn,nvars, ...
Error in NSD_Main (line 169)
[x,Fval,exitFlag,Output] = ga(FitFcn,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options);
*******************************************
All the other parts of my code have been checked correct except for the function handle. What's wrong and how should I code it? Thank you very much.
  2 Comments
Geoff Hayes
Geoff Hayes on 15 Sep 2020
Ling - in your second call to ga
ga(@(x)NSD_Fitness(x,{CombinedYieldRank,CombinedPPIRank,r})
what are you trying to do with the above?
Ling Kev
Ling Kev on 15 Sep 2020
Hi Geoff,
Thanks for your prompt response. Please ignore the previous coding. What I wrote is actually as follows:
[x,Fval,exitFlag,Output] = ga(FitFcn,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options);
Then I get the error message as now shown in my post.

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 15 Sep 2020
This is a bit confusing.
First, ‘NSD_Fitness’ should be:
function y = NSD_Fitness(X,CombinedYieldRank,CombinedPPIRank,r)
y = 1/...
( ( X(1) + X(2) + X(3) ) * ( r * CombinedYieldRank(1,1) + (1-r) * CombinedPPIRank(1,1) ) + ( X(4) + X(5) + X(6) ) * ( r * CombinedYieldRank(1,2) + (1-r) * CombinedPPIRank(1,2) ) + ( X(7) + X(8) + X(9) ) * ( r * CombinedYieldRank(1,3) + (1-r) * CombinedPPIRank(1,3) ) + ( X(10) + X(11) + X(12) ) * ( r * CombinedYieldRank(1,4) + (1-r) * CombinedPPIRank(1,4) ) + ...
...
( X(85) + X(86) + X(87) ) * ( r * CombinedYieldRank(8,1) + (1-r) * CombinedPPIRank(8,1) ) + ( X(88) + X(89) + X(90) ) * ( r * CombinedYieldRank(8,2) + (1-r) * CombinedPPIRank(8,2) ) + ( X(91) + X(92) + X(93) ) * ( r * CombinedYieldRank(8,3) + (1-r) * CombinedPPIRank(8,3) ) + ( X(94) + X(95) + X(96) ) * ( r * CombinedYieldRank(8,4) + (1-r) * CombinedPPIRank(8,4) ) );
end
Get rid of the global variables. Note that ‘y’ must be a scalar value.
Second, ‘FitFcn’ must be defined as:
FitFcn = @(X) NSD_Fitness(X,CombinedYieldRank,CombinedPPIRank,r);
then this should work:
[x,Fval,exitFlag,Output] = ga(FitFcn,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options);
I obviously cannot test that, so you will need to.

More Answers (0)

Categories

Find more on Particle & Nuclear Physics 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!