How to apply bat algorithm to spring design problem?

1 回表示 (過去 30 日間)
Faith
Faith 2014 年 10 月 12 日
回答済み: Joe Ajay 2015 年 2 月 8 日
This is what I did:
%[5 20 1 0]
% Main programs starts here
function [best,fmin,N_iter]=bat_algorithm_spring1(para)
format long;
% Lb=[0.05 0.25 2.0]; Ub=[1.0 1.3 15.0];
% Default parameters
n=para(1) ; % Population size, typically 10 to 40
N_gen=para(2); % Number of generations
A=para(3) ; % Loudness (constant or decreasing)
r=para(4) ; % Pulse rate (constant or decreasing)
% This frequency range determines the scalings
% You should change these values if necessary
Qmin=0.0025; % Frequency minimum
Qmax=88.4 ; % Frequency maximum
% Iteration parameters
N_iter=0 ; % Total number of function evaluations
% Dimension of the search variables
d=3 ; % Number of dimensions
% Lower limit/bounds/ a vector
Lb=0.0025*ones(1,d);
% Upper limit/bounds/ a vector
Ub=88.4*ones(1,d);
% Initializing arrays
Q=zeros(n,1) ; % Frequency
v=zeros(n,d) ; % Velocities
% Initialize the population/solutions
for i=1:n,
Sol(i,:)=Lb+(Ub-Lb).*rand(1,d);
Fitness(i)=objfun(Sol(i,:));
end
% Find the initial best solution
[fmin,I]=min(Fitness);
best=[0.09 0.35 11];
% Start the iterations -- Bat Algorithm (essential part) %
for t=1:N_gen,
% Loop over all bats/solutions
for i=1:n,
Q(i)=Qmin+(Qmax-Qmin)*rand;
v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i);
S(i,:)=Sol(i,:)+v(i,:);
% Apply simple bounds/limits
%Sol(i,:)=simplebounds(Sol(i,:),Lb,Ub);
% Pulse rate
if rand>r
% The factor 0.001 limits the step sizes of random walks
S(i,:)=best+0.001*randn(1,d);
end
% Evaluate new solutions
Fnew=objfun(S(i,:));
% Update if the solution improves, or not too loud
if (Fnew<=Fitness(i)) & (rand<A) ,
Sol(i,:)=S(i,:);
Fitness(i)=Fnew;
% A=0.025*A;
%r=r*(1-exp(-1*t));
end
% Update the current best solution
if Fnew<=fmin,
best=S(i,:);
fmin=Fnew;
end
end
N_iter=N_iter+n;
end
% Output/display
disp(['Number of evaluations: ',num2str(N_iter)]);
disp(['Best =',num2str(best),' fmin=',num2str(fmin)]);
% Application of simple limits/bounds
function s=simplebounds(s,Lb,Ub)
% Apply the lower bound vector
ns_tmp=s;
I=ns_tmp<Lb;
ns_tmp(I)=Lb(I);
% Apply the upper bound vector
J=ns_tmp>Ub;
ns_tmp(J)=Ub(J);
%Update this new move
s=ns_tmp;
% Objective function
function f=objfun(x)
f=(2+x(3))*(x(1)^2)*x(2);
% Nonlinear constraints
function [g,geq]=nonfun(x)
% Inequality constraints
g(1)=1-(((x(2)^3)*(x(3)))/(71785*(x(1)^4)));
% Notice the typo 7178 (instead of 71785)
gtmp=((4*(x(2))^2)-(x(1)*x(2)))/(12566*(x(2)*(x(1)^3)-(x(1)^4)));
g(2)=gtmp+(1/(5108*(x(1)^2)))-1;
g(3)=1-((140.45*x(1))/((x(2)^2)*x(3)));
g(4)=((x(1)+x(2))/1.5)-1;
% Equality constraints [none]
geq=[]
This converges lower than the real value. What could be wrong?

回答 (1 件)

Joe Ajay
Joe Ajay 2015 年 2 月 8 日
Hi, am too working on that; got the same problem here. Got any answers?

カテゴリ

Help Center および File ExchangeMathematics についてさらに検索

タグ

製品

Community Treasure Hunt

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

Start Hunting!

Translated by