matlab实现遗传算法与蚁群算法

一、要求

1.利用matlab实现遗传算法和蚁群算法,解决相关问题

2.体会两种算法的具体作用

二、原理

(1)遗传算法:

不断循环,直到寻找出一个解

1. 检查每个染色体,看它解决问题的性能怎样,并相应地为它分配一个适应性分 数。

2. 从当前群体选出两个成员。选出的概率与染色体的适应性成正比,适应分数越 高,被选中的概率越大。常用的方法就是轮赌选择法(roulette wheel selection)。

3. 按照预先设定的杂交率(crossover rate),从每个选中染色体的一个随机确定的点 上进行杂交。

4. 按照预定的变异率(mutation rate),通过对被选染色体的位的循环,把相应的位进 行翻转。

5. 重复步骤 2,3,4,直到新的群体被创建出来。 结束循环

结束循环。

在matlab中可以通过工具箱optimtool利用GUI实现遗传算法,

(2)蚁群算法:

原理:

1、蚂蚁在路径上释放信息素。

2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。

3、信息素浓度与路径长度成反比。后来的蚂蚁再次碰到该路口时,就选择信息素浓度较高路径。

4、最优路径上的信息素浓度越来越大。

5、最终蚁群找到最优寻食路径。

步骤:

1.选择从初始点下一步可以到达的节点,根据每个节点的信息素求出前往每个节点的概率,并利用轮盘算法选取下一步的初始点。

pijk=[τij(t)]a*[ηij]βkϵ{N-tabμk}[τij(t)]a*[ηij]β0,

其中,τij(t)为析取图中弧i,j)上的信息素的浓度;ηij为与弧i,j)相关联的启发式信息;αβ分别τij(t)ηij的权重参数。

2.更新路径以及路程长度。

3.重复1、2过程,直到蚂蚁到达终点或者无路可走。

4.重复1、2、3,直到某一代m只蚂蚁迭代结束。

5.更新信息素矩阵,其中没有到达的蚂蚁不计算在内。

       τijt+1=1-ρ*τijtτij

       Δτijt=QLk(t),      蚂蚁k经过i,j0,       蚂蚁k不经过i,j

(6)重复(1)~(5),直至第n代蚂蚁迭代结束。

三、过程及结果

3.1.遗传算法的GUI实现

利用GUI实现用遗传算法求解函数

fx,y=1-0.1*(sinx2+y2-0.1)/(x2+y2)

的适应值。

创建遗传算法适应度函数:

图1 适应度函数

打开遗传算法GUI界面设置参数并运行:

图2 遗传算法GUI

结果如下:

图3 遗传算法运行结果

可以看出,本轮迭代最佳适应值为0.988461而平均适应值为0.993128

3.2.蚁群算法在路径规划中的应用

实验需要我们给出机器人在避开障碍物的前提下通过地图的最优路径。

输入0和1组成的矩阵表示地图,0表示可通过,1表示障碍物,地图布局如下:

图4 地图布局

算法实现代码如下:

function main()
G=[0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
   0 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0;
   0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;
   0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0;
   0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
   0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
   1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
   1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0;
   0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0;
   0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0;
   0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0;];
MM=size(G,1);
Tau=ones(MM*MM,MM*MM);
Tau=8.*Tau;
K=200;
M=80;
S=1;
E=MM*MM;
Alpha=1;
Beta=8;
Rho=0.4;
Q=1;
mink1=inf;
mink=0;
min1=0;
D=G2D(G);
N=size(D,1);
a=1;
Ex=a*(mod(E,MM)-0.5);
if Ex==-0.5
    Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));
Eta=zeros(N);
for i=1:N
    ix=a*(mod(i,MM)-0.5);
    if ix==-0.5
        ix=MM-0.5;
    end
    iy=a*(MM+0.5-ceil(i/MM));
    if i~=E
        Eta(i)=1/((ix-Ex)^2+(iy-Ey)^2-0.5);
    else
        Eta(i)=100;
    end
end
ROUTES=cell(K,M);
PL=zeros(K,M);
for k = 1:K
    for m = 1:M
        W=S;
        Path=S;
        PLkm=0;
        TABUkm=ones(N);
        TABUkm(S)=0;
        DD=D;
        DW=DD(W,:);
        DW1=find(DW);
        for j=1:length(DW1)
            if TABUkm(DW1(j))==0
                DW(DW(j))=0;
            end
        end
        LJD=find(DW);
        Len_LJD=length(LJD);
        while W~=E&&Len_LJD>=1
            PP=zeros(Len_LJD);
            for i=1:Len_LJD
                PP(i)=(Tau(W,LJD(i))^Alpha)*((Eta(LJD(i)))^Beta);
            end
            sumpp=sum(PP);
            PP=PP/sumpp;
            Pcum(1)=PP(1);
            for i=2:Len_LJD
                Pcum(i)=Pcum(i-1)+PP(i);
            end
            Select=find(Pcum>=rand);
            to_visit=LJD(Select(1));
            Path=[Path,to_visit];
            PLkm=PLkm+DD(W,to_visit);
            W=to_visit;
            for kk=1:N
                if TABUkm(kk)==0
                    DD(W,kk)=0;
                    DD(kk,W)=0;
                end
            end
            TABUkm(W)=0;
            DW=DD(W,:);
            DW1=find(DW);
            for j=1:length(DW1)
                if TABUkm(DW1(j))==0
                    DW(j)=0;
                end
            end
            LJD=find(DW);
            Len_LJD=length(LJD);
        end
            ROUTES{k,m}=Path;
            if Path(end)==E
                PL(k,m)=PLkm;
                if PLkm<mink1
                    mink=k;min1=m;mink1=PLkm;
                end
            else
                PL(k,m)=0;
            end
        end
        Delta_Tau=zeros(N,N);
        for m=1:M
            if PL(k,m)
                ROUT=ROUTES{k,m};
                TS=length(ROUT)-1;
                PL_km=PL(k,m);
                for s=1:TS
                    x=ROUT(s);
                    y=ROUT(s+1);
                    Delta_Tau(x,y)=Delta_Tau(x,y)+Q/PL_km;
                    Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;
                end
            end
        end
        Tau=(1-Rho).*Tau+Delta_Tau;
end
    
    plotif=1;
    if plotif==1
        minPL=zeros(K);
        for i=1:K
            PLK=PL(i,:);
            Nonzero=find(PLK);
            PLKPLK=PLK(Nonzero);
            minPL(i)=min(PLKPLK);
        end
        figure(1)
        plot(minPL)
        hold on 
        grid on
        title('�������߱仯����')
        xlabel('��������')
        ylabel('��ѷ������')
        figure(2)
        axis([0,MM,0,MM])
        for i = 1:MM
            for j= 1:MM
                if G(i,j)==1
            x1=j-1;y1=MM-i;
            x2=j;y2=MM-i;
            x3=j;y3=MM-i+1;
            x4=j-1;y4=MM-i+1;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
            hold on 
        else
            x1=j-1;y1=MM-i;
            x2=j;y2=MM-i;
            x3=j;y3=MM-i+1;
            x4=j-1;y4=MM-i+1;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
            hold on
            end
end
end
hold on
title('�������˶��켣');
xlabel('����x');
ylabel('����y');
ROUT=ROUTES{mink,min1};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
    Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
    if Rx(ii)==-0.5
        Rx(ii)=MM-0.5;
    end
    Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
end
plot(Rx,Ry)
    end
plotif2=0;
if plotif2==1
    figure(3)
    axis([0,MM,0,MM])
for i=1:MM
    for j=1:MM
        if G(i,j)==1
            x1=j-1;y1=MM-i;
            x2=j;y2=MM-i;
            x3=j;y3=MM-i+1;
            x4=j-1;y4=MM-i+1;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
            hold on
        else
            x1=j-1;y1=MM-i;
            x2=j;y2=MM-i;
            x3=j;y3=MM-i+1;
            x4=j-1;y4=MM-i+1;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
            hold on
        end
    end
end
for k=1:K
    PLK=PL(k,:);
    minPLK=min(PLK);
    pos=find(PLK==minPLK);
    m=pos(1);
    ROUT=ROUTES{k,m};
    LENROUT=length(ROUT);
    Rx=ROUT;
    Ry=ROUT;
    for ii=1:LENROUT
        Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
        if Rx(ii)==-0.5
            Rx(ii)=MM-0.5;
        end
        Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
    end
    plot(Rx,Ry)
    hold on
end
end

function D=G2D(G)
l=size(G,1);
D=zeros(l*l,l*l);
for i=1:l
    for j=1:l
        if G(i,j)==0
            for m=1:l
                for n=1:l
                    if G(m,n)==0
                        im=abs(i-m);jn=abs(j-n);
                        if im+jn==1||(im==1&&jn==1)
                            D((i-1)*l+j,(m-1)*l+n)=(im+jn)^0.5;
                        end
                    end
                end
            end
        end
    end
end

        
            

运行上述代码后结果如下:

图5 收敛曲线变化趋势

从图中可以看出迭代次数在30到40次之间时,最小路径长度逐渐收敛于38左右

图6 机器人运动轨迹

分析轨迹可知,机器人避开了所有的障碍,成功通过地图

四、总结

对于遗传算法我们可以直接利用matlab自带的GUI实现遗传算法的编程,并且可以发现每一次运行所求解的适应值都可能会有所不同,这是由于遗传算法是近似优化算法,它的每个解不能保证全局最优。在蚁群算法求解最优路径的实验中,通过编程的方式,选取最短路径作为优化原则并利用轮盘算法迭代寻找最优路线,可以看到蚁群算法中信息素等相关参数的具体影响。路径规划也是自主机器人移动导航的一项关键技术。

1 2/3维图像分割工具箱 2 PSORT粒子群优化工具箱 3 matlab计量工具箱Lesage 4 MatCont7p1 5 matlab模糊逻辑工具箱函数 6 医学图像处理工具箱 7 人工蜂群工具箱 8 MPT3安装包 9 drEEM toolbox 10 DOMFluor Toolbox v1.7 11 Matlab数学建模工具箱 12 马尔可夫决策过程(MDP)工具箱MDPtoolbox 13 国立SVM工具箱 14 模式识别与机器学习工具箱 15 ttsbox1.1语音合成工具箱 16 分数阶傅里叶变换的程序FRFT 17 魔方模拟器与规划求解 18 隐马尔可夫模型工具箱 HMM 19 图理论工具箱GrTheory 20 自由曲线拟合工具箱ezyfit 21 分形维数计算工具箱FracLab 2.2 22 For-Each 23 PlotPub 24 Sheffield大学最新遗传算法工具箱 25 Camera Calibration 像机标定工具箱 26 Qhull(二维三维三角分解、泰森图)凸包工具箱 2019版 27 jplv7 28 MatlabFns 29 张量工具箱Tensor Toolbox 30 海洋要素计算工具箱seawater 31 地图工具箱m_map 32 othercolor配色工具包 33 Matlab数学建模工具箱 34 元胞自动机 35 量子波函数演示工具箱 36 图像局域特征匹配工具箱 37 图像分割graphcut工具箱 38 NSGA-II工具箱 39 chinamap中国地图数据工具箱(大陆地区) 40 2D GaussFit高斯拟合工具箱 41 dijkstra最小成本路径算法 42 多维数据快速矩阵乘法 43 约束粒子群优化算法 44 脑MRI肿瘤的检测与分类 45 Matlab数值分析算法程序 46 matlab车牌识别完整程序 47 机器人工具箱robot-10.3.1 48 cvx凸优化处理工具箱 49 hctsa时间序列分析工具箱 50 神经科学工具箱Psychtoolbox-3-PTB 51 地震数据处理工具CREWES1990版 52 经济最优化工具箱CompEcon 53 基于约束的重构分析工具箱Cobratoolbox 54 Schwarz-Christoffel Toolbox 55 Gibbs-SeaWater (GSW)海洋学工具箱 56 光声仿真工具箱K-Wave-toolbox-1.2.1 57 语音处理工具箱Sap-Voicebox 58 贝叶斯网工具箱Bayes Net Toolbox(BNT) 59 计算机视觉工具箱VFfeat-0.9.21 60 全向相机校准工具箱OCamCalib_v3.0 61 心理物理学数据分析工具箱Palamedes1_10_3 62 生理学研究工具箱EEGLAB 63 磁共振成像处理工具箱CONN 18b 64 matlab 复杂网络工具箱 65 聚类分析工具箱FuzzyClusteringToolbox 66 遗传规划matlab工具箱 67 粒子群优化工具箱 68 数字图像处理工具箱DIPUM Toolbax V1.1.3 69 遗传算法工具箱 70 鱼群算法工具箱OptimizedAFSAr 71 蚁群算法工具箱 72 matlab优化工具箱 73 数据包络分析工具箱 74 图像分割质量评估工具包 75 相关向量机工具箱 76 音频处理工具箱 77 nurbs工具箱 78 Nurbs-surface工具箱 79 grabit数据提取工具箱 80 量子信息工具箱QLib 81 DYNAMO工具箱 82 NEDC循环的整车油耗量 83 PlotHub工具箱 84 MvCAT_Ver02.01 85 Regularization Tools Version 4.1 86 MatrixVB 4.5(含注册) 87 空间几何工具箱 matGeom-1.2.2 88 大数计算工具箱 VariablePrecisionIntegers 89 晶体织构分析工具包 mtex-5.7.0 90 Minimal Paths 2工具箱 91 Matlab数学建模工具箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

deleteeee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值