📄 improve_compete3_cell.m
字号:
function newpop=improve_compete3_cell(popsize,pop,fitvalue,fun_num,up_range,down_range,var_num)
%函数说明
%入口参数:pop 当前处理的种群,
% popsize 种群大小,
% fitvalue 当前代的适应度数组
% fun_num 函数序列号,
% up_range 自变量的相对上限,
% down_range 自变量的相对下限
%出口参数:newpop 准子代
%功能说明:当前处理个体在其周围链式邻域的范围内竞争,
% 如果当前个体的适应度小于邻域的最大适应度值则必将死亡
% 策略1(rand<po) new=round(max_dna(j,1)+(-1)^round(rand)*rand*(max_dna(j,1)-pop(j,i)));
% 策略2(rand〉po)new = ma_dna(邻域中的最优个体)
% 下一个体的邻域为竞争过后的新种群
%%%链式邻域
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%调试用语句
% popsize=36;
% n=500;
% po=0.5;
% 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-250)./100; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% pop_con
% fitvalue=zeros(1,popsize);
% for i=1:popsize
%
% fitvalue(1,i)=20-(pop_con(1,i)^2+pop_con(2,i)^2);
%
% end
% fitvalue
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
po=0.5;
% range_down=0;
% range_up=100000;
% var_num = 10;
left_dna=zeros(var_num,1);
right_dna=zeros(var_num,1);
max_dna=zeros(var_num,1);
new_dna=zeros(var_num,1);
neighbor_fitvalue=zeros(1,2);
I=zeros(1,2);
fitvalue_tem=fitvalue;
newpop=pop;
for i=1:popsize
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求其邻域
if i==1 %% 第一个个体的左邻域为最后一个个体 其他按常规
left_dna=newpop(:,popsize);
neighbor_fitvalue(1)=fitvalue_tem(popsize);
I(1)=popsize;
else
left_dna=newpop(:,i-1);
neighbor_fitvalue(1)=fitvalue_tem(i-1);
I(1)=i-1;
end
if i==popsize
right_dna=pop(:,1); %%最后一个个体的右邻域为第一个个体 其他为物理位置的右邻域
neighbor_fitvalue(2)=fitvalue_tem(1);
I(2)=1;
else
right_dna=pop(:,i+1);
neighbor_fitvalue(2)=fitvalue_tem(i+1);
I(2)=i+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[neighbor_max_fitvalue,J]=max(neighbor_fitvalue); %%求出邻域中最大的一个并记录其在种群中的序列号
neighbor_max_cul=I(J);
max_dna=pop(:,neighbor_max_cul);
if fitvalue_tem(i)<neighbor_max_fitvalue %%%当前个体与邻域中最大的适应值比较 如果大于则可以存活 如果小于则按照po概率必须被替换
if rand<po %%% 小于po则按照拓宽搜索空间发作产生新个体替换 否则用最大的个体替换
for j=1:var_num
T=max_dna(j,1)+(-1)^round(rand)*rand*(max_dna(j,1)-pop(j,i));
if T<down_range(j)
new_dna(j,1)=down_range(j);
elseif T>up_range(j)
new_dna(j,1)=up_range(j);
else
new_dna(j,1)=round(T);
end
end
else
new_dna=max_dna;
end
newpop(:,i)=new_dna;
else
newpop(:,i)=pop(:,i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将替换过的种群再算适应值 准备下一次的邻域计算
newpop_con(:,i)=newpop(:,i);
switch fun_num
case 1
% newpop_con(:,i)=(newpop(:,i)-10000)./100; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% fitvalue_tem(1,i)=-(newpop_con(1,i)^2+newpop_con(2,i)^2);
for var_j = 1:var_num
fitvalue_tem(1,i)=fitvalue_tem(1,i)-(newpop_con(var_j,i)^2);
end
case 2
% newpop_con(:,i)=(newpop(:,i)-1000)./100; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% fitvalue_tem(1,i)=-(abs(newpop_con(1,i))+abs(newpop_con(2,i))+abs(newpop_con(1,i))*abs(newpop_con(2,i)));
time = 1;
and_value = 0;
for var_j = 1:var_num
and_value = and_value + abs(newpop_con(var_j,i));
time = time * abs(newpop_con(var_j,i));
fitvalue_tem(1,i)=fitvalue_tem(1,i)-(and_value + time);
end
case 3
% newpop_con(:,i)=(newpop(:,i)-10000)./100; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% fitvalue_tem(1,i)=-(newpop_con(1,i)^2+(newpop_con(1,i)+newpop_con(2,i))^2);
add_value = 0;
for var_j = 1:var_num
add_value = add_value + newpop_con(var_j,i);
fitvalue_tem(1,i) = fitvalue_tem(1,i) - add_value^2;
end
case 4
% newpop_con(:,i)=(newpop(:,i)-10000)./100;
% fitvalue_tem(1,i)=-max(abs(newpop_con(1,i)),abs(newpop_con(2,i)));
fitvalue_tem(1,i) = - max(abs(newpop_con(:,i)));
case 5
% newpop_con(:,i)=(newpop(:,i)-30000)./1000; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% fitvalue_tem(1,i)=-(100*(newpop_con(2,i)-newpop_con(1,i)^2)^2+(newpop_con(1,i)-1)^2);
for var_j = 1:var_num-1
fitvalue_tem(1,i) = fitvalue_tem(1,i) - (100 * (newpop_con(var_j+1,i)-newpop_con(var_j,i)^2)^2 + (newpop_con(var_j,i)-1)^2);
end
case 6
% newpop_con(:,i)=(newpop(:,i)-10000)./100;
% fitvalue_tem(1,i)=-((newpop_con(1,i)+0.5)^2+(newpop_con(2,i)+0.5)^2);
for var_j = 1:var_num
fitvalue_tem(1,i) = fitvalue_tem(1,i) - ((newpop_con(var_j,i)+0.5)^2);
end
case 7
% newpop_con(:,i)=(newpop(:,i)-12800)./10000; %pop数据准备 将区间由(0,,3096)划到(--1.048,2.048)
% fitvalue_tem(1,i)=-(newpop_con(1,i)^4+rand+2*newpop_con(2,i)^4+rand);
for var_j = 1:var_num
fitvalue_tem(1,i) = fitvalue_tem(1,i) - (var_j * newpop_con(1,i)^4+rand);
end
case 8
% newpop_con(:,i)=(newpop(:,i)-50000)./100;
% fitvalue_tem(1,i)=-(-newpop_con(1,i)*sin(sqrt(abs(newpop_con(1,i))))-newpop_con(2,i)*sin(sqrt(abs(newpop_con(2,i)))));
for var_j = 1:var_num
fitvalue_tem(1,i)=fitvalue_tem(1,i)-(-newpop_con(var_j,i)*sin(sqrt(abs(newpop_con(var_j,i)))));
end
case 9
% newpop_con(:,i)=(newpop(:,i)-51200)./10000;
% fitvalue_tem(1,i)=-(newpop_con(1,i)^2-10*cos(2*pi*newpop_con(1,i))+10+newpop_con(2,i)^2-10*cos(2*pi*newpop_con(2,i))+10);
for var_j = 1:var_num
fitvalue_tem(1,i)=fitvalue_tem(1,i)-(newpop_con(var_j,i)^2-10*cos(2*pi*newpop_con(var_j,i))+10);
end
case 10
% newpop_con(:,i)=(newpop(:,i)-32000)./1000;
% fitvalue_tem(1,i)=-(-20*exp(-0.2*sqrt(0.5*(newpop_con(1,i)^2+newpop_con(2,i)^2)))-exp(0.5*(cos(2*pi*newpop_con(1,i))+cos(2*pi*newpop_con(2,i))))+20+exp(1));
add_value = 0;
add_cos = 0;
for var_j = 1:var_num
add_value = add_value + (1/var_num) * newpop_con(var_j,i)^2;
add_cos = add_cos + (1/var_num) * cos(2 * pi * newpop_con(var_j,i));
end
fitvalue_tem(1,i) = -(-20 * exp(-0.2 * sqrt(add_value)) - exp(add_cos) + 20 + exp(1));
case 11
% newpop_con(:,i)=(newpop(:,i)-60000)./100;
% fitvalue_tem(1,i)=-(0.00025*(newpop_con(1,i)^2+newpop_con(2,i)^2)-cos(newpop_con(1,i)/sqrt(1))*cos(newpop_con(2,i)/sqrt(2))+1);
add_value = 0;
time = 1;
for var_j = 1:var_num
add_value = add_value + newpop_con(var_j,i)^2;
time = time * cos(newpop_con(var_j,i)/sqrt(var_j));
end
fitvalue_tem(1,i) = -(0.00025 * add_value - time + 1);
case 12
% newpop_con(:,i)=(newpop(:,i)-10000)./100;
% fitvalue_tem(1,i)=[0.5+[((sin(newpop_con(1,i)))^2+(sin(newpop_con(2,i)))^2)^0.5-0.5]/[1+0.001*(newpop_con(1,i)^2+newpop_con(2,i)^2)]^2];
add_value = 0;
for var_j = 1:var_num
add_value = add_value + sin(newpop_con(var_j,i))^2;
end
fitvalue_tem(1,i) = -(0.5 + (add_value^0.5 -0.5)/(1 + 0.001 * add_value^2));
case 13
% newpop_con(:,i)=(newpop(:,i)-10000)./100;
% fitvalue_tem(1,i)=[0.5+[sin((newpop_con(1,i)^2+newpop_con(2,i)^2)^0.5)-0.5]/[1+0.001*(newpop_con(1,i)^2+newpop_con(2,i)^2)]^2];
add_value = 0;
for var_j = 1:var_num
add_value = add_value + newpop_con(var_j,i)^2;
end
fitvalue_tem(1,i) = -(0.5 + (sin(add_value)^0.5 - 0.5)/(1 + 0.001 * add_value^2));
otherwise
break
end
% newpop_con
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -