智能优化算法之遗传算法二(GA)

在遗传算法中,将 n n n 维决策向量 X = [ x 1 , x 2 , … , x n ] T X=[x_1,x_2,…,x_n]^T X=[x1,x2,,xn]T n n n 个记号 X i ( i = 1 , 2 , … , n ) X_i(i=1,2,…, n) Xi(i=12n)所组成的符号串 X X X 来表示:

在这里插入图片描述

把每一个 X i X_i Xi 看作一个遗传基因,它的所有可能取值就称为等位基因,这样, X X X 就可看作由 n n n 个遗传基因所组成的一个染色体。

在遗传算法中,决策向量 X X X 组成了问题的解空间。对问题最优解的搜索是通过对染色体 X X X 的搜索过程来完成的,因而所有的染色体 X X X 就组成了问题的搜索空间。

1. 遗传算法运算流程
  • 初始化。设置进化代数计数器 g = 0 g=0 g=0,设置最大进化代数 G G G,随机生成 N P NP NP个个体作为初始群体 P ( 0 ) P(0) P(0)
  • 个体评价。计算群体 P ( t ) P(t) P(t)中各个个体的适应度。
  • 选择运算。将选择算子作用于群体,根据个体的适应度,按照一定的规则或方法,选择一些优良个体遗传到下一代群体。
  • 交叉运算。将交叉算子作用于群体,对选中的成对个体,以某一概率交换它们之间的部分染色体,产生新的个体
  • 变异运算。将变异算子作用于群体,对选中的个体,以某一概率改变某一个或某一些基因值为其他的等位基因。群体 P ( t ) P(t) P(t) 经过选择、交叉和变异运算之后得到下一代群体 P ( t + 1 ) P(t+1) P(t+1)。计算其适应度值,并根据适应度值进行排序,准备进行下一次遗传操作。
  • 终止条件判断:若 g ≤ G g≤G gG,则 g = g + 1 g=g+1 g=g+1,转到步骤(2);若 g > G g>G gG ,则此进化过程中所得到的具有最大适应度的个体作为最优解输出,终止计算。
    在这里插入图片描述
2. 关键参数说明
群体规模 N P NP NP
  • 较大的群体规模意味着计算复杂度较高,一般 N P 取 10 ∼ 200 NP取10\sim200 NP10200
交叉概率 P c P_c Pc
  • 交叉概率过大,高性能的模式可能会遭到破坏;过小,遗传搜索可能会陷入迟钝状态。一般 P c 取 0.25 ∼ 1.00 P_c取0.25\sim1.00 Pc0.251.00
变异概率 P m P_m Pm
  • 一般低频度的变异可防止群体中重要基因的可能丢失,高频度的变异将使遗传算法趋于纯粹的随机搜索。通常 P m 取 0.001 ∼ 0.1 P_m取0.001\sim0.1 Pm0.0010.1
遗传运算中终止进化代数 G G G
  • G G G 的可能取值可在 100 ∼ 1000 100\sim1000 1001000之间
matlab仿真代码

仿真过程如下:

  • 初始化种群数目为 N P = 50 NP=50 NP=50 ,染色体二进制编码长度为 L = 20 L =20 L=20 ,最大进化代数为 G = 100 G=100 G=100 ,交叉概率为 P c = 0.8 P_c=0.8 Pc=0.8 ,变异概率为 P m = 0.1 P_m=0.1 Pm=0.1

  • 产生初始种群,将二进制编码转换成十进制,计算个体适应度值,并进行归一化;采用基于轮盘赌的选择操作、基于概率的交叉和变异操作,产生新的种群,并把历代的最优个体保留在新种群中,进行下一步遗传操作。

  • 判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。

%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
clc;
NP = 50;          %种群数量
L = 20;           %二进制位串长度 
Pc = 0.8;         %交叉率
Pm = 0.1;         %变异率
G = 100;          %最大遗传代数
Xs = 10;          %上限
Xx = 0;           %下线
f = randi([0,1],NP,L);    %生成一个5020列的(0-1)数组
%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k = 1:G
    %%%%%%%%将二进制解码为定义域范围内的十进制%%%%%%%%
    for i = 1:NP
        U = f(i,:);    %取 f矩阵的第一行
        m = 0;
        for j =1:L
            m = U(j)*2^(j-1)+m;   %将每一行的二进制化成十进制
        end
        x(i) = Xx+ m*(Xs-Xx)/(2^L-1);
        Fit(i) = func1(x(i));
    end
    maxFit = max(Fit);
    minFit = min(Fit);
    rr = find(Fit==maxFit);  
    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));
    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 = randi([0 1],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([1,NP],1,1);
        for j =1:round(L*Pm)
            g = randi([1,L],1,1);
            nf(h,g) =~ nf(h,g);
        end
        i = i+1;
    end
    f = nf;
    f(1,:) = fBest;
    trace(k) = maxFit
end
xBest;
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%
function result =func1(x)
fit=x+10*sin(5*x)+7*cos(4*x);
result=fit;
end


优化结束后,其适应度进化曲线如图所示。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值