zoukankan      html  css  js  c++  java
  • 利用遗传算法求解最优值

    1.初始化种群

    function Init_pop = Initial_pop( pop_num,range_l,range_r )
    %%
    %   目的:初始化种群
    %   输入:种群个数
    %         初始化的种群应该在[range_l,range_r]之间
    %   输出:初始化之后的种群
    %%
        for i=1:pop_num
            Init_pop(:,i) = range_l + (range_r - range_l)*rand;
        end
    end
    

    2.目标函数

    function y = f_x( x )
    %%  目标函数
        y=x.*sin(3*pi.*x);
    end
    

    3.适应度函数

    function fit_value = Fitness(Init_pop)
    %%  目的;计算适应度
    %    输入:初始种群
    %          目标函数:y=x^2  
    %          所以我们取适应度函数为fit_value=1/y,值最小的时候,即为最优解
    %    输出:适应度值
        for i=1:size(Init_pop,2)
            fit_value(i) = 1/(2-f_x(Init_pop(:,i)));
        end
    end
    

    4.选择函数

    function New_pop = Option( pop,pop_num,Fit_value )
    %%  选择适应度高的个体
    %    输入:pop 初始化种群
    %         pop_num 种群中的个体数目
    %         Fit_value 适应度矩阵
    %    输出:New_pop 选择新的种群
    %%
         % 对适应度求和
         Total = sum(Fit_value,2);
         % 选择概率
         P_Selection = Fit_value/Total;
         % 求累计概率
         P_Accum = cumsum( P_Selection);
         for i=1:pop_num
             % 找到比随机数大的累计概率
             Index_mat = find(P_Accum>rand);
             if isempty(Index_mat)
                 continue
             end
             % 将首个比随机数大的累积概率位置的个体遗传下去
             New_pop(:,i) = pop(:,Index_mat(1));
         end
    end
    

    5.二进制编码

    function bin_pop = encoding( opt_pop,range_l)
    %%  目标:对选择后的新种群进行二进制编码
    %    输入:opt 选择后的种群
    %          pop_lenth 编码长度
    %    处理过程: 进行二进制编码
    %    输入:bin_pop 二进制种群
    %%
         pop =round((opt_pop-range_l)*10^6); % 10^6精确度
         bin_pop = [];
         %dec2bin将整数转换为二进制
         bin_pop = dec2bin( pop);
    end
    

    6.交叉函数

    function new_pop = crossovers(bin_pop,P_cross)
    %%  目的:进行交叉
    %    输入:bin_pop 二进制编码
    %          P_cross  交叉概率
    %    输出:new_popbin 新的二进制种群
    %%
        [r,c] = size(bin_pop);
        for i = 1:2:r-1
            if(rand<P_cross)
                location = round(rand*c);
                len = length(bin_pop(i,:));
                pop_parent = bin_pop(i,:);
                pop_mother = bin_pop(i+1,:);
                temp_parent = pop_parent(1,location+1:c);
                temp_mother = pop_mother(1,location+1:c);
                new_pop(i,:) = [ pop_parent(1,1:location),temp_mother];
                new_pop(i+1,:) = [pop_mother(1,1:location),temp_parent];
            else
                new_pop(i,:) = bin_pop(i,:);
                new_pop(i+1,:) = bin_pop(i+1,:)
            end
        end
     end
    

    7.变异函数

    function New_pop = Mutation( cross_group,P_mutation,pop_num)
    %%  变异算法
    %   输入变量: cross_group   交叉后的二进制种群
    %   重点问题: 利用什么方法寻找变异位置
    %             P_mutation    变异概率
    %   输出变量: Mutated_group  变异后的二进制种群
    %%
        for i = 1:pop_num
            if(rand<P_mutation)
                temp = cross_group(i,:);
                location = ceil(rand*length(temp));
                if temp(1,location) =='0'
                   temp(1,location) =='1';
                else temp(1,location) =='1'
                   temp(1,location) ='0';
                end
            else
                New_pop(i,:) = cross_group(i,:);
            end
        end
    end
    

    8.二进制解码

    function pop = decoding(pop_bin,range_l,pop_num)
    %%  目的:解码
    %    输入:pop_bin  二进制种群
    %          range_l  区间左端点
    %    输出:pop  实数种群
    %% 
        [r,c] = size(pop_bin);
        pop = ones(1,pop_num);
        for i=1:r
            kid_str = pop_bin(i,:);
            kid_dec = bin2dec(kid_str);
            kid = kid_dec/10^6+range_l; 
            pop(:,i) = kid;
        end
    end
    

    9.主函数

    %% 清理窗口和变量
    clc
    clear all
    %% 遗传参数设置
    NUMPOP=100;            %初始种群大小
    range_l=-1;            %问题解区间
    range_r=2;
    LENGTH=22;             %二进制编码长度
    ITERATION = 10000;     %迭代次数
    CROSSOVERRATE = 0.7;   %杂交率
    VARIATIONRATE = 0.001; %变异率
    %%
    %初始化种群
    pop=Initial_pop(NUMPOP,range_l,range_r);
    %绘制初始种群分布
    x=linspace(-1,2,1000);
    y=f_x(x);
    plot(x,y);
    hold on
    for i=1:size(pop,2)
        plot(pop(i),f_x(pop(i)),'ro');
    end
    hold off
    title('初始种群图像');
    %%
    %开始迭代
    for time=1:ITERATION
        %计算初始种群的适应度
        fitness=Fitness(pop);
        %选择
        pop= Option(pop,NUMPOP,fitness);
        %编码
        binpop=encoding(pop,range_l);
        %交叉
        kidPop = crossovers(binpop,CROSSOVERRATE);
        %变异
        kidsPop = Mutation(kidPop,VARIATIONRATE,NUMPOP);
        %解码
        kid_Pop=decoding(kidsPop,range_l,NUMPOP);
        %更新种群
        pop=kid_Pop;
    end
    figure
    x=linspace(-1,2,1000);
    y=f_x(x);
    plot(x,y);
    hold on
    for i=1:size(pop,2)
        plot(pop(i),f_x(pop(i)),'ro');
    end
    hold off
    title('终止种群');
    % 
    disp(['最优解:' num2str(max(f_x(pop)))]);
    disp(['最大适应度:' num2str(max(f_x(pop)))]); 
  • 相关阅读:
    学习笔记-Python基础4-九九乘法表练习
    学习笔记-Python基础4-函数
    学习笔记-Python基础3-程序结构:顺序、分支、循环
    JS根据获取的navigator.userAgent,判断用户打开页面的终端
    代理模式,CGLIB 与Spring AOP实现原理
    ueditor不过滤保存html
    ecstore 新增input控件方法
    ecstore前台模板保留css样式
    ecstore 当前网址
    mysql 导入数据过大报错
  • 原文地址:https://www.cnblogs.com/mysterygust/p/12823739.html
Copyright © 2011-2022 走看看