📄 main_text.asv
字号:
function [best_fit,best_fitvalue,out_dai,pop_best,time]=main_text(pop1,n,popsize,chromlength,fun_num,up_range,down_range,var_num)
%函数说明
%入口参数:pop 当前处理的种群,
% n 绝对上限,
% popsize 种群大小,
% chromlength 基因位长度,
% fun_num 函数序列号,
% up_range 自变量的相对上限,
% down_range 自变量的相对下限
%出口参数:best_fit 各代最有适应度值的集合
%功能说明:初始种群pop通过遗传交叉变异在给定定义域中寻优,在遗传最大代数dai之前得到最优值就自动退出遗传,
% 判定最优值的标准:前后两代间最优值之间差值连续30次小于 阈值0.00001
% 如果达到遗传最大代数也没有达到退出标准,则强制结束遗传。
% clear all;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% pop = [];
%
% var_num = 2;
% % fun_num=6;
% % fun_num = 11;
% fun_num = 1;
% up_range=0;
% down_range=0;
%
% switch fun_num
% case 1
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% fun_max=20000;
% up_range=100;
% down_range=-100;
%
% case 2
% n=2000;
% chromlength=11; %字符串长度(个体长度),染色体长度
% fun_max=121;
% up_range=10;
% down_range=-10;
%
% case 3 %worse
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% fun_max=50000;
% up_range=100;
% down_range=-100;
%
% case 4
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% fun_max=20000;
% up_range=100;
% down_range=-100;
%
% case 5 %use short time
% n=60000;
% chromlength=16; %字符串长度(个体长度),染色体长度
% fun_max=87000000;
% up_range=30;
% down_range=-30;
%
% case 6 % only a little
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% up_range=100;
% down_range=-100;
%
% case 7 % rand
% n=25600;
% chromlength=15; %字符串长度(个体长度),染色体长度
% fun_max=30;
% up_range=1.28;
% down_range=-1.28;
%
% case 8 %much better
% n=100000;
% chromlength=17; %字符串长度(个体长度),染色体长度
% fun_max=1500;
% up_range=500;
% down_range=-500;
%
% case 9 % only a little
% n=102400;
% chromlength=17; %字符串长度(个体长度),染色体长度
% fun_max=120;
% up_range=5.12;
% down_range=-5.12;
%
% case 10 %only a little
% n=64000;
% chromlength=16; %字符串长度(个体长度),染色体长度
% fun_max=30;
% up_range=32;
% down_range=-32;
%
% case 11 % good
% n=120000;
% chromlength=17; %字符串长度(个体长度),染色体长度
% fun_max=200;
% up_range=600;
% down_range=-600;
%
% case 12 %use more time
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% up_range=100;
% down_range=-100;
%
% case 13
% n=20000;
% chromlength=15; %字符串长度(个体长度),染色体长度
% up_range=100;
% down_range=-100;
%
% otherwise
% break
% end
% popsize=66; %设置初始参数,群体大小
%
%
% pop=my_sga_initpop(popsize,n,var_num,up_range,down_range); %运行初始化函数,随机产生初始群体
%
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
up_range = ones(1,var_num)*up_range;
down_range = ones(1,var_num) * down_range;
tic; %用于记录运行时间
% popsize=66; %设置初始参数,群体大小
popsize=66; %设置初始参数,群体大小
pop = pop1(:,1:popsize);
L = 6; % 设置子群体规模
S = 2; % 设置子种群交叠个体个数
% M = 16; % 设置 子种群个数
M = 10; % 设置 子种群个数
cont=zeros(1,M); % 子群体计数器
contor = 0; % 群体计数器
% n=12000;
% n=9000;
% pc=0.95; %设置交叉概率
% pm=0.05; %设置变异概率
pc=0.1; %设置交叉概率
pm=0.1; %设置变异概率
%参数设置结束
best_fit = [];
% 局部公告板
local_board_dna = zeros(var_num,M);
local_board_fitvalue = zeros(1,M);
% pop=my_sga_initpop(popsize,n); %运行初始化函数,随机产生初始群体
dai=1000;
%给最佳染色体及其适应度值赋初值%
pop_best=zeros(var_num,1);
value_best=0;
dai_best=1;
%结束
% i=1;
% max_fitvalue=0;
%计算群体中每个个体的适应度
fitvalue=my_sga_calfitvalue(pop,fun_num,var_num);
[old_max_fitvalue,indax]=max(fitvalue);
% best_fit(1) = old_max_fitvalue;
[bestindividual,bestfit]=my_sga_best(popsize,pop,fitvalue);
best_fit(1)=bestfit;
value_best=bestfit;
pop_best= bestindividual;
old_max_value = old_max_fitvalue;
old_max_dna = bestindividual;
subpop_flg = zeros(1,M); % 设置子种群成熟 旗标 0表示子种群未成熟,1表示成熟
for i=1:dai %1000为迭代次数
start_number = 1;
end_number = 6;
for j = 1:M
if subpop_flg(j) ~= 1
% 子种群初始化
subpop = pop(:,start_number:end_number);
% 计算子种群的适应值
subpop_fitvalue = my_sga_calfitvalue(subpop,fun_num,var_num);
%求出群体中适应值最大的个体及其适应值
% [sub_bestindividual,sub_bestfit]=my_sga_best(L,subpop,subpop_fitvalue);
[sub_dna_best_value,sub_I]=max(subpop_fitvalue);
sub_dna_best=subpop(:,sub_I);
% 局部公告板初始化
if i == 1
local_board_dna(:,j) = sub_dna_best;
local_board_fitvalue(j) = sub_dna_best_value;
sub_best_fit(j,1)=sub_dna_best_value;
sub_best_dna(:,j) = sub_dna_best;
end
if sub_dna_best_value < local_board_fitvalue(j)
% 用局部公告板上的个体代替子群体中的个体
subpop(:,sub_I) = local_board_dna(:,j);
subpop_fitvalue(sub_I) = local_board_fitvalue(j);
sub_dna_best_value = local_board_fitvalue(j);
sub_dna_best = local_board_dna(:,j);
else
% 更新局部公告板上的信息
local_board_dna(:,j) = sub_dna_best;
local_board_fitvalue(j) = sub_dna_best_value;
end
% 求出当代最大的适应值
[old_subpop_fitvalue_max,indax] = max(subpop_fitvalue);
old_subpop_dna_max = subpop(:,indax);
%左右邻域竞争
[sub_newpop]=improve_compete3_cell(L,subpop,subpop_fitvalue,fun_num,up_range,down_range,var_num);
% [sub_newpop]=improve_compete3(L,subpop,subpop_fitvalue,fun_num,up_range,down_range,var_num);
% 计算适应值
subpop_fitvalue = my_sga_calfitvalue(sub_newpop,fun_num,var_num);
%交叉
[sub_newpop]=complete3_o_crossover_cell(L,sub_newpop,pc,subpop_fitvalue,fun_num,up_range,down_range,var_num);
% [sub_newpop]=complete3_o_crossover(L,sub_newpop,pc,subpop_fitvalue,fun_num,up_range,down_range,var_num);
%变异
[sub_newpop]=complete_mutation_cell(L,sub_newpop,pm,i,fun_num,var_num,up_range,down_range);
% [sub_newpop]=complete_mutation(L,sub_newpop,pm,i,fun_num,var_num);
%计算群体中每个个体的适应度
subpop_fitvalue_tem=my_sga_calfitvalue(sub_newpop,fun_num,var_num);
[sub_new_dna_best_value,sub_I_new]=max(subpop_fitvalue_tem);
sub_new_dna_best=sub_newpop(:,sub_I_new);
%精英保留
if sub_new_dna_best_value>sub_dna_best_value
% sub_best_fit(j,i+1)=sub_new_dna_best_value;
subpop = sub_newpop;
pop(:,start_number:end_number)=sub_newpop;
else
% sub_best_fit(j,i+1)=sub_dna_best_value;
subpop = sub_newpop;
subpop(:,sub_I_new)=sub_dna_best;
pop(:,start_number:end_number)=subpop;
end
%计算群体中每个个体的适应度
subpop_fitvalue=my_sga_calfitvalue(subpop,fun_num,var_num);
% 求出进化后子种群的最大适应值
[new_subpop_fitvalue_max,max_indax] = max(subpop_fitvalue);
new_subpop_dna_max = subpop(:,max_indax);
if new_subpop_fitvalue_max > old_subpop_fitvalue_max
% if new_subpop_fitvalue_max > sub_best_fit(j,i)
local_board_dna(:,j) = new_subpop_dna_max;
local_board_fitvalue(j) = new_subpop_fitvalue_max;
sub_best_fit(j,i+1)=new_subpop_fitvalue_max;
sub_best_dna(:,j) = new_subpop_dna_max;
else
% sub_best_fit(j,i+1)=sub_best_fit(j,i);
local_board_dna(:,j) = old_subpop_dna_max;
local_board_fitvalue(j) = old_subpop_fitvalue_max;
sub_best_fit(j,i+1)=old_subpop_fitvalue_max;
sub_best_dna(:,j) = old_subpop_dna_max;
end
% %保存数代遗传之后最好的种群
% if bestfit>value_best
% value_best=bestfit;
% pop_best=bestindividual;
% % value_best_real=best_f;
% dai_best=i;
% end
%比较子代与父代最优值
error(j,i)=abs(new_subpop_fitvalue_max - old_subpop_fitvalue_max);
% error(j,i)=abs(sub_best_fit(j,i+1) - sub_best_fit(j,i));
%如果差值不是连续递减 则计数器归零
% if error(j,i)<=0.00001
if error(j,i)==0
cont(j)=cont(j)+1;
else
cont(j)=0;
end
%达到累计次数则打印遗传代数,退出遗传;否则进行下一次遗传
if cont(j)==10
% quit_dai(j)=i;
% out_dai = i;
% best_fitvalue = best_fit(i);
subpop_flg(j) = 1;
% else
% % pop_temp=bestindividual;
% % value_temp=bestfit;
% % pop=newpop;
% old_subpop_fitvalue_max = new_subpop_fitvalue_max;
end
end
% 更新起始终止位
start_number = end_number - 1;
end_number = start_number + 5;
sub_dna_best_value = [];
sub_new_dna_best_value = [];
old_subpop_fitvalue_max = [];
new_subpop_fitvalue_max = [];
% sub_best_fit
end
% subpop_flg
% local_board_fitvalue
% new_max_value = max(max(sub_best_fit));
% [temp,subpop_num] = max(sub_best_fit);
% [new_max_value,best_dai] = max(temp);
% best_fitvalue = new_max_value;
% temp_dna = sub_best_dna(:,subpop_num);
% bestindividual = temp_dna(:,best_dai);
% best_fit = temp;
[new_max_value,indax] = max(local_board_fitvalue);
new_max_dna = local_board_dna(:,indax);
if new_max_value > old_max_value
% 更新全局最优
best_fit(i+1)=new_max_value;
pop_best = new_max_dna;
% 更新最值
old_max_value = new_max_value;
old_max_dna = new_max_dna;
else
best_fit(i+1)=old_max_value;
pop_best = old_max_dna;
fitvalue_tem = my_sga_calfitvalue(pop,fun_num,var_num);
[fitvalue_tem_max,indax] = max(fitvalue_tem);
%精英保留
pop(:,indax) = old_max_dna;
% 更新最值
old_max_value = old_max_value;
old_max_dna = old_max_dna;
end
best_fitvalue = max(best_fit);
% if new_max_value == old_max_value
if best_fit(i+1) == best_fit(i)
contor = contor + 1;
else
contor = 0;
end
if contor == 10
out_dai = i;
break;
end
if min(subpop_flg) ~= 0
out_dai = i;
break;
end
% 更新上下限
% old_up_range = up_range;
% old_down_range = down_range;
for jj = 1:var_num
up_range(jj) = max(local_board_dna(jj,:));
down_range(jj) = min(local_board_dna(jj,:));
range = up_range(jj) - down_range(jj);
popinit = rand(1,popsize);
pop(jj,:) = popinit.*range + down_range(jj);
end
if i == dai
out_dai = i;
best_fitvalue = best_fit(i);
end
end
time = toc;
%
%
% plot(-sub_best_fit,'r--')
%
% sub_best_fit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -