智能优化算法及其MATLAB实例(第二版)——遗传算法2.1

一、遗传算法运算流程:

(1)初始化。设置进化代数计数器g=0,设置最大进化代数G,随机生成NP个个体作为初始群体P(0)。
(2)个体评价。计算群体P( t)中各个个体的适应度。
(3)选择运算。将选择算子作用于群体,根据个体的适应度,按照一定的规则或方法,选择一些优良个体遗传到下一代群体。
(4)交叉运算。将交叉算子作用于群体,对选中的成对个体,以某一概率交换它们之间的部分染色体,产生新的个体。
(5)变异运算。将变异算子作用于群体,对选中的个体,以某一概率改变某一个或某一些基因值为其他的等位基因。群体P( t)经过选择、交叉和变异运算之后得到下一代群体P( t+1)。计算其适应度值,并根据适应度值进行排序,准备进行下一次遗传操作。
(6)终止条件判断:若g≤G,则g= g+1,转到步骤(2)﹔若g>G,则此进化过程中所得到的具有最大适应度的个体作为最优解输出,终止计算。
 

遗传算法运算流程图

二、MATLAB实例仿真

例2.1  用标准遗传算法求函数f ( x ) =x+10sin ( 5x )+7cos (4x)的最大值,其中x的取值范围为[0,10]。

MATLAB代码如下:

%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%
clear ;  %清除所有变量
close all;  %清图
clc;  %清屏
NP = 50; %种群数量
L= 20; %二进制位串长度
Pc = 0.8; %交叉率
Pm = 0.1; %变异率
G= 100; %最大遗传代数
Xs = 10; %上限
Xx = 0; %下限
f = randi (L,NP); %随机获得初始种群
%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%
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) = 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 (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

 例2.2   计算函数的最小值,其中个体x的维数r=10。这是一个简单的平方和函数,只有一个极小点(0,0,…,0),理论最小值f (0,0,…,0)=0。

 MATLAB代码如下:

%%%%%%%%%%%%%%实值遗传算法求函数极值%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
%初始化
clear all;                           %清除所有变量
close all;                           %清图
clc;                                 %清屏
D=10;                                %单染色体上的基因数(即10个变量)(每个基因采用10进制)
NP=100;                              %染色体数目(初始化种群的数目)
Xs=20;                               %变量上限
Xx=-20;                              %变量下限
G=1000;                              %最大遗传代数
f=zeros(D,NP);                       %初始种群赋空间 创建一个10*100的0矩阵
nf=zeros(D,NP);                      %子种群赋空间   创建一个10*100的0矩阵
Pc=0.8;                              %交叉概率
Pm=0.1;                              %变异概率
f=rand(D,NP)*(Xs-Xx)+Xx;             %随机获得初始种群(10进制的种群),维数10*100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%按适应度升序排列
for np=1:NP
    MSLL(np)=func2(f(:,np));         %计算个染色体的适应度
end
[SortMSLL,Index]=sort(MSLL);         %sort对数组元素按升序排列 SortMSLL放排序后的数 Index放排序后的位置
Sortf=f(:,Index);                    %将适应度按升序排列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%遗传算法循环
for gen=1:G
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %采用君主方案进行选择交叉操作
    Emper=Sortf(:,1);                      %君主染色体(即最好的一个)
    NoPoint=round(D*Pc);                   %每次交叉点的个数   round取整函数
    PoPoint=randi([1 D],NoPoint,NP/2);     %交叉基因的位置   1-10 8*50矩阵
    nf=Sortf;
    %%%50个个体交叉
    for i=1:NP/2
        nf(:,2*i-1)=Emper;                 %将所有的奇数项换为君主染色体
        nf(:,2*i)=Sortf(:,2*i);            %偶数项不变
        for k=1:NoPoint
            nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
            nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %变异操作
    for m=1:NP                             %对所有个体进行变异
        for n=1:D                          %每个基因都可能变异
            r=rand(1,1);
            if r<Pm
                nf(n,m)=rand(1,1)*(Xs-Xx)+Xx; %变异操作
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %子种群按适应度升序排列
    for np=1:NP
        NMSLL(np)=func2(nf(:,np));
    end
    [NSortMSLL,Index]=sort(NMSLL);
    NSortf=nf(:,Index);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %产生新种群
    f1=[Sortf,NSortf];                %子代和父代合并
    MSLL1=[SortMSLL,NSortMSLL];       %子代和父代的适应度值合并
    [SortMSLL1,Index]=sort(MSLL1);    %适应度按升序排列
    Sortf1=f1(:,Index);               %按适应度排列个体
    SortMSLL=SortMSLL1(1:NP);         %取前NP个适应度值(这个地方有子代变为父代了)
    Sortf=Sortf1(:,1:NP);             %取前NP个个体
    trace(gen)=SortMSLL(1);           %历代最优适应度值
end
Bestf=Sortf(:,1)                      %最后最优个体
trace(end)                            %最优值 end为取最后一个值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%适应度函数
function result=func2(x)
summ=sum(x.^2);
result=summ;
end

 运行结果:

Bestf =

   -0.0017
    0.0007
   -0.0049
    0.0016
    0.0019
   -0.0025
   -0.0122
   -0.0028
    0.0224
   -0.0082


ans =

   7.6289e-04

 

  • 6
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cx&h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值