📄 complete3_o__adaptivepc_crossover.asv
字号:
%交叉
% 交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=complete_o_adaptivePC_crossover(popsize,pop,pc,fitvalue)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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 rand<pc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求其邻域
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下一步生成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)/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
% F_fivalue
[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 + -