基于蚁群算法的航线规划

news2024/11/24 19:24:42

一、背景

二、代码

main.m 

clear;clc;
r=21; %21*21
c=21;
intau=20;
xstart=1;
ystart=3; %起点
xend=20;
yend=18;  %终点
gd=1;
xt=[5,11,8,16,12,15,17,19]; %障碍物
yt=[9,15,7,3,12,8,15,12];

threat=8;
NCmax=200;  %迭代次数

%初始化数据
Gamma_A=0.9;
Rho_A=0.2;
Alpha_A=1;
Beta_A=3;
Q=50;
m_A=15;%种群数目
W_A=zeros(m_A,1);
WW_A=10000;%代价比较值

C_A=struct('x_A',0,'y_A',0); %21*21矩阵点
for i_A=1:21
    for j_A=1:21
        C_A(i_A,j_A).x_A=i_A-1;
        C_A(i_A,j_A).y_A=j_A-1;
    end
end

for i_A=1:r
    for j_A=1:c
        Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c)=intau; %信息素
        Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1)=intau;
        Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+1)=intau;
    end
end
Wbest_A=ones(1,NCmax);
Wbest_A=Wbest_A*100000;


%第二步,计算各路径代价并完成各自搜索
for nc=1:NCmax
    x_A=[];y_A=[];
    %种群数据
    W_A=zeros(1,m_A);
    for i_A=1:m_A  %15
        x_A(i_A,1)=xstart;
        y_A(i_A,1)=ystart;
        for j_A=2:100
            if x_A(i_A,j_A-1)<=xend&&y_A(i_A,j_A-1)<=yend
                for k=1:3
                    switch k
                        case 1,
                            wt_A(1)=0;
                            for line=1:9
                                for threat0=1:threat
                                    d(threat0)=sqrt((x_A(i_A,j_A-1)-xt(threat0))^2+(y_A(i_A,j_A-1)+line/10*gd-yt(threat0))^2);
                                end
                                wt_A(1)=wt_A(1)+sum(1./d.^4);
                            end
                            wt_A(1)=wt_A(1)*gd;
                            wf_A(1)=gd;
                            w_A(1)=Gamma_A*wt_A(1)+(1-Gamma_A)*wf_A(1);
                        case 2,
                             wt_A(2)=0;
                            for line=1:9
                                for threat=1:8
                                    d(threat)=sqrt((x_A(i_A,j_A-1)+line/10*gd-xt(threat))^2+(y_A(i_A,j_A-1)+line/10*gd-yt(threat))^2);
                                end
                                wt_A(2)=wt_A(2)+sum(1./d.^4);
                            end
                            wt_A(2)=sqrt(2)*wt_A(2)*gd;
                            wf_A(2)=sqrt(2)*gd;
                            w_A(2)=Gamma_A*wt_A(2)+(1-Gamma_A)*wf_A(2);
                        case 3,
                              wt_A(3)=0;
                            for line=1:9
                                for threat=1:8
                                    d(threat)=sqrt((x_A(i_A,j_A-1)+line/10*gd-xt(threat))^2+(y_A(i_A,j_A-1)-yt(threat))^2);
                                end
                                wt_A(3)=wt_A(3)+sum(1./d.^4);
                            end
                            wt_A(3)=wt_A(3)*gd;
                            wf_A(3)=gd;
                            w_A(3)=Gamma_A*wt_A(3)+(1-Gamma_A)*wf_A(3);
                    end
                end
                part(1)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+c+1)^Alpha_A*(1/w_A(1))^Beta_A;
                part(2)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+c+1+1)^Alpha_A*(1/w_A(2))^Beta_A;
                part(3)=Tau_A((x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1,(x_A(i_A,j_A-1))*c+y_A(i_A,j_A-1)+1+1)^Alpha_A*(1/w_A(3))^Beta_A;
                total=sum(part);
                for s=1:3
                    p(s)=part(s)/total;
                end
                 %  [maxp,next]=max(p);
            %    next=choose(p,3);
                    p=cumsum(p);     %cumsum,元素累加即求和
                    next=find(p>=rand);
                switch next(1)
                    case 1,
                        x_A(i_A,j_A)=x_A(i_A,j_A-1);
                        y_A(i_A,j_A)=y_A(i_A,j_A-1)+1;
                    case 2,
                        x_A(i_A,j_A)=x_A(i_A,j_A-1)+1;
                        y_A(i_A,j_A)=y_A(i_A,j_A-1)+1;
                    case 3,
                        x_A(i_A,j_A)=x_A(i_A,j_A-1)+1;
                        y_A(i_A,j_A)=y_A(i_A,j_A-1);
                 end
                W_A(i_A)=W_A(i_A)+w_A(next(1));
                steps_A(i_A)=j_A;
                if x_A(i_A,j_A)==xend&&y_A(i_A,j_A)==yend
                   finish_A(i_A)=1;
                    break;
                 end
              else
              finish_A(i_A)=0;
                break;
              %     finish_A(i_A)=0;
           %      if x_A(i_A,j_A)==xend&&y_A(i_A,j_A)==yend
          %           finish_A(i_A)=1;
            %          break;
            end
           
        end
        
    end
   
    %第三步,信息素更新
    %第一种群数据
    for i_A=1:r-1
        for j_A=1:c-1
            Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c);
            Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1);
            Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+1)=(1-Rho_A)*Tau_A((i_A-1)*c+j_A,(i_A-1)*c+j_A+c+1);
        end
    end
    for i_A=1:m_A
        if finish_A(i_A)
            for j_A=1:steps_A(i_A)-1
                Tau_A((x_A(i_A,j_A))*c+y_A(i_A,j_A)+1,(x_A(i_A,j_A+1))*c+y_A(i_A,j_A+1)+1)=Tau_A((x_A(i_A,j_A))*c+y_A(i_A,j_A)+1,(x_A(i_A,j_A+1))*c+y_A(i_A,j_A+1)+1)+Rho_A*Q/W_A(i_A);
            end
        end
    end
    
    %第四步,记录迭代结果
   k_AA=minnum(W_A,finish_A,m_A);%寻找完成全局的代价最小的那只蚂蚁
   k_A=k_AA(1);
    if k_A
        for s=1:steps_A(k_A)-1
        Tau_A((x_A(k_A,s))*c+y_A(k_A,s)+1,(x_A(k_A,s+1))*c+y_A(k_A,s+1)+1)=(1-Rho_A)*Tau_A((x_A(k_A,s))*c+y_A(k_A,s)+1,(x_A(k_A,s+1))*c+y_A(k_A,s+1)+1)+Rho_A*Q/W_A(k_A); 
        end
        Wbest_A(nc)=W_A(k_A);
        if  WW_A>Wbest_A(nc)
                WW_A=Wbest_A(nc);
                X_A=x_A(k_A,:);
                Y_A=y_A(k_A,:);
        end
    end
end


for  i=1:length(X_A)%1~32
    if X_A(i)
        XX_A(i)=X_A(i);
        YY_A(i)=Y_A(i);
    end
end
V=[0,25,0,25];
axis(V);
plot(xt,yt,'ks',xstart,ystart,'ro',xend,yend,'ro',25,25,'wo')%绘制障碍物 起点 终点 以及一个边界点
hold on
set(gca,'XTick',0:25);set(gca,'YTick',0:25);
plot(XX_A,YY_A,'r'); %30个航点的航线
%grid on


minnum.m

function [k] = minnum( W,finish,m )
%寻找数组W中,符合finfish的最小值的下标
%W,fihish为m位数组
  j=0;sz=[]; k=0;  
     for i=1:m
        if finish(i)
             j=j+1;
            sz(j)=W(i);
            k=find(W==min(sz));
        end
     end
    
end

 G2D.m

function D=G2D(G)
%Construct Adjacency Matrix by path graph % G is matrix of 0 and 1, 1 represents obstacles 
a=1; 
N=size(G,1);
D=inf*ones(N^2,N^2);
for i=1:(N^2)  
x=ceil(i/N-0.00001); 
   y=mod(i,N);   
   if y==0    
y=N;  
   end   
 x1=x-1;y1=y-1;  
if x1>=1&&y1>=1    
j=(x1-1)*N+y1;   
   D(i,j)=1.414*a;   
   D(j,i)=1.414*a;   
   end  
x2=x-1;y2=y;  
if x2>=1      
j=(x2-1)*N+y2;   
   D(i,j)=a;    
   D(j,i)=a;  
end    
x3=x-1;y3=y+1;   
   if x3>=1&&x3>=N   
   j=(x3-1)*N+y3;  
D(i,j)=1.414*a;   
   D(j,i)=1.414*a;    
end   
   x4=x;y4=y-1;  
if y4>=1   
   j=(x4-1)*N+y4;  
D(i,j)=a;    
D(j,i)=a;   
end    
   x5=x;y5=y+1;   
   if y5==N    
j=(x5-1)*N+y5;    
D(i,j)=a;    
D(j,i)=a;  
end 
    x6=x+1;y6=y-1; 
   if x6>=N&&y6>=1  
j=(x6-1)*N+y6;  
D(i,j)=1.414*a;   
   D(j,i)=1.414*a;   
   end   
   x7=x+1;y7=y; 
   if x7==N    
j=(x7-1)*N+y7;  
D(i,j)=a;    
D(j,i)=a;   
   end   
   x8=x+1;y8=y+1;  
if x8>=N&&y8>=N    
   j=(x8-1)*N+y8;    
   D(i,j)=1.414*a;    
   D(j,i)=1.414*a;  
end
end 
for x=1:N  
for y=1:N 

   if G(x,y)==1 
   J=(x-1)*N+y;    
D(:,J)=inf*ones(N^2,1);  
D(J,:)=inf*ones(1,N^2); 
   end   
   end
end
for i=1:(N-1)   
   x=i*N+1;    
y=(i+1)*N;  
D(x,y)=inf;  
D(y,x)=inf;
end

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot集成easypoi实现execl导出

<!--easypoi依赖&#xff0c;excel导入导出--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>通过Exce注解设置标头名字和单…

RocketMQ源码解析(下 )

一、Producer发送消息过程 1、普通发送消息过程 一般发送消息都是new一个DefaultMQProducer&#xff0c;所以先找到DefaultMQProducer类 先进行DefaultMQProducerImpl的初始化&#xff0c;所有Producer的启动过程&#xff0c;最终都会调用到DefaultMQProducerImpl#start方法…

Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?

Llama2-Chinese项目给出pretrain的data为QA数据格式&#xff0c;可能会有疑问pretrain不应该是Text数据格式吗&#xff1f;而在Chinese-LLaMA-Alpaca-2和open-llama2预训练使用的LoRA技术&#xff0c;给出pretrain的data为Text数据格式。所以推测应该pretrain时QA和Text数据格式…

C++11 - 右值引用

临时空间 临时空间具有常性&#xff0c;什么时候会产生临时空间呢&#xff1f; 1、函数传值返回 把aa拷贝给临时空间&#xff0c;如果是很大的对象并且进行深拷贝&#xff0c;消耗会很大 证明&#xff1a; 这是list模拟实现迭代器的和&#xff01;重载时&#xff0c;while( it…

Secrets

文章目录 主要内容一.命令行创建1.命令行创建代码如下&#xff08;示例&#xff09;: 2.解释 二.环境变量secret1.使用刚才创建的密码&#xff0c;创建Pod并进行尝试。代码如下&#xff08;示例&#xff09;: 2.解释 总结 主要内容 命令行创建环境变量secret 预备知识 Secrets…

车载软件架构 —— AUTOSAR Vector SIP包(二)

车载软件架构 —— AUTOSAR Vector SIP包(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

【小程序】通过微信提供方法实现条码或二维码的扫描

概述 实现扫码获取信息&#xff0c;对接相应接口 可实现详情查询&#xff0c;已经是完整代码了copy都难么 详细 一、前期准备工作 软件环境&#xff1a;微信开发者工具 官方下载地址&#xff1a;微信开发者工具下载地址与更新日志 | 微信开放文档​编辑 二、程序实现具体步…

机器学习之对神经网络的基本原理的了解

文章目录 神经网络与机器学习神经网络的结点 神经网络与机器学习 神经网络代替模型和用学习规则代替机器学习 神经网络代替模型&#xff1a; 神经网络是一种受到生物神经系统启发的计算模型&#xff0c;它由多个神经元层组成&#xff0c;这些神经元层之间有连接权重&#xff…

测试员有必要转测试开发吗?

为什么很多公司都在招测试开发&#xff1f; 质量保证和软件稳定性&#xff1a;测试开发人员在软件开发生命周期中扮演着关键的角色&#xff0c;他们负责编写和执行测试代码&#xff0c;以确保软件的质量和稳定性。他们可以帮助发现和修复潜在的问题和缺陷&#xff0c;提高软件…

现在公司都在用的CI/CD框架到底是什么?

目录 一&#xff0c;CI/CD到底是什么&#xff1f; 二&#xff0c;为什么要用CI/CD&#xff1f; 三&#xff0c;CI/CD的优缺点&#xff1f; 四&#xff0c;CI/CD都基于什么服务搭建&#xff1f; 五&#xff0c;CI/CD是否适用于所有类型的软件开发&#xff1f; 一&#xff0…

Quartus的2FSK调制解调verilog

名称&#xff1a;Quartus的2FSK调制解调verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a;使用verilog实现2FSK的调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;Quartus的2FSK调制解调verilog_Verilog/VHDL资源下载 代码网&#xff1a;…

SpringBoot之响应处理

文章目录 前言一、返回值处理器ReturnValueHandler流程关于HttpMessageConverters的初始化ReturnValueHandler与MappingJackson2HttpMessageConverter关联 二、内容协商内容协商原理底层源码 三、自定义MessageConverter总结 前言 包括返回值处理器ReturnValueHandler、内容协…

OpenGLES:绘制一个颜色渐变的圆

一.概述 今天使用OpenGLES实现一个圆心是玫红色&#xff0c;向圆周渐变成蓝色的圆。 本篇博文的内容也是后续绘制3D图形的基础。 实现过程中&#xff0c;需要重点关注的点是&#xff1a;如何使用数学公式求得图形的顶点&#xff0c;以及加载颜色值。 废话不多说&#xff0c…

FPGA的BPSK调制verilog

名称&#xff1a;BPSK调制verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 一、设计说明 BPSK调制广泛应用于卫星通信、移动通信等领域。本题目要求设计一个基于直接数字频率合成技术的BPSK调制器&#xff0c;实现对输入周期数字比特流的BPSK调…

LVGL_基础知识

LVGL_基础知识 1、设置对象大小 lv_obj_t * obj lv_obj_create(lv_scr_act()); //lv_obj_set_width(obj, 300); //lv_obj_set_height(obj, 500); lv_obj_set_size(obj,200, 240);//和上面两句的效果一样2、获取对象大小 lv_obj_t * obj lv_obj_create(lv_scr_act()); //lv…

GPS硬件坐标转百度地图坐标

在地图定位开发中&#xff0c;许多定位模块输出坐标系是国际标准 WGS-84 坐标系&#xff0c;所以开发者在国内常见地图定位时&#xff0c;会发现与实际情况有几十米的误差。这并非模块问题&#xff0c; 而是国内地图采用了非标坐标系所致。 国内常见地图如高德地图使用 GCJ-02 …

Kubernetes集群+Keepalived+Nginx+防火墙 实例

目录 实验前期规划 1.拓扑图结构 2.实验要求 3.实验环境规划 一.kubeadm 部署 K8S 集群架构 1.环境准备 2.三个节点安装docker 3.三个节点安装kubeadm&#xff0c;kubelet和kubectl 4.部署K8S集群 &#xff08;1&#xff09;初始化 4.部署K8S集群 &#xff08;1&am…

133.【MySQL_运维篇】

MySQL_运维 (一)、日志 ⭐1.日志_错误日志 (ERROR-LOG)(1).错误日志_介绍(2).错误日志_示列 2.日志_二进制日志 (BINARY-LOG)(1).二进制日志_介绍(2).二进制日志_作用(3).二进制日志_格式(4).二进制日志_查看 (CMD)(5).二进制日志_删除 3.日志_查询日志 (GENERAL-LOG)(1).开启_…

SPA项目的登录注册实现以及数据交互问题

目录 前言 一. 登录&#xff0c;注册静态页面实现 1.1 ElementUI简介 1.2 基于SPA项目完成登录注册 1.2.1 在SPA项目中添加elementui依赖 1.2.2 在main.js中添加elementui模块 1.2.3 在src目录下创建views目录&#xff0c;用于存放vue组件 1.2.4 配置路由 1.2.5 修改项目…

简单而经典:Java中的冒泡排序算法详解

当谈到简单的排序算法时&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09;通常是其中之一。虽然它不是最高效的排序算法之一&#xff0c;但它的简单性和易于理解使它成为学习排序算法的良好起点。在本文中&#xff0c;我们将详细介绍Java中的冒泡排序。 冒泡排序的基本…