Index in position 2 exceeds array bounds (must not exceed 2)

조회 수: 1 (최근 30일)
ShravanKumar Shivappa Masalvad
ShravanKumar Shivappa Masalvad 2021년 9월 20일
댓글: Mathieu NOE 2021년 9월 20일
format short
clear all
clc
%% INITIALIZING THE PARAMETERS
fun=@fun3bar;
N=300;
D=2;
lb=[0 0];
ub=[1 1];
itermax=100;
%%GENERATING THE INITIAL POPULATION
for i=1:N
for j=1:D
pos(i,j)=lb(j)+rand*(ub(j)-lb(j));
end
end
%%EVALUATING OBJECTIVE FUNCTION
fx=fun(pos);
%%INITIALIZE gBEST
[fminvalue,ind]=min(fx);
gbest=pos(ind,:);
gbest
%%GWO MAIN LOOP WILL START NOW
iter=1;
while iter<=itermax
Fgbest=fminvalue;
a=2-2*(iter/itermax)
for i=1:N
x=pos(i,:);
pos1=pos;
A1=2.*a.*rand(1,D)-a;
C1=2.*rand(1,D);
%% Now let's calculate ALPHA Value i.e., FIRST BEST
[alpha,alphaind]=min(fx);
alphapos=pos1(alphaind,:);
Dalpha=abs(C1.*alphapos-x);
x1=alphapos-A1.*Dalpha;
pos1(alphaind,:)=[];
fx1=fun(pos1);
%% Now let's calculate BETA Value i.e., SECOND BEST
[bet,betind]=min(fx1);
betpos=pos1(betind,:);
A2=2.*a.*rand(1,D)-a;
C2=2.*rand(1,D);
Dbet=abs(C2.*betpos-x);
x2=betpos-A2.*Dbet;
%%FINDING DELTA POSITION i.e., THIRD BEST
[delta,deltaind]=min(fx1);
deltapos=pos1(deltaind,:);
A3=2.*a.*rand(1,D)-a;
C3=2.*rand(1,D);
Ddelta=abs(C3.*deltapos-x);
x3=deltapos-A3.*Ddelta;
xnew=(x1+x2+x3)./3
%%%CHECK THE BOUNDARIES
xnew=max(xnew,lb);
xnew=min(xnew,ub);
fnew=fun(xnew);
%%%GREEDY SELECTION
if fnew<fx(i)
pos(i,:)=xnew;
fx(i,:)=fnew;
end
end
%%UPDATE GBEST (DESTINATION)
[fmin,find]=min(fx);
if fmin<Fgbest
Fgbest=fmin;
gbest=pos(find,:);
end
%%%%MEMORIZE THE BEST SOLUTION
[optval,optind]=min(fx);
BestFx(iter)=optval;
BestX(iter,:)=pos(optind,:);
%%%SHOW ITERATION INFORMATION
disp(['Iteration' num2str(iter):'Best Cost=' (num2str(BestFx(iter)))]); %#ok<BDSCA>
%%%PLOTTING THE RESULT
plot(BestFx,'Line Width',2);
xlabel('Iteration Number');
ylabel('Fitness Value')
title('Convergence Vs Iteration')
grid on
iter=iter+1
end
  댓글 수: 2
Walter Roberson
Walter Roberson 2021년 9월 20일
We do not have fun3bar to test with, and you did not show us which line the problem is occuring on.
ShravanKumar Shivappa Masalvad
ShravanKumar Shivappa Masalvad 2021년 9월 20일
function out= fun3bar(x)
A1=x(:,1)
A2=x(:,2)
%%Let's write the objective fucntion
fx=(2.*sqrt(2).*A1+A2)*100;
%%% Now writing all inequality constraints here
g(:,1)=2.*(sqrt(2).*A1+A2)./(sqrt(2)*A1.^2+2.*A1.*A2)-2;
g(:,2)=((2.*A2)./sqrt(2).*A1.^2+2.*A1.*A2)-2;
g(:,3)=(2./(A1+sqrt(2).*A2))-2;
%%DEFINE PENALTY TERM
pp=10^9;
for i=1:size(g,1)
for j=1:size(g,2)
if g(i,j)>0
penalty(i,j)=pp.*g(i,j);
else
penalty(i,j)=0;
end
end
end
%%% COMPUTE OBJECTIVE FUNCTION
out=fx+sum(penalty,2);

댓글을 달려면 로그인하십시오.

답변 (1개)

Mathieu NOE
Mathieu NOE 2021년 9월 20일
hello
just fixed minor issues on following two lines
%%%SHOW ITERATION INFORMATION
disp(['Iteration : ' num2str(iter) ' ; Best Cost=' (num2str(BestFx(iter)))]);
%%%PLOTTING THE RESULT
plot(BestFx,'Linewidth',2);
and the code seems to work fine - no error throw at the command window so far
also terminated some lines where the ; was missing (speed up the simulation and do not fill the command window with intermediate results).
beside that , the fitness value does not seem to decrease a lot , but that's another topic...
full code :
format short
clear all
clc
%% INITIALIZING THE PARAMETERS
fun=@fun3bar;
N=300;
D=2;
lb=[0 0];
ub=[1 1];
itermax=100;
%%GENERATING THE INITIAL POPULATION
for i=1:N
for j=1:D
pos(i,j)=lb(j)+rand*(ub(j)-lb(j));
end
end
%%EVALUATING OBJECTIVE FUNCTION
fx=fun(pos);
%%INITIALIZE gBEST
[fminvalue,ind]=min(fx);
gbest=pos(ind,:);
% gbest
%%GWO MAIN LOOP WILL START NOW
iter=1;
while iter<=itermax
Fgbest=fminvalue;
a=2-2*(iter/itermax);
for i=1:N
x=pos(i,:);
pos1=pos;
A1=2.*a.*rand(1,D)-a;
C1=2.*rand(1,D);
%% Now let's calculate ALPHA Value i.e., FIRST BEST
[alpha,alphaind]=min(fx);
alphapos=pos1(alphaind,:);
Dalpha=abs(C1.*alphapos-x);
x1=alphapos-A1.*Dalpha;
pos1(alphaind,:)=[];
fx1=fun(pos1);
%% Now let's calculate BETA Value i.e., SECOND BEST
[bet,betind]=min(fx1);
betpos=pos1(betind,:);
A2=2.*a.*rand(1,D)-a;
C2=2.*rand(1,D);
Dbet=abs(C2.*betpos-x);
x2=betpos-A2.*Dbet;
%%FINDING DELTA POSITION i.e., THIRD BEST
[delta,deltaind]=min(fx1);
deltapos=pos1(deltaind,:);
A3=2.*a.*rand(1,D)-a;
C3=2.*rand(1,D);
Ddelta=abs(C3.*deltapos-x);
x3=deltapos-A3.*Ddelta;
xnew=(x1+x2+x3)./3;
%%%CHECK THE BOUNDARIES
xnew=max(xnew,lb);
xnew=min(xnew,ub);
fnew=fun(xnew);
%%%GREEDY SELECTION
if fnew<fx(i)
pos(i,:)=xnew;
fx(i,:)=fnew;
end
end
%%UPDATE GBEST (DESTINATION)
[fmin,find]=min(fx);
if fmin<Fgbest
Fgbest=fmin;
gbest=pos(find,:);
end
%%%%MEMORIZE THE BEST SOLUTION
[optval,optind]=min(fx);
BestFx(iter)=optval;
BestX(iter,:)=pos(optind,:);
%%%SHOW ITERATION INFORMATION
disp(['Iteration : ' num2str(iter) ' ; Best Cost=' (num2str(BestFx(iter)))]);
%%%PLOTTING THE RESULT
plot(BestFx,'Linewidth',2);
xlabel('Iteration Number');
ylabel('Fitness Value')
title('Convergence Vs Iteration')
grid on
iter=iter+1;
end
function out= fun3bar(x)
A1=x(:,1);
A2=x(:,2);
%%Let's write the objective fucntion
fx=(2.*sqrt(2).*A1+A2)*100;
%%% Now writing all inequality constraints here
g(:,1)=2.*(sqrt(2).*A1+A2)./(sqrt(2)*A1.^2+2.*A1.*A2)-2;
g(:,2)=((2.*A2)./sqrt(2).*A1.^2+2.*A1.*A2)-2;
g(:,3)=(2./(A1+sqrt(2).*A2))-2;
%%DEFINE PENALTY TERM
pp=10^9;
for i=1:size(g,1)
for j=1:size(g,2)
if g(i,j)>0
penalty(i,j)=pp.*g(i,j);
else
penalty(i,j)=0;
end
end
end
%%% COMPUTE OBJECTIVE FUNCTION
out=fx+sum(penalty,2);
end

카테고리

Help CenterFile Exchange에서 Graphics Object Programming에 대해 자세히 알아보기

제품


릴리스

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by