Error with passing a fitness function into a GA command

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 Commenti

Ling - in your second call to ga
ga(@(x)NSD_Fitness(x,{CombinedYieldRank,CombinedPPIRank,r})
what are you trying to do with the above?
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.

Accedi per commentare.

 Risposta accettata

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.

Più risposte (0)

Categorie

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by