⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geneticalgorithm.m

📁 good code for matlab by mili , i than you
💻 M
字号:
% Optimization Using MATLAB, Chapter 9
% Dr. P.Venkataraman
% Chapter: 9, Section 9.3
% Genetic Algorithm

function ret = GeneticAlgorithm(nDes, nG, nPi, nP, nSC, nAC, nDC, nI)

global nBez A XX YY   % problem dependent
global xv1 yv1 xv2 yv2  % problem dependent

%----Storage Parameters
% Xinit(nP,nDes); Finit(nP)  -holds initial population
% Xgen(nP+2*nSC+2*AC+nDC+NI,nDes); Fgen(nP+2*nSC+2*AC+nDC+NI,nDes)
%  generated values - currently allows nSc= nAC = nDc = 1
% Xfinal(nP,nDes); Ffinal(nP);
% Xbest(nG,nDes); Fbest(nG)
%------------------------------------------------------------
fprintf('\nEntered Genetic Algorithm')
iG = 1;
% Generate initial population
for j = 1:nPi
   Vect = populator(nDes);
   %length(Vect);
   Xvect = [xv1 yv1 Vect xv2 yv2];
   fin = Bez_Sq_Err(Vect);
   Xdummy(j,:)=Vect;
   Fdummy(j)=fin;
end

fprintf('\nfinished initial population')
[Yvect,Ip]=sort(Fdummy);  % MATLAB sort function sorts in ascending order
% and returns indices too

% store starting population set
% store the same set as parents for the generation
for i = 1:nP
   Xinit(i,:)=Xdummy(Ip(i),:);
   Finit(i)= Yvect(i);
   Xgen(i,:) = Xinit(i,:);
   Fgen(i)=Finit(i);
end
Xbest(iG,:)=Xinit(1,:);
Fbest(iG)=Finit(1);
dvect = Xinit(1,:);
DrawCurve(dvect,1);
pause(2)

for iG = 1:nG
% start generating children and immigrants
% ***************
% Simple crossover
%*****************
fprintf('\nGeneration number :'), disp(iG)
	[XChild] = SimpleCrossover(nDes, nP,nSC,Xgen);

	for i=1:2*nSC
   	Xgen(nP+i,:) = XChild(i,:);
	end
	fprintf('\nfinished Simple Crossover')
%size(Xgen)
% ***************
% Arithmetic crossover
%*****************

	[XAChild] = ArithmeticCrossover(nDes, nP,nAC,Xgen);
	for i=1:2*nAC
   	Xgen(nP+2*nSC+i,:) = XAChild(i,:);
	end
%size(Xgen)
	fprintf('\nfinished Arithmetic Crossover')

% ***************
% Directional crossover
%*****************

	[XDChild] = DirectionalCrossover(nDes,nP,nDC,Xgen,Fgen);

%XDChild

	for i=1:nDC
   	Xgen(nP+2*nSC+2*nAC+i,:) = XDChild(i,:);
	end
	fprintf('\nfinished Directional Crossover')
	[n1 m1] = size(Xgen);


%**********************
%  Mutation
%*************************
	[n1 m1] = size(Xgen);
	[XMu]= Mutation(nDes,Xgen);

	for i=1:n1
   	Xgen(nP+2*nSC+2*nAC+nDC+i,:) = XMu(i,:);
	end
	fprintf('\nfinished Mutation')

%************************
%  Immigrants
%***********************

	[n2 m2] = size(Xgen);
	for j = 1:nI
   	Vect = populator(nDes);
   	Xgen(n2+j,:) = Vect;
	end
	fprintf('\nfinished Immigrants\n')

	clear Fdummy Xdummy Yvect Ip
	[n3 m3] = size(Xgen);
	for i = 1:n3
   	Vect = Xgen(i,:);
   	fin = Bez_Sq_Err(Vect);
   	Xdummy(i,:)=Vect;
   	Fdummy(i)=fin;
	end


	[Yvect,Ip]=sort(Fdummy); 
%Yvect
	Xbest(iG+1,:)=Xdummy(Ip(1),:);
	Fbest(iG+1)=Yvect(1);
dvect =Xdummy(Ip(1),:);
DrawCurve(dvect,iG+1);
pause(2)
% return best value

% clear Xgen values and repopulate for the next generation
	clear Xgen Fgen XChild XAChild XDChild XMu
	for i = 1:nP
   	Xinit(i,:)=Xdummy(Ip(i),:);
   	Finit(i)= Yvect(i);
   	Xgen(i,:) = Xinit(i,:);
   	Fgen(i)=Finit(i);
	end

	
end
ret = [Xbest Fbest'];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -