?? complete3_o_adaptivepc_crossover.m
字號:
%交叉
% 交叉(crossover),群體中的每個個體之間都以一定的概率 pc 交叉,即兩個個體從各自字符串的某一位置
% (一般是隨機確定)開始互相交換,這類似生物進化過程中的基因分裂與重組。例如,假設2個父代個體x1,x2為:
% x1=0100110
% 從每個個體的第3位開始交叉,交又后得到2個新的子代個體y1,y2分別為:
% y1=0100001
% y2=1010110
% 這樣2個子代個體就分別具有了2個父代個體的某些特征。利用交又我們有可能由父代個體在子代組合成具有更高適合度的個體。
% 事實上交又是遺傳算法區別于其它傳統優化方法的主要特點之一。
%遺傳算法子程序
%Name: crossover.m
%交叉
function [newpop]=complete3_o_adaptivePC_crossover(popsize,pop,fitvalue,fun_num)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% popsize=64;
% n=100000;
% pop1_init=randperm(n); %產生1到32的整數
% pop2_init=randperm(n);
% pop(1,:)=pop1_init(1:popsize); %將前幾個整數作為初始群體
% pop(2,:)=pop2_init(1:popsize);; %將前幾個整數作為初始群體
% pop
%
% pop_con=(pop-50000)./100; %pop數據準備 將區間由(0,,3096)劃到(--1.048,2.048)
%
% fitvalue=zeros(1,popsize);
% for i=1:popsize
%
% fitvalue(1,i)=1500+pop_con(1,i)*sin(sqrt(abs(pop_con(1,i))))+pop_con(2,i)*sin(sqrt(abs(pop_con(2,i))));
% end
% fitvalue
% pc=0.5;
% popsize=10;
% pop=[1023,980,2133,726,1946,657,1702,1224,1522,807,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825,2025,2565,1773,2340,2354,1144,2061,240,1573,825];
% % ,2025,2565,1773,2340,2354,1144,2061,240,1573,825]
% chromlength=12;
% pc=0.96;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%% 設置參數
F=2;
Q2=3;
M2=4;
size=8;
F=zeros(4,2);
F_fivalue=zeros(1,M2);
F_max=zeros(1,2);
left_dna=zeros(2,1);
right_dna=zeros(2,1);
max_dna=zeros(2,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);
%%%%%%%%%%%% 設置完畢!
max_fitness=max(fitvalue);
mean_fitness=mean(fitvalue);
newpop=pop;
for i=1:popsize
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求其鄰域
if i==1 %% 第一個個體的左鄰域為最后一個個體 其他按常規
left_dna=pop(:,popsize);
neighbor_fitvalue(1)=fitvalue(popsize);
I(1)=popsize;
else
left_dna=pop(:,i-1);
neighbor_fitvalue(1)=fitvalue(i-1);
I(1)=i-1;
end
if i==popsize
right_dna=pop(:,1); %%最后一個個體的右鄰域為第一個個體 其他為物理位置的右鄰域
neighbor_fitvalue(2)=fitvalue(1);
I(2)=1;
else
right_dna=pop(:,i+1);
neighbor_fitvalue(2)=fitvalue(i+1);
I(2)=i+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求 個體L的鄰域
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 完畢!(上下左右鄰域)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步求鄰域中最大的個體(作為交
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 叉的個體之一)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 及其對應的位置號I(J)
[neighbor_max_fitvalue,J]=max(neighbor_fitvalue);
neighbor_max_cul=I(J);
max_dna=pop(:,neighbor_max_cul);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 得出交叉的兩個父代個體 一個為當前個體pop(:,i)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 另一個為其鄰域中適應度值最大的個體max_dna
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步求PC
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求PC
if fitvalue(i)<=neighbor_max_fitvalue
better_fitvalue=neighbor_max_fitvalue;
else
better_fitvalue=fitvalue(i);
end
if better_fitvalue>=mean_fitness
pc=(max_fitness-better_fitvalue)/(max_fitness-mean_fitness);
else
pc=1.0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if rand<pc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步生成B(2*3)
for b_i=1:2
for b_j=1:Q2
if b_j==1
B(b_i,b_j)=min(pop(b_i,i),max_dna(b_i,1));
elseif b_j>1&b_j<Q2
B(b_i,b_j)=min(pop(b_i,i),max_dna(b_i,1))+(b_j-1)*abs(pop(b_i,i)-max_dna(b_i,1))/(Q2-1);
elseif b_j==Q2
B(b_i,b_j)=max(pop(b_i,i),max_dna(b_i,1));
end
end
end
% B
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(2*3)生成完畢!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步按照矩陣
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [B(1,1) B(2,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,1) B(2,2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,2) B(2,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B(1,2) B(2,2);]生成F(4*2)
F(1,1)=B(1,1);F(1,2)=B(2,1);
F(2,1)=B(1,1);F(2,2)=B(2,2);
F(3,1)=B(1,2);F(3,2)=B(2,1);
F(4,1)=B(1,2);F(4,2)=B(2,2);
% F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F矩陣生成完畢, 產生了4個二維的多智能體 下一步計算這四個智能體的適應度函數 選出最大的一個來代替pop(:,i)
% F_con=(F-50000)/10000;
% for f_i=1:M2
% % F_fivalue(f_i)=1500+F_con(f_i,1)*sin(sqrt(abs(F_con(f_i,1))))+F_con(f_i,2)*sin(sqrt(abs(F_con(f_i,2))));
% F_fitvalue(1,i)=120-(F_con(f_i,1)^2-10*cos(2*pi*F_con(f_i,1))+10+F_con(f_i,2)^2-10*cos(2*pi*F_con(f_i,2))+10);
% end
%
switch fun_num
case 2
F_con=(F-1000)./100;
for f_i=1:M2
F_fitvalue(f_i)=121-(abs(F_con(f_i,1))+abs(F_con(f_i,2))+abs(F_con(f_i,1))*abs(F_con(f_i,2)));
end
case 8
F_con=(F-50000)/100;
for f_i=1:M2
F_fivalue(f_i)=1500+F_con(f_i,1)*sin(sqrt(abs(F_con(f_i,1))))+F_con(f_i,2)*sin(sqrt(abs(F_con(f_i,2))));
end
case 9
F_con=(F-51200)/10000;
for f_i=1:M2
F_fitvalue(f_i)=120-(F_con(f_i,1)^2-10*cos(2*pi*F_con(f_i,1))+10+F_con(f_i,2)^2-10*cos(2*pi*F_con(f_i,2))+10);
end
case 10
F_con=(F-32000)./1000;
for f_i=1:M2
F_fitvalue(f_i)=30-(-20*exp(-0.2*sqrt(0.5*(F_con(f_i,1)^2+F_con(f_i,2)^2)))-exp(0.5*(cos(2*pi*F_con(f_i,1))+cos(2*pi*F_con(f_i,2))))+20+exp(1));
end
otherwise
break
end
[max_F_fitvalue,max_F_J]=max(F_fivalue);
F_max=F(max_F_J);
newpop(:,i)=F_max';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 正交交叉完畢
end
end
%
% pop1=pop(1,:); %將種群矩陣拆分
% pop1;
% pop2=pop(2,:);
% pop2;
%
% pop1=dec2bin(pop1,chromlength); %%各自轉為二進制
% pop1;
% pop2=dec2bin(pop2,chromlength);
% pop2;
%
% for i=1:2:popsize-1; %第1行和第2行,也就是說第1個個體和第2個個體進行交叉,依次類推
% if(rand<pc)
% cpoint=round(rand*chromlength);
% % cpoint
%
% if cpoint==0
% cpoint=1;
% end
%
%
% newpop1(i,:)=[pop1(i,1:cpoint) pop1(i+1,cpoint+1:chromlength)];
% newpop1(i+1,:)=[pop1(i+1,1:cpoint) pop1(i,cpoint+1:chromlength)];
% else
% newpop1(i,:)=pop1(i,:);
% newpop1(i+1,:)=pop1(i+1,:);
% end
%
% if(rand<pc)
% cpoint=round(rand*chromlength);
% % cpoint
%
% if cpoint==0
% cpoint=1;
% end
%
% newpop2(i,:)=[pop2(i,1:cpoint) pop2(i+1,cpoint+1:chromlength)];
% newpop2(i+1,:)=[pop2(i+1,1:cpoint) pop2(i,cpoint+1:chromlength)];
% else
% newpop2(i,:)=pop2(i,:);
% newpop2(i+1,:)=pop2(i+1,:);
% end
%
% newpop1;
% newpop2;
% end
%
% newpop1=bin2dec(newpop1);
% newpop2=bin2dec(newpop2);
% newpop(1,:)=newpop1';
% newpop(2,:)=newpop2';
%
% newpop;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -