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

📄 main_cell.asv

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

% function [best_fit,best_fitvalue,out_dai,pop_best,time]=main_cell(pop,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 = 8;
        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(var_num)*up_range;
down_range = ones(var_num) *  down_range;


tic;            %用于记录运行时间





popsize=62; %设置初始参数,群体大小
L = 6;      % 设置子群体规模
S = 2;      % 设置子种群交叠个体个数
M = 15;     % 设置 子种群个数
cont=zeros(1,M); % 子群体计数器
contor = 0;  % 群体计数器
% n=12000;
% n=9000;
pc=0.95; %设置交叉概率
pm=0.05; %设置变异概率
%参数设置结束
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;

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);
            % 计算适应值
            subpop_fitvalue = my_sga_calfitvalue(sub_newpop,fun_num,var_num);
            %交叉
            [sub_newpop]=complete3_o_crossover(L,sub_newpop,pc,subpop_fitvalue,fun_num,up_range,down_range,var_num);
            %变异
            [sub_newpop]=complete3_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
        new_up_range(jj) = max(local_board_dna(jj,:));
        
    end
%     new_up_range = max(max(local_board_dna));
%     new_down_range = min(min(local_board_dna));
%     
%     if new_up_range > old_up_range
%         up_range = old_up_range
%     else
%         up_range = new_up_range;
%     end
%     
%     if new_down_range < old_down_range
%         down_range = old_down_range;
%     else
%         down_range = new_down_range;
%     end
%     range = up_range - down_range;
%     popinit = rand(var_num,popsize);
%     pop = popinit.*range + down_range;
end

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

⌨️ 快捷键说明

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