📄 complete3_o_crossover.asv
字号:
%交叉
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=complete3_o_crossover(popsize,pop,pc,fitvalue,fun_num,up_range,down_range,var_num)
%函数说明
%入口参数:pop 当前处理的种群,
% popsize 种群大小,
% pc 交叉概率
% fitvalue 当前代的适应度数组
% fun_num 函数序列号,
% up_range 自变量的相对上限,
% down_range 自变量的相对下限
%出口参数:newpop 准子代
%功能说明:链式邻域的正交交叉
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%调试用语句
% 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;
Q2=4;
M2=4;
size=8;
% var_num = 10;
F=zeros(4,var_num);%用来装4个个体
F_fivalue=zeros(1,M2);
F_max=zeros(1,var_num);
left_dna=zeros(var_num,1);
right_dna=zeros(var_num,1);
max_dna=zeros(var_num,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);
%%%%%%%%%%%% 设置完毕!
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:var_num
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);
for Fb_i = 1:4
for Fb_j = 1:var_num
F(Fb_i,Fb_j) = B(Fb_j,Fb_i);
end
end
% F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F矩阵生成完毕, 产生了4个二维的多智能体 下一步计算这四个智能体的适应度函数 选出最大的一个来代替pop(:,i)
F_con=F;
switch fun_num
case 1
% F_con=(F-10000)./100;
for f_i=1:M2
% F_fitvalue(f_i)=-(F_con(f_i,1)^2+F_con(f_i,2)^2);
for f_j = 1:var_num
F_fivalue(f_i) = F_fivalue(f_i) -(F_con(f_i,f_j)^2);
end
end
case 2
% F_con=(F-1000)./100;
for f_i=1:M2
% F_fitvalue(f_i)=-(abs(F_con(f_i,1))+abs(F_con(f_i,2))+abs(F_con(f_i,1))*abs(F_con(f_i,2)));
time = 1;
and_value = 0;
for f_j = 1:var_num
and_value = and_value + abs(F_con(f_i,f_j));
time = time * abs(F_con(f_i,f_j));
F_fivalue(f_i) = F_fivalue(f_i) -(and_value + time);
end
end
case 3
% F_con=(F-10000)./100;
for f_i=1:M2
% F_fitvalue(f_i)=-(F_con(f_i,1)^2+(F_con(f_i,1)+F_con(f_i,2))^2);
for var_j = 1:var_num
add_value = 0;
for add_j = 1:var_j
add_value = add_value + F_con(f_i,add_j);
end
F_fitvalue(f_i) = fitvalue(1,f_i) - add_value^2;
end
end
case 4
% F_con=(F-10000)./100;
for f_i=1:M2
% F_fivalue(f_i)=-max(abs(F_con(f_i,1)),abs(F_con(f_i,2)));
F_fivalue(f_i) = -max(abs(F_con(f_i,:)));
end
case 5
% F_con=(F-30000)./1000;
for f_i=1:M2
% F_fitvalue(f_i)=-(100*(F_con(f_i,2)-F_con(f_i,1)^2)^2+(F_con(f_i,1)-1)^2);
for f_j = 1:var_num-1
F_fivalue(f_i) = F_fivalue(f_i) - (100 * (F_con(f_i,f_j+1) -F_con(f_i,f_j)^2)^2 + (F_con(f_i,f_j)-1)^2);
end
end
case 6
% F_con=(F-10000)./100;
for f_i=i:M2
% F_fivalue(f_i)=-((F_con(f_i,1)+0.5)^2+(F_con(f_i,2)+0.5)^2);
for f_j = 1:var_num
F_fivalue(f_i) = F_fivalue(f_i) - ((F_con(f_i,f_j)+0.5)^2);
end
end
case 7
% F_con=(F-12800)./10000;
for f_i=1:M2
% F_fitvalue(f_i)=-(F_con(f_i,1)^4+rand+2*F_con(f_i,2)^4+rand);
for f_j = 1:var_num
F_fivalue(f_i) = F_fivalue(f_i) - (f_j * F_con(f_i,f_j)^4 + rand);
end
end
case 8
% F_con=(F-50000)/100;
for f_i=1:M2
% F_fivalue(f_i)=-(-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)))));
for f_j = 1:var_num
F_fivalue(f_i) = F_fivalue(f_i) -(-F_con(f_i,f_j)*sin(sqrt(abs(F_con(f_i,f_j)))));
end
end
case 9
% F_con=(F-51200)/10000;
for f_i=1:M2
% F_fitvalue(f_i)=-(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);
for f_j = 1:var_num
F_fivalue(f_i) = F_fivalue(f_i) -(F_con(f_i,f_j)^2-10*cos(2*pi*F_con(f_i,f_j))+10);
end
end
case 10
% F_con=(F-32000)./1000;
for f_i=1:M2
% F_fitvalue(f_i)=-(-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));
add_value = 0;
add_cos = 0;
for f_j = 1:var_num
add_value = add_value + (1/var_num) * F_con(f_i,f_j)^2;
add_cos = add_cos + (1/var_num) * cos(2 * pi * F_con(f_i,f_j));
end
F_fitvalue(f_i) = -(-20 * exp(-0.2 * sqrt(add_value)) - exp(add_cos) + 20 + exp(1));
end
case 11
% F_con=(F-60000)/100;
for f_i=1:M2
% F_fivalue(f_i)=-(0.00025*(F_con(f_i,1)^2+F_con(f_i,2)^2)-cos(F_con(f_i,1)/sqrt(1))*cos(F_con(f_i,2)/sqrt(2))+1);
add_value = 0;
time = 1;
for f_j = 1:var_num
add_value = add_value + F_con(f_i,f_j)^2;
time = time * cos(F_con(f_i,f_j)/sqrt(f_j));
end
F_fitvalue(f_i) = -(0.00025 * add_value - time + 1);
end
case 12
F_con=(F-10000)/100;
for f_i=1:M2
% F_fivalue(f_i)=[0.5+[((sin(F_con(f_i,1)))^2+(sin(F_con(f_i,2)))^2)^0.5-0.5]/[1+0.001*(F_con(f_i,1)^2+F_con(f_i,2)^2)]^2];
and_value = 0;
for f_j = 1:var_num
and_value = and_value + sin(F_con(f_i,f_j))^2;
end
F_fivalue(f_i) = -(0.5 + (and_value^0.5 -0.5)/(1 + 0.001 * and_value^2));
end
case 13
F_con=(F-10000)/100;
for f_i=1:M2
% F_fivalue(f_i)=[0.5+[sin((F_con(f_i,1)^2+F_con(f_i,2)^2)^0.5)-0.5]/[1+0.001*(F_con(f_i,1)^2+F_con(f_i,2)^2)]^2];
and_value = 0;
for f_j = 1:var_num
and_value = and_value + F_con(f_i,f_j)^2;
end
F_fivalue(f_i) = -(0.5 + (sin(and_value^0.5) -0.5)/(1 + 0.001 * and_value^2));
end
otherwise
break
end
[max_F_fitvalue,max_F_J]=max(F_fivalue);
F_max=F(max_F_J);
newpop(:,i)=F_max';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 正交交叉完毕
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 超界保护
for ii=1:var_num
if newpop(ii,i)>up_range
newpop(ii,i)=up_range;
elseif newpop(ii,i)<down_range
newpop(ii,i)=down_range;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -