遗传算法

遗传算法使用群体搜索技术,将种群代表一组问题解,通过对当前种群施加选择、交叉和变异等一系列遗传操作来产生新一代的种群,并逐步使种群进化到包含近似最优解的状态。


1. 基本概念

群体和个体:可行解集合和单个可行解
染色体和基因:可行解的编码(如‘11101101’)和单个可行解(如‘1’)
遗传编码:把优化变量(实数值或者序列顺序)转化为基因的组合表示形式,如二进制编码、十进制编码
适应度:选择适应度函数反映解的最优程度
遗传操作:1. 选择,常用“轮盘赌” ;2. 交叉,对应位互换 ;3. 变异,随机位突变


2. 改进方向

标准遗传算法存在局部搜索能力差和“早熟”等缺陷。可以从编码机制、选择策略、交叉算子、变异算子、特殊算子和参数设计(包括群体规模、交叉概率、变异概率)等方面加以改进。


3. 流程

4. 关键参数

种群规模NP:较大复杂度高,较小表现不好,一般10~200
交叉概率Pc:较大开辟新的搜索区域能力更强,但是好的个体会遭到破坏。较小则易陷入迟钝。一般选0.25~1
变异概率Pm:低频可以保护优秀个体,高频易趋于纯粹的随机。一般选0.001~0.1
遗传算法的终止进化代数G:终止条件之一,一般100~1000


5. MATLAB实例

求函数极值 f(x)=x+10sin(5x)+7cos(4x),x[0,10] f ( x ) = x + 10 s i n ( 5 x ) + 7 c o s ( 4 x ) , x ∈ [ 0 , 10 ]

代码:

% 标准遗传算法求函数极值
%clear all;
%close all;
%clc;                            %清屏
NP = 50;                        %种群大小
L = 20;                         %二进制位串长度
Pc=0.8;                         %交叉概率
Pm = 0.1;                       %变异概率
G = 100;                        %最大遗传代数
Xr = 10;                        %上限
Xl = 0;                         %下限
f = round(rand(NP,L));          %初始种群
x = zeros(NP,1);                %十进制数
Fit = zeros(NP,1);              %个体适应度
nf = zeros(NP,L);               %新种群
trace = zeros(G,1);

% 遗传算法循环
for k = 1:G

    %二进制解码为十进制
    for i =  1:NP
        U = f(i,:);
        m = 0;
        for j =1:L
            m = U(j)*2^(j-1) + m; %右边高位
        end
        x(i) = Xl + m*(Xr-Xl)/(2^L-1);
        Fit(i) = func1(x(i));
    end 
    maxFit = max(Fit);
    minFit = min(Fit);
    rr = find(Fit==maxFit);         %返回相等值的坐标,可能返回[2,4]。表示2,4都相等
    fBest = f(rr(1,1),:);
    xBest = x(rr(1,1));
    Fit = (Fit-minFit)/(maxFit-minFit); %归一化适应度


    %基于轮盘赌的赋值操作
    sum_Fit = sum(Fit);
    fitvalue = Fit./sum_Fit;
    fitvalue = cumsum(fitvalue);    %累计概率,像饼形图一样
    ms = sort(rand(NP,1));      %采样NP次,从小到大排序
    fiti = 1;
    newi =1;

    while newi <= NP
        if (ms(newi) < fitvalue(fiti))
            nf(newi,:) = f(fiti,:);
            newi = newi+1;
        else
            fiti = fiti+1;
        end
    end


    %基于概率的交叉操作
    for i = 1:2:NP
        p = rand;
        if p < Pc
            q = round(rand(1,L));
            for j = 1:L
                if q(j)==1
                    temp = nf(i+1,j);
                    nf(i+1,j) = nf(i,j);
                    nf(i,j) = temp;
                end
            end
        end
    end


    %基于概率的变异操作
    i = 1;
    while i <= round(NP*Pm)
        h = randi(NP);          %随机选择需要变异的染色体
        for j = 1:round(L*Pm)   %随机选择变异的基因个数
            g = randi(L);       %随机选择变异的基因
            nf(h,g) =~ nf(h,g);
        end
        i = i+1;
    end

    f = nf;
    f(1,:) = fBest;             %保留最优个体在新的种群
    trace(k) = maxFit;          %历代最优适应度

end

figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')


% 适应度函数
function result = func1(x)
    fit = x+10*sin(5*x)+7*cos(4*x);
    result = fit;
end

结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值