精华内容
下载资源
问答
  • 自适应遗传算法的C语言实现,可用于上位机实现或DSP实现参考
  • A_Genetic_Revised_Adap.M文件:为改进的自适应遗传算法(单目标优化); A_Genetic_Revised_Adap_Multi.M文件:为改进的自适应遗传算法(多目标优化); AA_Genetic_Revised_Adap_hybrid_F_Swarm.M文件,为改进的...
  • 遗传算法的改进的MATLAB代码,其中对遗传算子的交叉算子和遗传算子做了非线性自适应改进。
  • 针对Srinivas提出的自适应遗传算法种群前期进化较慢的问题,改进了自适应交叉率和变异率的计算方法,考虑交叉率和变异率与种群进化所处阶段的匹配,提出一种改进的自适应遗传算法;并将其应用于BP神经网络计算模型的...
  • 本文通过对传统的遗传算法添加灾变操作,减少了遗传算法常见的“早熟”现象,配合灾变操作的迭代次数的变化设置了遗传操作自适应变化,增强了算法后期的寻优能力.该算法以河北某钢铁企业的实际生产数据进行检验,...
  • 研究了在没有公共参考坐标系及机器人相对位置信息未知情况下的栅格地图融合问题,提出了一种基于免疫自适应遗传算法的栅格地图融合方法,该算法把反映两个栅格地图重叠区域相异程度的优化函数作为抗原,每个可能的平移...
  • 本资源为自适应遗传算法的Python实现,可用于机器学习算法建模变量和模型参数的同步优选,
  • 自适应遗传算法

    千次阅读 2021-07-26 22:32:00
    自适应遗传算法 遗传算法是一种全局优化算法,在求解函数最优值时不容易陷入局部极小的陷阱而出现“死循环”现象,弥补了传统迭代法的不足。本文主要介绍自适应遗传算法的基本原理及实例验证。根据生物进化现象,其...

    自适应遗传算法

    遗传算法是一种全局优化算法,在求解函数最优值时不容易陷入局部极小的陷阱而出现“死循环”现象,弥补了传统迭代法的不足。本文主要介绍自适应遗传算法的基本原理及实例验证。根据生物进化现象,其基本原理包括编码、解码、交配、变异、选择。其中最核心的,也是遗传算法独有的特征是交配和变异。自适应方法主要是将交配和变异概率改为随适应度函数值的变化而自动改变,即自适应遗传算法。
    关键词:遗传算法;自适应遗传算法;函数极值

    遗传算法最初由Holland提出,旨在通过通过自然系统的自适应行为来设计具有自适应功能的软件系统,该方法属于进化算法的一种。遗传算法通过对函数自变量范围进行基因编码、交配、基因变异、计算函数适应度值、选择较优值到下一代、种群繁殖后重复上述操作的方法,逐渐逼近最优值。自适应遗传算法通过改变不同适应度值下的交叉和变异几率,能提升计算效率并加快算法的收敛速度。
    1.自适应遗传算法的实现步骤
    (1)编码
    编码是用一组有序数列来表征自变量,类似于基因来表征一个生物。只不过不同于自然界中的生物,自然界中大部分生物的基因是双链,而在算法计算中自变量的基因是单链,这样便于表征、杂交和变异。
    编码按代码数制类型不同主要分为二进制编码和十进制编码,二进制编码格式整齐,易于理解;但十进制编码容易观察且不用数制转换,故本文采用十进制数编码。例如对于自变量x∈(a , b)(其中a , b为给定的自变量区间,且b > a),可将(b - a)分为( ≥2)份,每个数字用一个( ≥2)位数字序列表示,这个数字序列即为基因编码。
    (2)解码
    解码是运算过程中需要将基因反变换成自变量的实际大小进行处理而进行的编码还原,即基因乘以解码器即可将基因转化为实际数值。对于上例中的编码,解码器选择如下:
    [   ……
    (3)交配(也叫交叉)
    交配是基因之间以一定几率相互交叉而改变原来的序列。方法如下:
    设初始种群中随机产生了两个基因分别为:
    (,,……,)    初始个体1(,,……,)    初始个体2

    用轮盘法则随机确定一个1到之间的整数(1<<)作为交叉位数,然后交换该整数位以后的数字,交叉后的基因分别如下:
    (,,……,,,……,) 交配后个体1(,,……,,,……,) 交配后个体2

    交配是遗传算法区别于其他算法的主要特征之一,交配效果也直接影响算法结果的有效性。交配概率太大会破坏种群现有结构,丢失优异个体;交配概率太小种群进化较慢,收敛速度慢,不易找到最优解。虽然传统的遗传算法根据大量实例给出一个经验值范围0.4-0.99,但显然任何一个固定的交配值都是不公平的。一个适应度大的个体应该尽可能地保留到下一代,而一个适应度小的个体应想法重复利用,否则在筛选中依然会被筛选掉,从而丢失一部分计算价值。所以基于此想法,研究人员提出了自适应交配方法,即根据适应度的大小自动调节交配几率,具体方法如下:
    对于任意一代的种群中,优先算出该种群的平均适应度和最大适应度,通过-构建自适应指标。当判断任意个体时,计算该个体的适应度f后,通过公式
    (-f)/(-)   f≥=                                             (2.2)f<

    其中为该个体的自适应交叉概率;一般令=1,即适应度小于平均值的个体直接交叉;初始时可取0.5,根据寻优结果另行调整。
    (4)变异
    变异类似于基因突变,即在个体交叉过程中或交叉后某个数字产生随机变化,这种变化类似于生物体的基因突变,因此叫变异。
    变异性质跟交叉相似,是遗传算法另一个重要特征,而且对种群进化影响很大。变异概率太小时,种群多样性下降迅速,容易导致有效基因的迅速丢失且不易修补;当变异概率太大时,会增加种群多样性,但是对种群现有结构破坏较大。因此,选择合适的变异概率,可以增加遗传算法的有效性。
    (-f)/(-)   f≥=                                             (2.3)f<

    其中为该个体的自适应变异概率;一般令=1,即适应度小于平均值的个体直接交叉;初始时可取0.5,根据寻优结果另行调整。
    (5)选择
    选择是遗传算法中的关键步骤,但不是遗传算法独有的,而是进化算法普遍都会用到的操作。其执行方式是将新一代种群和旧一代种群放在一起,根据适应度函数值的大小选择较优的那一半个体到下一代,旨在模拟自然界中适者生存的法则。
    自适应遗传算法的程序框图如图1所示。
    在这里插入图片描述
    图1 自适应遗传算法的程序框图
    2.验证自适应遗传算法
    用自适应遗传算法求约束优化问题
    max ()=(0.5-(  -0.5))/s.t.   -4≤()=≤4-4≤()=≤4
    的约束最优解。
    首先令初始种群数量N=100,繁殖代数G=200,交叉率1,变异率0.5,自变量下限a=-4,自变量上限b=4,基因长度=10,变量个数D=2,
    基因码∈(1,9)。
    (1)编写程序
    然后对自变量区域进行基因编辑,编辑后的基因序列如下:
    在这里插入图片描述
    其中 =1,2,……100,随机数为任意1到10之间的整数,、分别为对应自变量、的序列。
    依照交配,变异,选择的步骤用Matlab语言编程,程序见附件1。
    (2)结果分析
    函数三维图和等高线图分别如图2和图3所示,最高点已在图2中标出,坐标为(0,0,1),并以此为依据验证算法的有效性。
    在这里插入图片描述
    图2 图3
    运行自适应遗传算法,生成的初始种群如图4,自变量充满整个区域,生物多样性表现较为丰富。随迭代次数的增加种群的适应度曲线如图3.结果分析
    可以看出,种群随迭代次数的增加逐渐向函数最大值进化;种群的最大-平均适应度差值如图7,可以看出,种群随迭代次数的增加每个个体都在向最优个体靠拢,个体之间逐渐缩小差距;适应度曲线和最大-平均适应度差值图间接证明了算法的有效性。迭代200次时变量分布如图5,从图中可以看出种群经过进化后位置集中在函数最大值附近,此时函数最大值点的对应坐标为 (,,())=(0.000027467,0.000031419, 0.999999998),算法得出的数据和精确值(0,0,1)非常接近,最大误差限仅为0.0031419%。
    在这里插入图片描述

    图4 初始种群变量分布图 图5 迭代200次变量分布图
    在这里插入图片描述

    图6 适应度曲线图 图7 最大-平均适应度差值图
    4.结论
    针对一般约束优化问题,自适应遗传算法能够快速,准确逼近全局最优解。这对普通工程问题求解近似值问题完全适用,对要求较高工况下的计算有重要参考价值。
    参考文献
    [1] M. Srinivas and L. M. Patnaik, “Adaptive probabilities of crossover and mutation in genetic algorithms,” in IEEE Transactions on Systems, Man, and Cybernetics, vol. 24, no. 4, pp. 656-667, April 1994.doi: 10.1109/21.286385
    [2] 管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012.
    [3] 白清顺,孙靖民.机械优化设计[M].6版.机械工业出版社,2017.
    [4] 张岩,吴水根.MATLAB优化算法[M].北京:清华大学出版社,2017.
    [5] 刘卫国.MATLAB程序设计与应用[M].3版.北京:高等教育出版社,2016.
    [6] https://blog.csdn.net/qq_35109096/article/details/81105522

    自适应遗传算法程序如下:
    clc;clear all;
    mode = ‘Schaffer’;
    if strcmp(mode, ‘Schaffer’)
    figure(1);x = -4:0.1:4;y = -4:0.1:4;[X,Y] = meshgrid(x,y);
    % Z = 3cos(X.Y)+X+Y.^2;
    Z = 0.5-((sin(sqrt(X.2+Y.2)).2)-0.5)./(1+0.001.*(X.2+Y.2)).2;
    surf(X,Y,Z);title(‘Schaffer Function’);xlabel(‘X-轴’);ylabel(‘Y-轴’);zlabel(‘Z-轴’);
    figure(2);contour(X, Y, Z, 8);
    title(‘Schaffer函数等高线’);xlabel(‘X-轴’);ylabel(‘Y-轴’);
    end
    clearvars -except mode;
    %参数输入------------------------------------------------------------------------------------------
    NP=100;%初始种群数量
    G=200; %繁殖代数
    D=2; % 变量个数
    k1 = 1;k3 = 1;%交叉率
    k2 = 0.5;k4 = 0.5;%突变率
    X_min=-4;X_max=4;%自变量x区间
    Y_min=-4;Y_max=4;%自变量y区间
    r = 0.2;b = 3;%模拟退火参数
    for count_1=1:NP % 产生初始种群
    temp1 = X_min+rand()
    (X_max-X_min);
    temp2 = Y_min+rand()
    (Y_max-Y_min);
    x(count_1,:) = [temp1,temp2];%每次输出两列的行向量,共100行,两列
    end
    save_pic_cnt = 1;
    A = figure(3);
    for gen=1:G %每代繁殖循环
    pause(0.2);%动态观察变化过程,pause(a)暂停a秒后执行下一条指令
    if rem(gen, 2)==1;%如果gen/2的余数为1,即gen为奇数时

         scatter(x(:,1), x(:, 2));
        axis([-4, 4, -4, 4]);
        title(['第', num2str(gen), '次迭代']);xlabel('变量X'); ylabel('变量Y');
        base_path = 'D:\Program Files\MATLAB\R2016a\bin\genetic algorithm\zi_shi_ying';
        cnt = num2str(save_pic_cnt);%数字转化为字符串
        tail_path = '.jpg';
        frame = getframe(A);%将绘图捕捉为电影帧,每帧保存一个列向量
        im=frame2im(frame);
        path_img = [base_path, cnt, tail_path];%D:\Program Files\MATLAB\R2016a
    ...bin\genetic algorithm\zi_shi_ying50.jpg,即文件位置+文件名+格式
        % imwrite(im, path_img);
        % save_x(:, :, save_pic_cnt) = x;
        save_pic_cnt = save_pic_cnt + 1;%帧数累加,共50次
    end
    for count_2=1:NP
        fitness(count_2)=func(x(count_2,:), mode);%每代中每个个体对应z值
    end
    fitness_ = fitness;
    %[fitness_min,index0] = min(fitness);
    %fitness_max = max(fitness);
    [fitness_max,index0] = max(fitness);%返回所有个体产生的z值的最大值
    fitness_average = sum(fitness)/(length(fitness));  %每代种群中个体的平均z值
    collect_fit_average(gen) = fitness_average;   % 保存每代中得到的平均适应度
    collect_fitmax_subtract_fit_average(gen) = fitness_max - fitness_average;
    fitness_min = min(fitness);%最小z值
    best_indiv = x(index0,:);  % 每代个体中最优的个体即为第index0行的行向量
    best_solution(gen) = fitness_max;%每代对应的最优解即为最大z值
    % 计算归一化的适应度值---------------------------------------------------------------------
    fitness = (fitness - fitness_min)/(fitness_max - fitness_min);%此时最大值变为1
    fitness_sum = sum(fitness);%相对适应度的和
    fitness = fitness./fitness_sum;%相对适应度/适应度和
    fitness = cumsum(fitness);%从前向后累加,最后一个值为100/100  
    % 轮盘赌选择-----------------------------------------------------------------------------------
    newi = 1;
    while newi<=NP  %每代都会随机选择一个符合要求的新个体,共100个
        random_num = rand();   % 生成随机数
        if random_num<fitness(1)%random小于随机生成的第一个z值的相对适应度
            clone_x(newi, :) = x(1, :);
            newi = newi+1;
        else
            for ct=1:(NP-1) %1:99
                if random_num>fitness(ct) && random_num<fitness(ct+1)
                    clone_x(newi,:) = x(ct,:);
                    newi = newi+1;
                    break;  %跳出for循环,输出newi并继续进行while循环
                end
            end
        end
    end  %对应while
    % disp(clone_x - x);
    

    % 进行交叉,变异操作------------------------------------------------------------------------
    for count=1:2:NP % 自适应计算Pc.
    if fitness_(count)>=fitness_(count+1)
    fitness_selected = fitness_(count);% 选区两个交叉的个体的较大的适应度值
    else
    fitness_selected = fitness_(count+1);
    end
    % 计算Pc------------------------------------------------------------------------------------
    if fitness_selected >= fitness_average %如果>=sum(fitness)/(length(fitness))
    Pc = k1*(fitness_max-fitness_selected)/(fitness_max-fitness_average);
    else
    Pc = k3; %如果选择的z值小于平均z值,即小于适应度函数值
    end
    collect_Pc(gen, count) = Pc; % 保存Pc的值
    temp_cross = rand();
    if temp_cross < Pc % 交叉算子 注:这种交叉算子效果更好
    temp_alpha = 0.6;
    cross_x(count,:) = temp_alphaclone_x(count,:)+(1-temp_alpha)clone_x(count+1,:);%
    cross_x(count+1,:) = temp_alpha
    clone_x(count+1,:)+(1-temp_alpha)clone_x(count,:);%
    else
    cross_x(count,:)=clone_x(count,:);%如果随机数大于Pc
    cross_x(count+1,:)=clone_x(count+1,:);
    end
    % 边界条件检查-------------------------------------------------------------------------
    if cross_x(count,1)>X_max || cross_x(count,1)<X_min || cross_x(count,2)>Y_max || cross_x(count,2)<Y_min
    temp1 = X_min+rand()
    (X_max-X_min);
    temp2 = Y_min+rand()
    (Y_max-Y_min);
    cross_x(count,:) = [temp1,temp2];
    end
    end
    cross_x = cross_x(1:NP,:);% cross_x为完成交叉的个体;共100行两列
    % 变异操作-------------------------------------------------------------------------------------
    for count=1:1:NP
    % 计算Pm-----------------------------------------------------------------------------------
    if fitness_(count)>=fitness_average
    Pm = k2*(fitness_max-fitness_(count))/(fitness_max-fitness_average);
    else
    Pm = k4;
    end
    collect_Pm(gen,count) = Pm; % 保存Pm的值
    temp_mutation=rand();
    if temp_mutation<Pm
    mutation_pos = randi(D);
    if mutation_pos==1
    low = X_min;
    high = X_max;
    else
    low = Y_min;
    high = Y_max;
    end
    s_t(gen) = 1-r((1-gen/G)b);
    new_low = cross_x(count, mutation_pos)-s_t(gen)(cross_x(count, mutation_pos)-low);
    new_high = cross_x(count, mutation_pos)+s_t(gen)
    (high-cross_x(count, mutation_pos));
    mutation_x(count, :) = cross_x(count, :);% cross_x为交叉后的
    mutation_x(count, mutation_pos) = new_low+rand()(new_high-new_low);% mutation_x为变异后的
    if mutation_x(count,1)>X_max || mutation_x(count,1)<X_min || mutation_x(count,2)>Y_max || mutation_x(count,2)<Y_min
    temp1 = X_min+rand()
    (X_max-X_min);
    temp2 = Y_min+rand()*(Y_max-Y_min);
    mutation_x(count,:) = [temp1,temp2];%超出边界的从新生成
    end
    else
    mutation_x(count,:) = cross_x(count,:);
    end
    end
    %边界条件处理---------------------------------------------------------------------------------
    x=mutation_x(1:NP, :);%变异后的新个体
    x(1,:)= best_indiv;
    end
    % 作图----------------------------------------------------------------------------------------------
    figure(4);plot(best_solution);
    xlabel(‘进化代数’);ylabel(‘适应度值’);title(‘适应度进化曲线’);
    figure(5);plot(collect_fitmax_subtract_fit_average);
    title(‘f_{max}-f_{average}曲线’);xlabel(‘进化代数’);ylabel(‘f_{max}-f_{average}’);

    展开全文
  • 异步电机的无速度传感器控制,由于具备免维护、独立性强等...将自适应遗传算法引入到异步电机无速度传感器控制的参数寻优之中,仿真结果表明,经过自适应遗传算法寻优的控制系统具有极好的静态和动态性能,同时鲁棒性较佳。
  • 针对传统遗传算法在复杂函数优化的寻优搜索中容易陷入局部极值、搜索效率低、不稳定等缺点,提出一种改进的自适应遗传算法。该算法的思想是根据进化中种群适应度的集中分散的程度非线性地自适应调节遗传进化的运算...
  • 自适应遗传算法的代码!对于初学者帮助很大!欢迎大家下载学习!
  • 为了解决单一神经网络模型很难满足股票预测建模要求的问题,提出一种基于遗传算法的粗糙集属性约简方法和神经网络相结合的预测模型。在该模型中,改进了自适应性遗传算法的交叉算子与变异算子。基于该遗传算法的粗糙...
  • Srinvivas等提出一种自适应遗传算法,交叉概率与变异概率能够随着适应度大小而改变。但在这种算法中,群体中最大适应度值的个体的交叉率和变异率为零,这使得进化走向局部最优解的可能性增加。提出了一种改进的...
  • 完整的介绍,代码能用,自己跑过
  • 基于自适应遗传算法的战场资源动态调度模型及算法
  • 论文研究-求解作业车间调度问题的改进自适应遗传算法.pdf, 根据当前代种群中的最优个体应该保留,但也要一定交叉与变异概率的思想,提出了改进的自适应遗传算法,开发了...
  • 自适应遗传算法计算目标函数的最值,,,
  • 研究论文-改进的自适应遗传算法在TDOA定位中的应用
  • 为了提高自动化立体仓库的运行效率, 针对其中的堆垛机路径调度问题, 根据时间、能耗和作业效率建立了堆垛机调度优化模型, 提出了一种改进的多目标遗传算法IMOGA. 该算法在NSGA-Ⅱ算法的基础上改进了遗传算子, 采用了...
  • 针对遗传算法在全局优化问题中容易出现早熟和收敛速度慢的问题,根据群体适应值的分布特点,启发性地提出了一种新的基于小生境的自适应遗传算法(ANGA)。采用一种新的适应值计算方法,引入了一个自适应的常数Cmin,...
  • 自适应遗传算法,三种准则对比,自适应与遗传算法对比
  • 自适应遗传算法是一种有效的寻优算法,本文首先对自适应遗传算法进行改进,提出分段自适应遗传算法,达到了防止早熟,加快寻优速度的目的。阈值分割是一种经典的图像分割算法,本文将利用改进的自适应遗传算法(分段...
  • 提出一种基于LMK准则的前馈神经网络盲多用户检测算法,给出算法的代价函数和约束条件,利用Lagrange方法对带约束的代价函数进行优化,获得前馈神经网络网络权值的迭代公式,从而实现神经网络盲多用户检测。...
  • 基于实数编码的参数自适应遗传算法(matlab代码)

    万次阅读 多人点赞 2018-12-26 22:13:13
    实数编码的遗传算法寻优: 遗传算法的基本操作算子: (1)选择算子 选择算子的作用主要是避免优良基因的丢失,使得性能高的个体能以更大的概率被选中,有机会作为父代繁殖下一代,从而提 高遗传算法的全局收敛...

     实数编码的遗传算法寻优:

    遗传算法的基本操作算子:

    (1)选择算子

          选择算子的作用主要是避免优良基因的丢失,使得性能高的个体能以更大的概率被选中,有机会作为父代繁殖下一代,从而提  高遗传算法的全局收敛性及计算效率。常见的选择算子包括轮盘赌选择法、随机遍历抽样法、局部选择法及锦标赛选择法等。选择算子采用轮盘赌;

    (2)交叉算子

           在遗传算法中,交叉算子是区别于其它优化算法的本质特征,用于组合新的个体在解空间中快速有效地进行搜索,同时也降低了对有效模式的破坏程度,起到全局搜索寻优的效果。交叉算子直接影响着遗传算法的最终搜索效果,一定程度上决定了其发展前景。

    其中alpha为参数,0<alpha<1

    (3)变异算子

          群体基因的多样性是保证遗传算法寻找到全局最优解的前提条件,然而在进化过程中,遗传选择操作削弱了群体的多样性,上述交叉算子只有满足一定的条件才能保持群体的多样性,而变异操作则是保持群体多样性的有效算子,所以变异操作算子的选取也是必不可少的。变异尺度自适应变化的变异算子在进化初期采用较大的变异尺度来保持群体的多样性,而在后期变异尺度将逐渐缩小以提高局部微调能力。本文在此基础上做些改进,改进后的变异算子具有原有算子的优点,且操作上比原有算子简单方便,有效地加快遗传算法的收敛速度,具体如下:

    可以看出s(t) 决定了变异空间的大小,在迭代的初期,变异空间较大,在迭代的后期,变异空间缩小,算法的局部寻优能力变强。

    变异算子参考文献:   [1] 管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012.

    参数自适应:

    交叉概率Pc和变异概率Pm是遗传算法的两个重要的参数,这两个参数决定了每个个体进行交叉或者变异操作的概率。

     

    自适应算子参考文献:

    [2] M. Srinivas and L. M. Patnaik, "Adaptive probabilities of crossover and mutation in genetic algorithms," in IEEE Transactions on Systems, Man, and Cybernetics, vol. 24, no. 4, pp. 656-667, April 1994.doi: 10.1109/21.286385

    上述部分翻译自文献[2]

    按照论文描述,对算法的复现如下:

    % 测试函数图像
    % 测试函数图像
    % 改进的自适应遗传算法:
    % 参考文献:[7] M. Srinivas and L. M. Patnaik, "Adaptive probabilities of crossover and mutation in genetic algorithms," 
    %              in IEEE Transactions on Systems, Man, and Cybernetics, vol. 24, no. 4, pp. 656-667, April 1994.
    %              doi: 10.1109/21.286385
    clc;
    clear all;
    mode = 'Schaffer';
    % mode = 'self_define';
    if strcmp(mode, 'Schaffer')
        figure(1)
        x = -4:0.1:4;
        y = -4:0.1:4;
        [X,Y] = meshgrid(x,y);
        % Z = 3*cos(X.*Y)+X+Y.^2;
        Z = 0.5-((sin(sqrt(X.^2+Y.^2)).^2)-0.5)./(1+0.001.*(X.^2+Y.^2)).^2;
        surf(X,Y,Z);
        title('Schaffer Function');
        xlabel('X-轴');
        ylabel('Y-轴');
        zlabel('Z-轴');
        
        figure(2);
        contour(X, Y, Z, 8);
        title('Schaffer函数等高线');
        xlabel('X-轴');
        ylabel('Y-轴');
    end
    
    if strcmp(mode, 'self_define')
        figure(1);
        x = -4:0.1:4;
        y = -4:0.1:4;
        [X,Y] = meshgrid(x,y);
        % Z = 100.*(Y-X.^2).^2+(1-X).^2;
        Z = (cos(X.^2+Y.^2)-0.1)./(1+0.3*(X.^2+Y.^2).^2)+3;
        surf(X,Y,Z);
        %title('Rosen Brock valley Function');
        title('Self define Function');
        xlabel('X-轴');
        ylabel('Y-轴');
        zlabel('Z-轴');
    end
    
    clc;
    clearvars -except mode;
    
    r = 0.2;
    b = 3;
    NP=400;
    % Pc=0.65;   % 将Pc,Pm参数改进为自适应参数
    % Pm=0.20;
    G=520;    %        记得改
    D=2;    % 变量个数
    
    k1 = 1;
    k3 = 1;
    
    k2 = 0.5;
    k4 = 0.5;
    
    X_min=-4;
    X_max=4;
    Y_min=-4;
    Y_max=4;
    % optimization_trace = [];    % 三维数组, 行,列,叶
    for count_1=1:NP  % 产生初始解
        temp1 = X_min+rand()*(X_max-X_min);
        temp2 = Y_min+rand()*(Y_max-Y_min);
        x(count_1,:) = [temp1,temp2];
    end
    
    save_pic_cnt = 1;
    A = figure(3);
    
    for gen=1:G
        %pause(0.2);
        if rem(gen, 100)==1
            scatter(x(:,1), x(:, 2));
            axis([-4, 4, -4, 4]);
            title(['第', num2str(gen), '次迭代']);
            xlabel('变量X');
            ylabel('变量Y');
            base_path = 'C:\Users\18811\Desktop\graph\';
            cnt = num2str(save_pic_cnt);
            tail_path = '.jpg';
            frame = getframe(A);
            im=frame2im(frame);
            path_img = [base_path, cnt, tail_path];
            % imwrite(im, path_img);
            % save_x(:, :, save_pic_cnt) = x;
            save_pic_cnt = save_pic_cnt + 1;
        end
    
        % scatter(0, 0, 'o', 'r');
        for count_2=1:NP
            fitness(count_2)=func(x(count_2,:), mode);
        end
        %[fitness_min,index0] = min(fitness);
        %fitness_max = max(fitness);
        [fitness_max,index0] = max(fitness);
        fitness_average = sum(fitness)/(length(fitness));  % 种群的平均值
        collect_fit_average(gen) = fitness_average;   % 保存适应度的平均值
        collect_fitmax_subtract_fit_average(gen) = fitness_max - fitness_average;  % 保存f_max-f_average ;
        fitness_min = min(fitness);
        best_indiv = x(index0,:);  % 最优的个体
        % optimization_trace(gen,: , global_count) = best_indiv;
        % best_solution(gen) = fitness_min;
        best_solution(gen) = fitness_max;
        % 计算归一化的适应度值
        fitness = (fitness - fitness_min)/(fitness_max - fitness_min);
        fitness_sum = sum(fitness);
        fitness = fitness./fitness_sum;
        fitness = cumsum(fitness);  
    
        % 选择算子:
        ms = sort(rand(NP,1));
        fiti = 1;
        newi = 1;
        while newi<=NP
            if ms(newi)<fitness(fiti)
                clone_x(newi,:) = x(newi,:);
                newi = newi + 1;
            else
                fiti = fiti + 1;
            end
        end
        clone_x = clone_x(1:NP, :);
        % 进行交叉,变异操作
        % count=0;
        for count=1:2:NP
            % 自适应计算Pc.
            % 选区两个交叉的个体的较大的适应度值
            if fitness(count)>=fitness(count+1)
                fitness_selected = fitness(count);
            else
                fitness_selected = fitness(count+1);
            end
            % 计算Pc
            if fitness_selected >= fitness_average
                Pc = k1*(fitness_max-fitness_selected)/(fitness_max-fitness_average);
            else
                Pc = k3;
            end
            collect_Pc(gen, count) = Pc;   % 保存Pc的值
            temp_cross = rand();
            if temp_cross < Pc
                % 交叉算子   注:这种交叉算子效果更好
                temp_alpha = 0.6;  
                cross_x(count,:) = temp_alpha*clone_x(count,:)+(1-temp_alpha)*clone_x(count+1,:);
                cross_x(count+1,:) = temp_alpha*clone_x(count+1,:)+(1-temp_alpha)*clone_x(count,:);
                % 改进的交叉算子  参考文献:管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012.   注:但这种交叉算子实际的效果不理想
                % temp_gama = rand();
                % temp_alpha = 0.98;
                % cross_x(count,:) = temp_alpha*clone_x(count,:)+(1-temp_alpha)*clone_x(count+1,:)+temp_gama*(clone_x(count,:)-clone_x(count+1,:));
                % cross_x(count+1,:) = temp_alpha*clone_x(count+1,:)+(1-temp_alpha)*clone_x(count,:)+temp_gama*(clone_x(count,:)-clone_x(count+1,:));
            else
                cross_x(count,:)=clone_x(count,:);
                cross_x(count+1,:)=clone_x(count+1,:);
            end
            % 边界条件检查
            if cross_x(count,1)>X_max || cross_x(count,1)<X_min || cross_x(count,2)>Y_max || cross_x(count,2)<Y_min
                    temp1 = X_min+rand()*(X_max-X_min);
                    temp2 = Y_min+rand()*(Y_max-Y_min);
                    cross_x(count,:) = [temp1,temp2];
            end
        end
        cross_x = cross_x(1:NP,:);
        %   cross_x为完成交叉的个体;
        % 变异操作
        for count=1:1:NP
            % 计算Pm
            if fitness(count)>=fitness_average
                Pm = k2*(fitness_max-fitness(count))/(fitness_max-fitness_average);
            else
                Pm = k4;
            end
            collect_Pm(gen,count) = Pm;     %  保存Pm的值
            temp_mutation=rand();
            if temp_mutation<Pm
                %mutation_x(count,:) = (1+0.01).*cross_x(count,:);       %这种变异算子效果不理想
                % 变异算子   参考文献:管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012       
                mutation_pos = randi(D);
                if mutation_pos==1
                    low = X_min;
                    high = X_max;
                else
                    low = Y_min;
                    high = Y_max;
                end
                s_t(gen) = 1-r^((1-gen/G)^b);
                new_low = cross_x(count, mutation_pos)-s_t(gen)*(cross_x(count, mutation_pos)-low);
                new_high = cross_x(count, mutation_pos)+s_t(gen)*(high-cross_x(count, mutation_pos));
                mutation_x(count, :) = cross_x(count, :);
                mutation_x(count, mutation_pos) = new_low+rand()*(new_high-new_low);
                if mutation_x(count,1)>X_max || mutation_x(count,1)<X_min || mutation_x(count,2)>Y_max || mutation_x(count,2)<Y_min
                    temp1 = X_min+rand()*(X_max-X_min);
                    temp2 = Y_min+rand()*(Y_max-Y_min);
                    mutation_x(count,:) = [temp1,temp2];
                end
            else
                mutation_x(count,:) = cross_x(count,:);
            end        
        end
        %边界条件处理
        x=mutation_x(1:NP, :);
        x(1,:)= best_indiv;
    end
    %% 作图
    figure(4)
    plot(best_solution);
    %hold on;
    xlabel('进化代数');
    ylabel('适应度值');
    title('适应度进化曲线');
    
    figure(5);
    plot(collect_fitmax_subtract_fit_average);
    title('f_{max}-f_{average}曲线');
    xlabel('进化代数');
    ylabel('f_{max}-f_{average}');
    
    % function f=func(buf)
    %     f=0.5-((sin(sqrt(buf(1).^2+buf(2).^2)).^2)-0.5)./(1+0.001.*(buf(1).^2+buf(2).^2)).^2;
    % end
    
    function f=func(buf, md)
        if strcmp(md, 'Schaffer')
            f=0.5-((sin(sqrt(buf(1).^2+buf(2).^2)).^2)-0.5)./(1+0.001.*(buf(1).^2+buf(2).^2)).^2;
        end
        
        if strcmp(md,'self_define')
            % f = 100*(buf(2)-buf(1).^2).^2+(1-buf(1)).^2;
            f = (cos(buf(1).^2+buf(2).^2)-0.1)./(1+0.3*(buf(1).^2+buf(2).^2).^2)+3;
        end
    end

    测试函数:

    Schaffer函数:

    运行结果:

    种群的分布变化:

     

    -----------------------------------------------------分割线----------------------------------------------------

    2019/4/2 上面的代码有两个地方写错了,现在已经改正:

    1. 用于轮盘赌的fitness应该与用于计算自适应参数的fitness分开

    2.对轮盘赌选择算子进行修改

    修改后的代码:

    % 测试函数图像
    % 测试函数图像
    % 改进的自适应遗传算法:
    % 参考文献:[7] M. Srinivas and L. M. Patnaik, "Adaptive probabilities of crossover and mutation in genetic algorithms," 
    %              in IEEE Transactions on Systems, Man, and Cybernetics, vol. 24, no. 4, pp. 656-667, April 1994.
    %              doi: 10.1109/21.286385
    clc;
    clear all;
    mode = 'Schaffer';
    % mode = 'self_define';
    if strcmp(mode, 'Schaffer')
        figure(1)
        x = -4:0.1:4;
        y = -4:0.1:4;
        [X,Y] = meshgrid(x,y);
        % Z = 3*cos(X.*Y)+X+Y.^2;
        Z = 0.5-((sin(sqrt(X.^2+Y.^2)).^2)-0.5)./(1+0.001.*(X.^2+Y.^2)).^2;
        surf(X,Y,Z);
        title('Schaffer Function');
        xlabel('X-轴');
        ylabel('Y-轴');
        zlabel('Z-轴');
        
        figure(2);
        contour(X, Y, Z, 8);
        title('Schaffer函数等高线');
        xlabel('X-轴');
        ylabel('Y-轴');
    end
     
    if strcmp(mode, 'self_define')
        figure(1);
        x = -4:0.1:4;
        y = -4:0.1:4;
        [X,Y] = meshgrid(x,y);
        % Z = 100.*(Y-X.^2).^2+(1-X).^2;
        Z = (cos(X.^2+Y.^2)-0.1)./(1+0.3*(X.^2+Y.^2).^2)+3;
        surf(X,Y,Z);
        %title('Rosen Brock valley Function');
        title('Self define Function');
        xlabel('X-轴');
        ylabel('Y-轴');
        zlabel('Z-轴');
    end
     
    clc;
    clearvars -except mode;
     
    r = 0.2;
    b = 3;
    NP=100;
    % Pc=0.65;   % 将Pc,Pm参数改进为自适应参数
    % Pm=0.20;
    G=100;    %        记得改
    D=2;    % 变量个数
     
    k1 = 1;
    k3 = 1;
     
    k2 = 0.5;
    k4 = 0.5;
     
    X_min=-4;
    X_max=4;
    Y_min=-4;
    Y_max=4;
    % optimization_trace = [];    % 三维数组, 行,列,叶
    for count_1=1:NP  % 产生初始解
        temp1 = X_min+rand()*(X_max-X_min);
        temp2 = Y_min+rand()*(Y_max-Y_min);
        x(count_1,:) = [temp1,temp2];
    end
     
    save_pic_cnt = 1;
    A = figure(3);
     
    for gen=1:G
        pause(0.2);
        if rem(gen, 2)==1
            scatter(x(:,1), x(:, 2));
            axis([-4, 4, -4, 4]);
            title(['第', num2str(gen), '次迭代']);
            xlabel('变量X');
            ylabel('变量Y');
            base_path = 'C:\Users\18811\Desktop\graph\';
            cnt = num2str(save_pic_cnt);
            tail_path = '.jpg';
            frame = getframe(A);
            im=frame2im(frame);
            path_img = [base_path, cnt, tail_path];
            % imwrite(im, path_img);
            % save_x(:, :, save_pic_cnt) = x;
            save_pic_cnt = save_pic_cnt + 1;
        end
     
        % scatter(0, 0, 'o', 'r');
        for count_2=1:NP
            fitness(count_2)=func(x(count_2,:), mode);
        end
        fitness_ = fitness;
        %[fitness_min,index0] = min(fitness);
        %fitness_max = max(fitness);
        [fitness_max,index0] = max(fitness);
        fitness_average = sum(fitness)/(length(fitness));  % 种群的平均值
        collect_fit_average(gen) = fitness_average;   % 保存适应度的平均值
        collect_fitmax_subtract_fit_average(gen) = fitness_max - fitness_average;  % 保存f_max-f_average ;
        fitness_min = min(fitness);
        best_indiv = x(index0,:);  % 最优的个体
        % optimization_trace(gen,: , global_count) = best_indiv;
        % best_solution(gen) = fitness_min;
        best_solution(gen) = fitness_max;
        % 计算归一化的适应度值
        fitness = (fitness - fitness_min)/(fitness_max - fitness_min);
        fitness_sum = sum(fitness);
        fitness = fitness./fitness_sum;
        fitness = cumsum(fitness);  
        
        % 轮盘赌选择
        newi = 1;
        while newi<=NP
            random_num = rand();   % 生成随机数
            if random_num<fitness(1)
                clone_x(newi, :) = x(1, :);
                newi = newi+1;
            else
                for ct=1:NP-1
                    if random_num>fitness(ct) && random_num<fitness(ct+1)
                        clone_x(newi,:) = x(ct,:);
                        newi = newi+1;
                        break;
                    end
                end
            end
        end
        % disp(clone_x - x);
        % 进行交叉,变异操作
        % count=0;
        for count=1:2:NP
            % 自适应计算Pc.
            % 选区两个交叉的个体的较大的适应度值
            if fitness_(count)>=fitness_(count+1)
                fitness_selected = fitness_(count);
            else
                fitness_selected = fitness_(count+1);
            end
            % 计算Pc
            if fitness_selected >= fitness_average
                Pc = k1*(fitness_max-fitness_selected)/(fitness_max-fitness_average);
            else
                Pc = k3;
            end
            collect_Pc(gen, count) = Pc;   % 保存Pc的值
            temp_cross = rand();
            if temp_cross < Pc
                % 交叉算子   注:这种交叉算子效果更好
                temp_alpha = 0.6;  
                cross_x(count,:) = temp_alpha*clone_x(count,:)+(1-temp_alpha)*clone_x(count+1,:);
                cross_x(count+1,:) = temp_alpha*clone_x(count+1,:)+(1-temp_alpha)*clone_x(count,:);
                % 改进的交叉算子  参考文献:管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012.   注:但这种交叉算子实际的效果不理想
                % temp_gama = rand();
                % temp_alpha = 0.98;
                % cross_x(count,:) = temp_alpha*clone_x(count,:)+(1-temp_alpha)*clone_x(count+1,:)+temp_gama*(clone_x(count,:)-clone_x(count+1,:));
                % cross_x(count+1,:) = temp_alpha*clone_x(count+1,:)+(1-temp_alpha)*clone_x(count,:)+temp_gama*(clone_x(count,:)-clone_x(count+1,:));
            else
                cross_x(count,:)=clone_x(count,:);
                cross_x(count+1,:)=clone_x(count+1,:);
            end
            % 边界条件检查
            if cross_x(count,1)>X_max || cross_x(count,1)<X_min || cross_x(count,2)>Y_max || cross_x(count,2)<Y_min
                    temp1 = X_min+rand()*(X_max-X_min);
                    temp2 = Y_min+rand()*(Y_max-Y_min);
                    cross_x(count,:) = [temp1,temp2];
            end
        end
        cross_x = cross_x(1:NP,:);
        %   cross_x为完成交叉的个体;
        % 变异操作
        for count=1:1:NP
            % 计算Pm
            if fitness_(count)>=fitness_average
                Pm = k2*(fitness_max-fitness_(count))/(fitness_max-fitness_average);
            else
                Pm = k4;
            end
            collect_Pm(gen,count) = Pm;     %  保存Pm的值
            temp_mutation=rand();
            if temp_mutation<Pm
                %mutation_x(count,:) = (1+0.01).*cross_x(count,:);       %这种变异算子效果不理想
                % 变异算子   参考文献:管小艳. 实数编码下遗传算法的改进及其应用[D].重庆大学,2012       
                mutation_pos = randi(D);
                if mutation_pos==1
                    low = X_min;
                    high = X_max;
                else
                    low = Y_min;
                    high = Y_max;
                end
                s_t(gen) = 1-r^((1-gen/G)^b);
                new_low = cross_x(count, mutation_pos)-s_t(gen)*(cross_x(count, mutation_pos)-low);
                new_high = cross_x(count, mutation_pos)+s_t(gen)*(high-cross_x(count, mutation_pos));
                mutation_x(count, :) = cross_x(count, :);
                mutation_x(count, mutation_pos) = new_low+rand()*(new_high-new_low);
                if mutation_x(count,1)>X_max || mutation_x(count,1)<X_min || mutation_x(count,2)>Y_max || mutation_x(count,2)<Y_min
                    temp1 = X_min+rand()*(X_max-X_min);
                    temp2 = Y_min+rand()*(Y_max-Y_min);
                    mutation_x(count,:) = [temp1,temp2];
                end
            else
                mutation_x(count,:) = cross_x(count,:);
            end        
        end
        %边界条件处理
        x=mutation_x(1:NP, :);
        x(1,:)= best_indiv;
    end
    %% 作图
    figure(4)
    plot(best_solution);
    %hold on;
    xlabel('进化代数');
    ylabel('适应度值');
    title('适应度进化曲线');
     
    figure(5);
    plot(collect_fitmax_subtract_fit_average);
    title('f_{max}-f_{average}曲线');
    xlabel('进化代数');
    ylabel('f_{max}-f_{average}');
     
    % function f=func(buf)
    %     f=0.5-((sin(sqrt(buf(1).^2+buf(2).^2)).^2)-0.5)./(1+0.001.*(buf(1).^2+buf(2).^2)).^2;
    % end
     
    function f=func(buf, md)
        if strcmp(md, 'Schaffer')
            f=0.5-((sin(sqrt(buf(1).^2+buf(2).^2)).^2)-0.5)./(1+0.001.*(buf(1).^2+buf(2).^2)).^2;
        end
        
        if strcmp(md,'self_define')
            % f = 100*(buf(2)-buf(1).^2).^2+(1-buf(1)).^2;
            f = (cos(buf(1).^2+buf(2).^2)-0.1)./(1+0.3*(buf(1).^2+buf(2).^2).^2)+3;
        end
    end
    

    修改后的算法寻优效果得到很大的提升,非常感谢指出代码中的错误:

    运行结果:

     

     

     

     

    展开全文
  • 本文将改进的自适应遗传算法和相结合用于0-1背包问题的求解。此算法对交叉率和变异率进行了优化,实现了交叉率和变异率的非线性自适应调整,并对不可行解进行了贪婪修复。实验结果表明,相比传统的自适应遗传方法,...
  • 集装箱配载是一个复杂的组合...在满足一定的约束条件下,提出一种3维集装箱装载的自适应遗传算法.算法中考虑了货物放置方向和装载容积等约束条件,给出了有效的解码算法.实例仿真结果表明了该算法的有效性和实用性.</p>
  • 交叉概率和变异概率能够随适应度自动改变。
  • 标准的遗传算法在设置交叉算子和变异算子时使用固定的值,这样在求解复杂的优化问题时会存在解的多样性差和早熟的缺点。...通过实验验证,新算法在收敛速度、稳定性及优良解的多样性上比传统的自适应遗传算法有优势。
  • 文中研究了汽车转向路感的形成,并对系统进行了动力学建模,分析了电动助力转向系统的路感...仿真结果表明,自适应遗传算法具有搜索速度快,收敛精度高等优点,基于自适应遗传算法优化的系统参数提高了系统的转向路感。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,566
精华内容 1,826
关键字:

自适应遗传算法