Cırcır Böceği Algoritması(Cricket Algorithm)’nın adım adım işlenmesi:

Adım 1: Verilen problemdeki limitlere uygun ilk popülasyon değerleri rastgele
oluşturulur. Bu değerler uygunluk fonksiyonuna gönderilerek böceklerin çıkardıkları
sesin şiddeti için ilk değer atamaları yapılır.
Adım 2: Kanat çırpış sayısı rastgele üretilir. Üretilen kanat çırpış sayısı ile havanın
sıcaklığı Dolbear yasasına göre elde edilir.
Adım 3: Bu sıcaklıktaki sesin hızı hesaplanır. Bu hızdaki frekans değeri hesaplanır.
Adım 4: Bu frekans ve hız değerlerine göre böceklerin koordinatları güncellenir.
Güncellenen bu değerler hedef fonksiyona gönderilir.
Adım 5: Mevcut değerden daha küçük bir değer elde edilirse en iyi değer olarak bu değer kabul edilir. Aksi takdirde yeni değerler elde edilerek çözüme devam edilir.
Adım 6: Maksimum iterasyona veya tolerans değerine ulaşana kadar en iyi çözüm aranır.
Adım 7: Algoritmanın sonunda en iyi çözümler ve bu çözümlerden elde edilen uygunluk fonksiyonu değeri gösterilir.

Cırcır Böceği Algoritması(Cricket Algorithm)’nın akış şeması:

cba

Cırcır Böceği Algoritması(Cricket Algorithm)’nın sözde kodu:

cba-sozde-kodu

Not: Denklemler için aşağıdaki kodları veya Murat CANAYAZ’ın doktora tezini inceleyebilirsiniz.

Cırcır Böceği Algoritması(Cricket Algorithm)’nın MATLAB kodu:

cricket_algorithm.m dosyası:

function [best,fmin,N_iter]=cricket_algorithm(para)
% Varsayılan Parametreler
if nargin<1, para=[25 0.5]; end
n=para(1); % Population büyüklüğü
alpha=para(2);
betamin=0.2;
d=2;
pi=3.14;
Lb=-1*ones(1,d);%Alt Limit
Ub=1*ones(1,d); % Üst Limit Vektörleri
Qmin=0; % Minimum frekans
% İterasyon parametreleri
tol=10^(-6); % Durdurma Kriteri
N_iter=0; % Toplam gelişim sayısını tutan sayaç
% Başlangıç vektörleri
Q=zeros(n,1);
v=zeros(n,d);
for i=1:n,
Sol(i,:)=Lb+(Ub-Lb).*rand(1,d);
Fitness(i)=Fun(Sol(i,:));
end
% Mevcut en iyiyi bulma
[fmin,I]=min(Fitness);
best=Sol(I,:);
tic;
% Algoritma başlangıç
while(fmin>tol)
for i=1:n,
N(i,:) = randi([0 120],1,d);
T(i,:)=0.891797*N(i,:)+40.0252;
if(T(i,:)>180)
T(i,:)=180;
end
if(T(i,:)<55)
T(i,:)=55;
end
C(i,:)=(5/9)*(T(i,:)-32);
V(i,:)=20.1*sqrt(273+C(i,:));
V(i,:)=sqrt(V(i,:))/1000;
Z(i,:)=(Sol(i,:)-best);
if(Z(i,:)==0)
F(i,:)=0;
else
F(i,:)=V(i,:)/Z(i,:);
end
Q(i,:)=Qmin+(F(i,:)-Qmin)*rand;
v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i)+V(i);
S(i,:)=Sol(i,:)+v(i,:);
SumF=sum(F(i,:))/i+10000;
SumT=sum(C(i,:))/i;
gamma=CoefCalculate(SumF,SumT);
Solo=Sol;
scale=(Ub-Lb);
for j=1:n,
if(Fitness(i)<Fitness(j))
distance=sqrt(sum((Sol(i,:)-Solo(j,:)).^2));
PS=Fitness(i)*(4*pi*(distance^2));
Lp=PS+10*log10(1/4*pi*(distance^2));
Aatm = (7.4 * ( ((F(i,:)^2)*distance)/ (50*(10^(-8)))));
RLP=Lp-Aatm;
K=(RLP)*exp(-gamma*distance.^2);
beta=K+betamin;
tmpf=alpha.*(rand(1,d)-0.5).*scale;
M(i,:)=Sol(i,:).*(1-beta)+Solo(j,:).*beta+tmpf;
else
M(i,:)=best+0.01*randn(1,d);
end
end
% Yeni çözümler üretme
if(rand >gamma)
u1(i,:)=S(i,:);
else
u1(i,:)=M(i,:);
end
u1(i,:)=simplebounds(u1(i,:),Lb,Ub);
Fnew=Fun(u1(i,:));
if (Fnew<=Fitness(i))
Sol(i,:)=u1(i,:);
Fitness(i)=Fnew;
% Mevcut En iyiyi güncelleme
if Fnew<=fmin,
best=u1(i,:);
fmin=Fnew;
end
end
alpha=alpha_new(alpha);
end
N_iter=N_iter+n;
end
% Sonuçları Gösterme
disp(['Number of evaluations: ',num2str(N_iter)]);
disp(['Best =',num2str(best)]);
disp(['fmin: ',num2str(fmin)]);
toc;

CoefCalculate.m dosyası:

function[AbsorbCoef]=CoefCalculate(F,T)
pres=1;
relh=50;
freq_hum=F;
temp=T+273;
C_humid=4.6151-6.8346*((273.15/temp)^1.261);
hum=relh*(10^C_humid)*pres;
tempr=temp/293.15;
frO=pres*(24+4.04e4*hum*(0.02+hum)/(0.391+hum));
frN=pres*(tempr^-0.5)*(9+280*hum*exp(-4.17*((tempr^-1/3)-1)));
alpha=8.686*freq_hum*freq_hum*(1.84e-11*(1/pres)*sqrt(tempr)...
+(tempr^-2.5)*(0.01275*(exp(-2239.1/temp)*1/(frO+freq_hum*freq_hum/frO))...
+0.1068*(exp(-3352/temp)*1/(frN+freq_hum*freq_hum/frN))));
db_humi=alpha;
db_humi =round(1000*db_humi)/1000;
AbsorbCoef=db_humi;
end

alpha_new.m dosyası:

function alpha=alpha_new(alpha)
delta=0.97;
alpha=delta*alpha;

Fun.m dosyası:

function [Fonksiyon2]=Fun(u)
[Fonksiyon2]=Sphere(u);

Sphere.m dosyası:

function z= Sphere(u)
n = 2;
s = 0;
for j = 1:n
s = s+u(j)^2;
end
z = s;

simplebounds.m dosyası:

function s=simplebounds(s,Lb,Ub)
ns_tmp=s;
I=ns_tmp<Lb;
ns_tmp(I)=Lb(I);
J=ns_tmp>Ub;
ns_tmp(J)=Ub(J);
s=ns_tmp;

2 boyutlu Sphere için 10^(-6) hata toleransında durdurma koşulu ile elde edilen sonuçlar:

2d-sphere

10 boyutlu Sphere için 10^(-6) hata toleransında durdurma koşulu ile elde edilen sonuçlar:

10d-sphere

100 boyutlu Sphere için 10^(-6) hata toleransında durdurma koşulu ile elde edilen sonuçlar:

Number of evaluations: 26675
fmin: 1.2702e-07
Elapsed time is 3.801380 seconds.

Kaynak: http://ahmetcevahircinar.com.tr/2016/12/16/circir-bocegi-algoritmasi-yeni-bir-meta-sezgisel-yaklasim-ve-uygulamalari/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir