clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')
load map.mat
% 定义变量及参数含义
% G 环境图,是一个01矩阵,其中1代表障碍物
% 输出参数定义
% Route 存储每次迭代中每只蚂蚁所走过的路径
% paths 存储每次迭代中每只蚂蚁所走过的路径长度
% Tau 输出更新后的新信息素矩阵
% 设置迭代次数、蚂蚁数量等参数
% Tau 初始信息素矩阵
Tau = ones(1024,1024);
% K 迭代次数
K = 200;
% M 每次迭代中的蚂蚁数量
M = 30;
% S 起始点
S = 34;
% E 目标点
E = 958;
% Alpha 信息素重要性参数
Alpha = 1;
% Beta 可见度重要性参数
Beta = 15;
% Rho 信息素挥发率
Rho = 0.95;
% Q 信息素增强因子
Q = 1;
% 计算邻接矩阵D
D = func_map(G);
% 获取问题规模(像素数)
Rd = size(D,1);
% 获取环境实际尺寸(像素数)
Rg = size(G,1);
% 定义像素边长
a = 1;
% 计算目标点坐标(像素位置)
Ex = a*(mod(E,Rg)-0.5);
if Ex==-0.5
Ex=Rg-0.5;
end
Ey = a*(Rg+0.5-ceil(E/Rg));
% 初始化信息素强度矩阵Eta
Eta = zeros(1,Rd);
% 构造Eta初始化矩阵
for i=1:Rd
ix=a*(mod(i,Rg)-0.5);
if ix==-0.5
ix=Rg-0.5;
end
iy=a*(Rg+0.5-ceil(i/Rg));
if i~=E
Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
else
Eta(1,i)=100;
end
end
% 初始化路径存储单元格数组ROUTES和路径长度矩阵PL
Route = cell(K,M);
paths = zeros(K,M);
%进入迭代过程(k次迭代,每次m只蚂蚁)
for k=1:K
k
for m=1:M
%第一步:状态初始化
W = S;% 当前点设为起始点
Path = S;% 初始化已走路径
PLkm = 0;% 初始化当前路径长度
tabus = ones(1,Rd);% 初始化禁忌表
tabus(S) = 0;% 去掉起始点的禁忌标识
Dtmp = D;% 初始化邻接矩阵副本
%第二步:选择可前进的节点
% 获取当前点可达的所有节点距离
DW=Dtmp(W,:);
DW1=find(DW<inf);
% 将禁忌表中不可达节点的距离设为无穷大
for j=1:length(DW1)
if tabus(DW1(j))==0
DW(j)=inf;
end
end
% 获取可行节点集合
LJD=find(DW<inf);
% 计算可行节点数量
Len_LJD=length(LJD);
% 蚁群停止条件:抵达目标点或无法前行
while W~=E&&Len_LJD>=1
%第三步:根据信息素和可见度选择下一步节点
PP=zeros(1,Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);
end
% 构造概率分布
PP=PP/(sum(PP));
% 计算累计概率分布
Pcum=cumsum(PP);
% 依据概率选取下一个节点
Select=find(Pcum>=rand);
to_visit=LJD(Select(1));
%第四步:状态更新与记录
Path=[Path,to_visit];%更新路径
PLkm=PLkm+Dtmp(W,to_visit);%更新路径长度
W=to_visit;%移动到下一个点
for kk=1:Rd
if tabus(kk)==0
Dtmp(W,kk)=inf;
Dtmp(kk,W)=inf;
end
end
tabus(W)=0;%更新禁忌表,移除已访问节点
DW=Dtmp(W,:);%更新DW矩阵
DW1=find(DW<inf);
for j=1:length(DW1)
if tabus(DW1(j))==0
DW(j)=inf;
end
end%更新可行节点集合
LJD=find(DW<inf);
Len_LJD=length(LJD);
end
%第五步:记录本次迭代中蚂蚁的路径及其长度
%如果到达了目标点,则记录实际路径长度;否则记为无穷大
Route{k,m}=Path;
if Path(end)==E
paths(k,m)=PLkm;
else
paths(k,m)=inf;
end
end
%第六步:更新信息素矩阵
Delta_Tau=zeros(Rd,Rd);% 初始化信息素增量矩阵
for m=1:M
if paths(k,m)<inf% 若蚂蚁找到有效路径
ROUT=Route{k,m};
TS=length(ROUT)-1;% 路径中点的数量
PL_km=paths(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
meanPL=zeros(1,K);
minPL=zeros(1,K);
for i=1:K
PLK=paths(i,:);
Nonzero=find(PLK<inf);
PLKPLK=PLK(Nonzero);
meanPL(i)=mean(PLKPLK);
minPL(i)=min(PLKPLK);
end
figure(1)
plot(minPL,'r');
hold on
plot(meanPL,'b');
grid on
title('收敛曲线(平均路径长度和最短路径长度)');
xlabel('迭代次数');
ylabel('路径长度');
% 绘制蚂蚁行走路径图
figure(2)
axis([0,Rg,0,Rg])
for i=1:Rg
for j=1:Rg
if G(i,j)==1% 绘制障碍物区域
x1=j-1;y1=Rg-i;
x2=j;y2=Rg-i;
x3=j;y3=Rg-i+1;
x4=j-1;y4=Rg-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
hold on
else% 绘制无障碍区域
x1=j-1;y1=Rg-i;
x2=j;y2=Rg-i;
x3=j;y3=Rg-i+1;
x4=j-1;y4=Rg-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
hold on
end
end
end
hold on% 绘制最后一次迭代中最佳蚂蚁路径
ROUT=Route{K,M};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
Rx(ii)=a*(mod(ROUT(ii),Rg)-0.5);
if Rx(ii)==-0.5
Rx(ii)=Rg-0.5;
end
Ry(ii)=a*(Rg+0.5-ceil(ROUT(ii)/Rg));
end
plot(Rx,Ry,'r','linewidth',2)
title('最短路径');
axis([0,Rg,0,Rg]);


fpga和matlab

- 粉丝: 19w+
最新资源
- 计算机控制技术-7能观测性.ppt
- 软件工程简答题复习题(带答案)(20211215120909).pdf
- 网络营销课件教材课件汇总完整版ppt全套课件最全教学教程整本书电子讲义全书教案课件合集.ppt
- 电子商务网站数据库管理系统设计.doc
- 虚拟化技术研究课题提纲(讨论稿).docx
- WebLogic-Server-性能调优-1—管理篇(ppt文档).ppt
- 2023年小企业管理网络考试题库第九套.doc
- 数据库课程设计报告教学管理系统.doc
- 2023年历年全国计算机二级C语言题库.doc
- 换热网络优化实施方案.doc
- 巧用Excel嵌套函数速算住房公积金【会计实务操作教程】.pptx
- 网络技术基础课件.ppt
- 信息化个人工作总结.docx
- 软件工程——需求规格说明书.doc
- 计算机实习总结精选.docx
- 省医疗卫生行业信息化应用情况汇报.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


