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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# for/foreach 循环

一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。 语法 C# 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); } 下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声…

【协议-HTTPS】

https https是在http协议的基础上&#xff0c;添加了SSL/TLS握手以及数据加密传输&#xff0c;也属于应用层协议。 httpshttp加密认证完整性保护 https交互图&#xff1a; HTTPS的整体过程分为证书验证和数据传输阶段&#xff1a; ① 证书验证阶段 浏览器发起 HTTPS 请求 服务…

Verilog刷题笔记44

题目&#xff1a;Consider the n-bit shift register circuit shown below: 解题&#xff1a; module top_module (input clk,input w, R, E, L,output Q );always(posedge clk)beginif(L1)Q<R;elseQ<(E1)?w:Q;endendmodule结果正确&#xff1a; 注意点&#xff1a; …

Web实现名言生成器:JavaScript DOM基础与实例教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

iscsi网络协议(连接硬件设备)

iscsi概念 iscsi是一种互联网协议&#xff0c;用于将存储设备&#xff08;如硬盘驱动器或磁带驱动器&#xff09;通过网络连接到计算机。它是一种存储区域网络&#xff08;SAN&#xff09;技术&#xff0c;允许服务器通过网络连接到存储设备&#xff0c;就像它们是本地设备一样…

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

springcloud第4季 负载均衡的介绍3

一 loadbalance 1.1 负载均衡的介绍 使用注解loadbalance&#xff0c;是一个客户端的负载均衡器&#xff1b;通过之前已经从注册中心拉取缓存到本地的服务列表中&#xff0c;获取服务进行轮询负载请求服务列表中的数据。 轮询原理 1.2 loadbalance工作流程 loadBalance工作…

Uni-App电商模板,纯前端模板,可直接使用 实现全平台适配与高效功能

一、引言 随着移动互联网的快速发展&#xff0c;多平台应用开发已成为业界关注的焦点。Uni-App&#xff0c;作为一种前端框架&#xff0c;可以实现一套代码多端运行&#xff0c;大大提高了开发效率。本文将介绍如何使用Uni-App搭建一个电商模板&#xff0c;实现全平台适配与高…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是&#xff0c;在WSL下安装Ubuntu&#xff0c;如果要使用主机的GPU卡&#xff0c;只需要在主机Windows上安装驱动&#xff0c;Linux中不需要安装驱动&#xff0c;可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项&#xff1a;如…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

循环队列、循环队列的基本操作

我要成为嵌入式高手之3月22日数据结构第五天&#xff01;&#xff01; ———————————————————————————— 顺序队列 存在问题&#xff1a;假溢出——解决办法&#xff1a;循环队列 空队列、满队列如何判断&#xff1f; 满队列&#xff1a;rear 1 …

一图详解 UVM phase机制

UVM验证环境构建时&#xff0c;引入 phase机制 &#xff0c;通过该机制可以很清晰的 将UVM仿真阶段层次化 。这里层次化&#xff0c;不仅仅是 各个phase的执行顺序 &#xff0c;还有 同一phase中的层次化组件之间phase也有先后关系 。 phase函数/任务执行顺序功能典型应用buil…

Java22已发布,支持SpringBoot3.3.0正式版

Java22已发布&#xff0c;支持SpringBoot3.3.0正式版 文章目录 Java22已发布&#xff0c;支持SpringBoot3.3.0正式版1. JDK22现已推出&#xff01;2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…

【Hive】HIVE运行卡死没反应

Hive运行卡死 再次强调 hive&#xff1a;小兄弟&#xff0c;没想到吧&#xff0c;咱可不是随便的人。&#x1f604; 那么&#xff0c;这次又遇见了hadoop问题&#xff0c;问题描述是这样的。 hive> insert into test values(1, nucty, 男); Query ID atguigu_202403241754…

Spring Boot整合Spring Security

Spring Boot 专栏&#xff1a;Spring Boot 从零单排 Spring Cloud 专栏&#xff1a;Spring Cloud 从零单排 GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo Spring Security是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块的默认技术…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

[Linux]文件系统

1.理解文件系统 Linux磁盘文件特性&#xff1a;内容加属性&#xff0c;内容大小是不确定的&#xff0c;但是属性大小是一定的&#xff0c;并且内容和属性是分开存储的。文件属性是用一个结构体来定义的&#xff0c;在Linux中&#xff0c;该结构体是固定128字节大小如下代码: …

LC 98.验证二叉搜索树

98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…