Why this piece of code gives error?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
Sadiq Akbar
il 20 Apr 2022
Commentato: Steven Lord
il 21 Apr 2022
CostFunction='fun4sn0';
nPop=120;
nVar=4;%nVar=1000;
nPop_Initial=nPop;
nPop_Final=30;
MaxNFE=3e3;
MaxIter0=ceil(MaxNFE/((nPop_Initial+nPop_Final)/2)); % Approximate Maximum Iterations
Cr=0.5;
xmin=[0 0 0 0];
xmax=[10 10 pi pi];
%%%%%%%%%%%
NFE=0;
Gbest.Position=[];
Gbest.Cost=inf;
BestCosts=nan(1,MaxIter0);
nfe=BestCosts;
for i=1:nPop
Velocity(i,:)=zeros(1,nVar); %#ok<*SAGROW>
Position(i,:)=xmin+(xmax-xmin).*rand(1,nVar);
Cost(i)=CostFunction(Position(i,:));
PbestPosition(i,:)=Position(i,:);
PbestCost(i)=Cost(i);
PbestVel(i,:)=Velocity(i,:);
if PbestCost(i)<Gbest.Cost
Gbest.Position=PbestPosition(i,:);
Gbest.Cost=PbestCost(i);
Gbest.Velocity= PbestVel(i,:);
end
end
2 Commenti
Risposta accettata
Steven Lord
il 20 Apr 2022
Either make your CostFunction variable a function handle to the fun4sn0 function (which is the approach I'd prefer):
CostFunction= @fun4sn0;
or use feval to evaluate the function by name.
Cost(i) = feval(CostFunction, Position(i, :));
Both of these assume that your function returns a scalar, since you're assigning its output into one element of the Cost variable.
3 Commenti
Image Analyst
il 21 Apr 2022
@Steven Lord messing with function handles and feval() seems like a roundabout way to do it. Is that better than just calling the function directly like I suggested?
Cost(i) = fun4sn0(Position(i,:));
Steven Lord
il 21 Apr 2022
@Image Analyst That is another option, and is the easiest if you want to hard-code the cost function. I think that particular name put me in "this is likely going to be used in some form of optimization" mode and in that case (the "function function" scenario, see ode45, fminsearch, fzero, integral, etc.) to keep the code as a general purpose solver you wouldn't want to hard-code the function.
Più risposte (1)
Image Analyst
il 20 Apr 2022
CostFunction is a character array, not an actual function. Did you mean
Cost(i) = fun4sn0(Position(i,:));
instead of
Cost(i)=CostFunction(Position(i,:));
Thorough discussion of the error in the FAQ:
Vedere anche
Categorie
Scopri di più su Interactive Control and Callbacks in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!