⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_cell.m

📁 多种群的链式智能体遗传算法
💻 M
字号:

function [best_fit,best_fitvalue,out_dai,pop_best,time]=main_cell(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=62; %设置初始参数,群体大小
% 
% 
% 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;      % 设置子群体规模

L = 4;      % 设置子群体规模
S = 3;      % 设置子种群交叠个体个数
% M = 16;     % 设置 子种群个数
M = 63;     % 设置 子种群个数
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=-999999;
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 = L;
    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);
            [sub_newpop]=complete_mutation_cell_new(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 - S + 1;
        end_number = start_number + L - 1;
        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
    
    if i == dai
        out_dai = i;
        best_fitvalue = best_fit(i);
    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

end

time = toc;
% 
% 
% plot(-sub_best_fit,'r--')
% 
% sub_best_fit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -