matlab计算最短路径

matlab计算最短路径
matlab计算最短路径

湖南大学

MATLAB实训报告

题目:matlab计算最短路径问题

学院名称:信息科学与工程学院

专业班级:软件工程四班

学生姓名:彭天越

学号: 20112601416

日期:2013年7月3号

目录

题目 (2)

问题描述 (3)

(1)根据无向图A,使用Di.jistra算法 (3)

(2)根据有向图B,使用Warshall-Floyd算法 (4)

思路及代码 (4)

(1)思路 (4)

(2)源代码 (5)

测试结果说明 (10)

(1)Di.jistra算法 (10)

(2)Floyd算法 (11)

小结 (11)

题目

求下图中顶点ν1到顶点ν11的最短距离和最短路(2学分)

B.有向图

问题描述

(1)根据无向图A,使用Di.jistra算法

(2)根据有向图B,使用Warshall-Floyd算法

思路及代码

(1)思路

(1)Dijkstra算法

使用范围:

1)寻求从一固定顶点到其余各点的最短路径;

2)有向图、无向图和混合图;

3)权非负.

算法思路:

采用标号作业法,每次迭代产生一个永久标号, 从而生长一颗以v

为根的最短路树,在这颗树上每个顶点与根节点之间的路径皆为最短路径. 诉法步骤:

S: 具有永久标号的顶点集;

l(v): v的标记; f(v):v的父顶点,用以确定最短路径;

输入加权图的带权邻接矩阵w=[w(v

i ,v

j

)]

nxm

.

1)初始化令l(v

0)=0,S=Φ;? v≠v

,l(v)=∞;

2)更新l(v), f(v)

寻找不在S中的顶点u,使l(u)为最小.把u加入到S中,然后对所有不在S中的顶点v,如l(v)>l(u)+w(u,v),则更新l(v),f(v), 即l(v)←l(u)+w(u,v),f(v)←u;

3)重复步骤2), 直到所有顶点都在S中为止.

(2)Floyd算法

使用范围:

1)求每对顶点的最短路径;

2)有向图、无向图和混合图;

算法思想:

直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1), D(2), …, D(n), D(n)是图的距离矩阵, 同时引入一个后继点矩阵记录两点间的最短路径.

算法步骤:

d(i,j) : i到j的距离;

path(i,j): i到j的路径上i的后继点;

输入带权邻接矩阵a(i,j).

1)赋初值

对所有i,j, d(i,j)←a(i,j) , path(i,j)←j,k=l.

2)更新d(i,j) , path(i,j)

对所有i,j, 若d(i,k)+d(k,j)

d(i,j)←d(i,k)+d(k,j) , path(i,j)←path(i,k) , k ←k+1 3)重复2)直到k=n+1

(2)源代码

(1)Dijkstra.m文件

%计算最短路径(Dijkstra算法)

%min表示最短的距离

%path表示最短路径

%w表示邻接矩阵

%start表示开始点

%terminal表示终止点

function [min,path]=dijkstra(w,start,terminal)

n=size(w,1); %计算邻接矩阵的行数

label(start)=0; f(start)=start;

%初始化

for i=1:n

if i~=start

label(i)=inf;

end

end

s(1)=start; u=start;

%更新最短路径直到所有顶点都遍历

while length(s)

for i=1:n

ins=0;

for j=1:length(s)

if i==s(j)

ins=1;

end

end

if ins==0

v=i;

if label(v)>(label(u)+w(u,v))

label(v)=(label(u)+w(u,v));

f(v)=u;

end

end

end

%

v1=0;

k=inf;

for i=1:n

ins=0;

for j=1:length(s)

if i==s(j)

ins=1;

end

end

if ins==0

v=i;

if k>label(v)

k=label(v);

v1=v;

end

end

end

s(length(s)+1)=v1;

u=v1;

end

%求出最短距离与最短路径

min=label(terminal); path(1)=terminal;

i=1;

while path(i)~=start

path(i+1)=f(path(i));

i=i+1 ;

end

path(i)=start;

L=length(path);

path=path(L:-1:1);%循环输出路径

text01.m脚本文件进行测试

clear;

clc;

fprintf('计算最短路径(Dijkstra算法)\n');

x=[0,2,1,8,inf,inf,inf,inf,inf,inf,inf;

2,0,inf,6,1,inf,inf,inf,inf,inf,inf;

1,inf,0,7,inf,inf,9,inf,inf,inf,inf;

8,6,7,0,5,1,2,inf,inf,inf,inf;

inf,1,inf,5,0,3,inf,2,1,inf,inf;

inf,inf,inf,1,3,0,4,inf,6,inf,inf;

inf,inf,9,2,inf,4,0,inf,3,1,inf;

inf,inf,inf,inf,2,inf,inf,0,7,inf,inf;

inf,inf,inf,inf,inf,6,3,7,0,1,2;

inf,inf,inf,inf,inf,inf,1,inf,1,0,1;

inf,inf,inf,inf,inf,inf,inf,inf,2,1,0]

%x=input('输入邻接矩阵:');

start=input('输入起点:');

terminal=input('输入终点:');

fprintf('计算结果如下:');

[min,path_way]=dijkstra(x,start,terminal)

Floyd.m函数

%计算最短路径(Floyd算法)

%[D,path,min1,path1]=floyd(a,start,terminal)返回矩阵D, path; 并返回start与terminal之间的最短距离min1和最短路径path1.

%path(i,j): 表示i到j的路径上i的后继点;

%D(i,j) : 表示i到j的距离;

%输入带权邻接矩阵a(i,j).

%1)赋初值

% 对所有i,j, D(i,j)<-a(i,j) , path(i,j)<-j

%2)更新D(i,j) , path(i,j)

% 对所有i,j, 若D(i,k)+D(k,j)

% D(i,j)<-D(i,k)+D(k,j) , path(i,j)<-path(i,k) , k<-k+1 %3)重复2)直到k=n+1

function [D,path,min1,path1]=floyd(a,start,terminal)

D=a;

n=size(D,1);

path=zeros(n,n);%初始化

for i=1:n

for j=1:n

if D(i,j)~=inf

path(i,j)=j;

end

end

end

for k=1:n

for i=1:n

for j=1:n

if D(i,k)+D(k,j)

D(i,j)=D(i,k)+D(k,j);

path(i,j)=path(i,k);

end

end

end

end

if nargin==3%参数个数为3的时候执行

min1=D(start,terminal);%最短距离

m(1)=start;

i=1;

path1=[ ]; %计算最短路径

while path(m(i),terminal)~=terminal

k=i+1;

m(k)=path(m(i),terminal);

i=i+1;

end

m(i+1)=terminal;

path1=m;

end

text02.m脚本文件,进行测试

clear;

clc;

fprintf('计算最短路径(Floyd算法)\n');

x=[0,2,inf,8,inf,inf,inf,inf,inf,inf,inf; inf,0,inf,6,1,inf,inf,inf,inf,inf,inf;

1,inf,0,inf,inf,inf,9,inf,inf,inf,inf;

inf,inf,7,0,inf,inf,inf,inf,inf,inf,inf;

inf,inf,inf,5,0,inf,inf,inf,1,inf,inf;

inf,inf,inf,1,3,0,4,inf,inf,inf,inf;

inf,inf,inf,2,inf,inf,0,inf,3,1,inf;

inf,inf,inf,inf,2,inf,inf,0,inf,inf,inf;

inf,inf,inf,inf,inf,6,inf,7,0,inf,inf;

inf,inf,inf,inf,inf,inf,inf,inf,1,0,1;

inf,inf,inf,inf,inf,inf,inf,inf,2,inf,0]

%x=input('输入邻接矩阵:');

start=input('输入起点:');

terminal=input('输入终点:');

fprintf('计算结果如下:');

[D,path,min,path_way]=floyd(x,start,terminal)

测试结果说明

(1)Di.jistra算法

根据无向图A,可以知道matlab计算出来的结果是正确的

(2)Floyd算法

根据有向图B,可以知道matlab计算出来的结果是正确的

小结

Matlab现在的发展已经使其成为一种集数值运算、符号运算、数据可视化、图形界面设计、程序设计、仿真、图像处理、电路设计等多种功能于一体的集成化软件,在矩阵方面等处理占据很大的优势,图论中的很多问题均能通过matlab 来解决,方便而高效,比如哥尼斯堡七桥问题,连通性邻接矩阵等概念的提出,更便于解决图论中的计算最短路径的问题,要熟练掌握一门语言,乃至精通就必须要多练多动手自己多思考,然后要懂得充分的利用可靠资源!

最短路径的Dijkstra算法及Matlab程序

两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )}()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

最短路径算法_matlab程序[1]

算法描述: 输入图G,源点v0,输出源点到各点的最短距离D 中间变量v0保存当前已经处理到的顶点集合,v1保存剩余的集合 1.初始化v1,D 2.计算v0到v1各点的最短距离,保存到D for each i in v0;D(j)=min[D(j),G(v0(1),i)+G(i,j)] ,where j in v1 3.将D中最小的那一项加入到v0,并且从v1删除这一项。 4.转到2,直到v0包含所有顶点。 %dijsk最短路径算法 clear,clc G=[ inf inf 10 inf 30 100; inf inf 5 inf inf inf; inf 5 inf 50 inf inf; inf inf inf inf inf 10; inf inf inf 20 inf 60; inf inf inf inf inf inf; ]; %邻接矩阵 N=size(G,1); %顶点数 v0=1; %源点 v1=ones(1,N); %除去原点后的集合 v1(v0)=0; %计算和源点最近的点 D=G(v0,:); while 1 D2=D; for i=1:N if v1(i)==0 D2(i)=inf; end end D2 [Dmin id]=min(D2); if isinf(Dmin),error,end v0=[v0 id] %将最近的点加入v0集合,并从v1集合中删除 v1(id)=0; if size(v0,2)==N,break;end %计算v0(1)到v1各点的最近距离 fprintf('计算v0(1)到v1各点的最近距离\n');v0,v1 id=0; for j=1:N %计算到j的最近距离 if v1(j)

MATLAB实验报告-遗传算法解最短路径以及函数最小值问题

硕士生考查课程考试试卷 考试科目:MATLAB教程 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:20 年月日午时至时

《MATLAB教程》试题: A、利用MATLAB设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。 a c d e f h i k 1 2 1 6 8 3 1 7 9 4 6 7 2 9 4 2 1 1 B、设计遗传算法求解f(x)极小值,具体表达式如下: 要求必须使用m函数方式设计程序。 C、利用MATLAB编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D、结合自己的研究方向选择合适的问题,利用MATLAB进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: A 一、问题分析(10分) 1 2 3 4 5 6 8 9 10 11 1 2 1 6 8 3 1 7 9 4 6 7 2 9 4 2 1 1 如图如示,将节点编号,依次为 1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为: 0 2 8 1 500 500 500 500 500 500 500 2 0 6 500 1 500 500 500 500 500 500 8 6 0 7 500 1 500 500 500 500 500 1 500 7 0 500 500 9 500 500 500 500 500 1 500 500 0 3 500 2 500 500 500 500 500 1 500 3 0 4 500 6 500 500 500 500 500 9 500 4 0 500 500 1 500 500 500 500 500 2 500 500 0 7 500 9 500 500 500 500 500 6 500 7 0 1 2 500 500 500 500 500 500 1 500 1 0 4 500 500 500 500 500 500 500 9 2 4 0 注:为避免计算时无穷大数吃掉小数,此处为令inf=500。 问题要求求出任意两点间的最短路径,Floyd算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入for循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算i到j的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。二、实验原理与数学模型(20分) 实现原理为遗传算法原理: 按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。 数学模型如下: 设图由非空点集合和边集合组成,其中 又设的值为,故可表示为一个三元组 则求最短路径的数学模型可以描述为:

用matlab实现寻找最短路

用matlab寻找赋权图中的最短路中的应用 1引言 图论是应用数学的一个分支,它的概念和结果来源都非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的格尼斯堡七桥问题,以及在民间广泛流传的一些游戏的难题,如迷宫问题,博弈问题等。这些古老的难题,吸引了很多学者的注意。 1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出很大的作用。在实践中,图论已成为解决自然科学,工程技术,社会科学,军事等领域中许多问题的有力工具之一。 最短路问题是图论理论中的经典问题,寻找最短路径就是在指定网络中两节点间找一条距离最小的路。 2 最短路 2.1 最短路的定义(short-path problem) 对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图()0 w≥的有效算法是由荷兰著名计算机专家E.W.Dijkstra在1959年首次提出的,该算法ij 能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短路。后来海斯在Dijkstra算法的基础之上提出了海斯算法。但这两种算法都不能解决含有负权的图的最短路问题。因此由Ford提出了Ford算法,它能有效地解决含有负权的最短路问题。但在

现实生活中,我们所遇到的问题大都不含负权,所以我们在()0ij w≥的情况下选择Dijkstra算法。 若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源 节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决 的典型问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管路铺设、线 路安装、厂区布局和设备更新等,而且经常被作为一个基本的工具,用于解决其他的 做优化问题。 定义1:若图G=G(V,E)中个边[v i ,v j]都赋有一个实数w ij ,则称这样的图G 为赋权图,w ij 称为边[v i ,v j]上的权。 定义2:给定一个赋权有向图,即给一个有向图D=(V,A),对每一个弧a=(v i ,v j),相应地有权w(a)=w ij,又给定D中的两个顶点v s ,v t 。设P是D中从v s 到v t 的一条路,定义路P的权是P中所有弧的权之和,记为w(P)。最短路问题就是要在所有从v s到v t 的路中,求一条权最小的路,即求一条从v s到v t 的路P0 ,使w(P0)= min w(P) P 式中对D中所有从v s到v t 的路P最小,称P0 是从v s到v t 的最短路。 2.2 最短路问题算法的基本思想及其基本步骤 在求解网络图上节点间最短路径的方法中,目前国内外一致公认的比较好的算法有Dijkstra和Floyd算法。这两种算法,网络被抽象为一个图论中定义的有向图或无向图,并利用图的节点邻接矩阵记录点的关联信息。在进行图的遍历搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,知道获得最后的优化路径。鉴于课本使用Dijkstra算法,下面用Floyd算法进行计算: 设A=(a)n*n 为赋权图G=(V,E,F)的矩阵,当V i V j ∈E时,a ij =F(v i,v j),否则,取a ij =0,a ij =+∞(i≠j),d ij 表示从v i到v j 的点的距离,r ij 表示从v i到v j 的点的最短路中的一个点的编号。 ①赋初值。对所有i,j,d ij = a ij ,r ij =j,k=1,转向②; ②更新d ij ,r ij ,对所有i,j,若d ik + d kj < d ij ,则令d ij = d ik + d kj ,r ij =k,转向; ③终止判断。若d ij <0,则存在一条含有顶点v i的负回路,终止;或者k=n,终止;否则, 另k=k+1,转向②。 最短路线可由r ij得到。

基于遗传算法的最短路径问题及其MATLAB实现

TRANSPOWORLD 2009 No.12 (Jun) 104前言 在现实生活中,我们经常遇到最短路问题,例如寻找两点之间总长度最短或者费用最低的路径。在运输、物流、设施选址以及人员调度问题中,最短路径是很常见的问题。解决最短路问题的方法有很多,例如迪杰斯特拉算法、福特算法。在这里我们介绍基于遗传算法的最短路径问题的解决方案。 模型 遗传算法基本模型 遗传算法是模仿生物进化过程,针对复杂问题开发出来的非常有效的方 基于遗传算法的最短路径问题及其MATLAB 实现 文/张书源 郭 聪 法。根据生物进化过程中的选择机制,在问题的解空间中进行选择,实现“物竞天择,适者生存”。在遗传算法中,一条染色体代表问题的一个可行解,该染色体的适应值即为对应于该可行解的函数值。一般来说,遗传算法包括以下几个主要组成部分。编码 即将问题的解表示成一个编码串(染色体),每一染色体对应问题的一 个解。遗传过程 对染色体进行操作,以产生新的染色体,通常有不同染色体之间的交叉 操作以及一条染色体的变异操作。评价与选择 对每条染色体计算其适应值,用以评价染色体的优劣,从而从父代和子代中选择较优的染色体,进入下一代的繁殖。 初试种群的创建方法 其作为问题可行解的集合。初始种群中染色体个数称为种群规模。 遗传算法的流程图如图1所示。算法过程如下: 第一步初始化种群p(t);第二步对种群进行评价; 第三步利用交叉和变异重组p(t)以产生c(t) 第四步评价c(t),从p(t)和c(t)选择出p(t+1),令t=t+1;若达到繁殖代数,转第五步;否则,回第四步; 第五步返回结果。 问题描述 在图2所示的算例中,我们要找到从节点①到节点⑨的最短路径。基于优先权的编码方式 例如,一条可能的染色体如表1。路径生长 路径生长即为根据一条染色体来得到其对应的一条路。在表1的例子中,路径生长的过程如下: 初试路径上只有节点①; 与①相连且不在当前路径上的节点有②和③,其中节点③的权较大,为6,将节点③加入当前路径,当前路径变为:①—③; 与③相连且不在当前路径上的节 点有④和⑤,其中节点⑤的权较大,为 图2 C OLUMNS 特别企划

最短路径法射线追踪的MATLAB实现

最短路径法射线追踪的MATLAB 实现 李志辉 刘争平 (西南交通大学土木工程学院 成都 610031) 摘 要:本文探讨了在MA TLAB 环境中实现最短路径射线追踪的方法和步骤,并通过数值模拟演示了所编程序在射线追踪正演计算中的应用。 关键词:最短路径法 射线追踪 MATLAB 数值模拟 利用地震初至波确定近地表介质结构,在矿产资源的勘探开发及工程建设中有重要作用。地震射线追踪方法是研究地震波传播的有效工具,目前常用的方法主要有有限差分解程函方程法和最小路径法。最短路径方法起源于网络理论,首次由Nakanishi 和Yamaguchi 应用域地震射线追踪中。Moser 以及Klimes 和Kvasnicha 对最短路径方法进行了详细研究。通过科技人员的不断研究,最短路径方法目前已发展较为成熟,其基本算法的计算程序也较为固定。 被称作是第四代计算机语言的MA TLAB 语言,利用其丰富的函数资源把编程人员从繁琐的程序代码中解放出来。MA TLAB 用更直观的、符合人们思维习惯的代码,为用户提供了直观、简洁的程序开发环境。本文介绍运用Matlab 实现最短路径法的方法和步骤,便于科研院校教学中讲授、演示和理解最短路径方法及其应用。 1 最短路径法射线追踪方法原理 最短路径法的基础是Fermat 原理及图论中的最短路径理论。其基本思路是,对实际介质进行离散化,将这个介质剖分成一系列小单元,在单元边界上设置若干节点,并将彼此向量的节点相连构成一个网络。网络中,速度场分布在离散的节点上。相邻节点之间的旅行时为他们之间欧氏距离与其平均慢度之积。将波阵面看成式由有限个离散点次级源组成,对于某个次级源(即某个网格节点),选取与其所有相邻的点(邻域点)组成计算网格点;由一个源点出发,计算出从源点到计算网格点的透射走时、射线路径、和射线长度;然后把除震源之外的所有网格点相继当作次级源,选取该节点相应的计算网格点,计算出从次级源点到计算网格点的透射走时、射线路径、和射线长度;将每次计算出来的走时加上从震源到次级源的走时,作为震源点到该网格节点的走时,记录下相应的射线路径位置及射线长度。 图1 离散化模型(星点表示震源或次级震源,空心点为对应计算网格点) 根据Fermat 原理逐步计算最小走时及射线方向。设Ω为已知走时点q 的集合,p 为与其相邻的未知走时点,tq 分别和p 点的最小走时,tqp 为q 至p 最小走时。r 为p 的次级源位置,则 )}(min :{qp q P t t t q r q +==Ω ∈ 根据Huygens 原理,q 只需遍历Q 的边界(即波前点),当所有波前邻点的最小走时都求出时,这些点又成为新的波前点。应用网络理论中的最短路径算法,可以同时求出从震源点传至所有节点之间的连线近似地震射线路径。 2 最短路径法射线追踪基本算法步骤 把网格上的所有节点分成集合p 和q ,p 为已知最小旅行时的结点总数集合,q 为未知最小旅行时的节点的集合。若节点总数为n ,经过n 次迭代后可为求出所有节点的最小旅行时。过程如下: 1) 初始时 q 集合包含所有节点,除震源s 的旅行时已知为ts =0外,其余所有节点的旅行时均为ti =(i 属于Q 但不 等于s )。P 集合为空集。 2) 在Q 中找一个旅行时最小的节点i ,它的旅行时为ti ; 3) 确定与节点i 相连的所有节点的集合V ; 4) 求节点j (j 属于V 且j 不属于P )与节点i 连线的旅行时dtij ; 5) 求节点j ()的新旅行时tj (取原有旅行时tj 与tj +dtij 的最小值); 6) 将i 点从Q 集合转到P 集合; 7) 若P 集合中的节点个数小于总节点数N ,转2,否则结束旅行时追踪; 8) 从接收点开始倒推出各道从源点道接收点的射线路径,只要每个节点记下使它形成最小旅行时的前一个节点号,

matlab 蚁群算法 机器人路径优化问题

用ACO 算法求解机器人路径优化问题 4.1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则(如最小能量消耗,最短行走路线,最短行走时间等),在其工作空间中找到一条从起始状态到目标状态的能避开障碍物的最优路径。机器人路径规划问题可以建模为一个有约束的优化问题,都要完成路径规划、定位和避障等任务。 4.2 算法理论 蚁群算法(Ant Colony Algorithm,ACA),最初是由意大利学者Dorigo M. 博士于1991 年首次提出,其本质是一个复杂的智能系统,且具有较强的鲁棒性,优良的分布式计算机制等优点。该算法经过十多年的发展,已被广大的科学研究人员应用于各种问题的研究,如旅行商问题,二次规划问题,生产调度问题等。但是算法本身性能的评价等算法理论研究方面进展较慢。 Dorigo 提出了精英蚁群模型(EAS),在这一模型中信息素更新按照得到当前最优解的蚂蚁所构造的解来进行,但这样的策略往往使进化变得缓慢,并不能取得较好的效果。次年Dorigo 博士在文献[30]中给出改进模型(ACS),文中 改进了转移概率模型,并且应用了全局搜索与局部搜索策略,来得进行深度搜索。 Stützle 与Hoos给出了最大-最小蚂蚁系统(MAX-MINAS),所谓最大-最小即是为信息素设定上限与下限,设定上限避免搜索陷入局部最优,设定下限鼓励深度搜索。 蚂蚁作为一个生物个体其自身的能力是十分有限的,比如蚂蚁个体是没有视觉的,蚂蚁自身体积又是那么渺小,但是由这些能力有限的蚂蚁组成的蚁群却可以做出超越个体蚂蚁能力的超常行为。蚂蚁没有视觉却可以寻觅食物,蚂蚁体积渺小而蚁群却可以搬运比它们个体大十倍甚至百倍的昆虫。这些都说明蚂蚁群体内部的某种机制使得它们具有了群体智能,可以做到蚂蚁个体无法实现的事情。经过生物学家的长时间观察发现,蚂蚁是通过分泌于空间中的信息素进行信息交流,进而实现群体行为的。 下面简要介绍蚁群通过信息素的交流找到最短路径的简化实例。如图 2-1 所示,AE 之间有

蚁群算法最短路径通用Matlab程序(附图)

蚁群算法最短路径通用Matlab程序(附图) function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% --------------------------------------------------------------- % ACASP.m % 蚁群算法动态寻路算法 % ChengAihua,PLA Information Engineering University,ZhengZhou,China % Email:aihuacheng@https://www.360docs.net/doc/b38436561.html, % All rights reserved %% --------------------------------------------------------------- % 输入参数列表 % G 地形图为01矩阵,如果为1表示障碍物 % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素) % K 迭代次数(指蚂蚁出动多少波) % M 蚂蚁个数(每一波蚂蚁有多少个) % S 起始点(最短路径的起始点) % E 终止点(最短路径的目的点) % Alpha 表征信息素重要程度的参数 % Beta 表征启发式因子重要程度的参数 % Rho 信息素蒸发系数 % Q 信息素增加强度系数 % % 输出参数列表 % ROUTES 每一代的每一只蚂蚁的爬行路线 % PL 每一代的每一只蚂蚁的爬行路线长度 % Tau 输出动态修正过的信息素 %% --------------------变量初始化---------------------------------- %load D=G2D(G); N=size(D,1);%N表示问题的规模(象素个数) MM=size(G,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(1,N);%启发式信息,取为至目标点的直线距离的倒数 %下面构造启发式信息矩阵 for i=1:N if ix==-0.5

最短路径matlab计算机仿真

计算机仿真期末作业 姓名:吴隐奎 班级:04601 学号:041751 日期:2007-6-15 题目:Floyd 算法实现和分析 内容:用MATLAB 仿真工具实现Floyd 算法,求任意两端间的最短路径。 要求:尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法结果验证;分别用以下两个图(用初始距离矩阵表示)进行算法验证: 图一:(0)0 100 100 1.2 9.2 100 0.5100 0 100 5 100 3.1 2100 100 0 100 100 4 1.51.2 5 100 0 6.7 100 1009.2 100 100 6.7 0 15.6 100100 3.1 4 100 15.6 0 1000.5 2 1.5 100 100 100 0]W ??????????=???????????? 图二:(0) 0 0.5 2 1.5 100 100 1000.5 0 100 100 1.2 9.2 1002 100 0 100 5 100 3.11.5 100 100 0 100 100 4100 1.2 5 100 0 6.7 100100 9.2 100 100 6.7 0 15.6100 100 3.1 4 100 15.6 0W ??????????=???????????? 算法:给定图G 及其边(,)i j 的权,(1,1)i j w i n j n ≤≤≤ ≤ F0:初始化距离矩阵(0)W 和路由矩阵(0)R 。其中: (0)0ij ij ij ij w e E w e E i j ∈??=∞???=? 若(有边) 若(无边) 若(对角线元素) (0)(0)w 0,ij ij j r ?≠∞=?? 若 其它 F1:已求得(-1)k W 和(-1)k R ,依据下面的迭代求()k W 和()k R ()(1)(1)(-1),,,,min(,)k k k k i j i j i k k j w w w w --=+

MATLAB解决最短路径问题代码

默认是Dijkstra 算法 是有权的, 我想如果把权都赋1的话, 就相当于没权的了 参数是带权的稀疏矩阵及结点 看看这两个例子(一个有向一个无向), 或许你能找到你想知道的 % Create a directed graph with 6 nodes and 11 edges W = [.41 .99 .51 .32 .15 .45 .38 .32 .36 .29 .21]; %这是权 DG = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W) %有权的有向图 h = view(biograph(DG,[],'ShowWeights','on')) %画图, 这个好玩 % Find shortest path from 1 to 6 [dist,path,pred] = graphshortestpath(DG,1,6) %找顶点1到6的最短路径 % Mark the nodes and edges of the shortest path set(h.Nodes(path),'Color',[1 0.4 0.4]) %上色 edges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); set(edges,'LineColor',[1 0 0]) %上色 set(edges,'LineWidth',1.5) %上色 下面是无向图的例子 % % Solving the previous problem for an undirected graph % UG = tril(DG + DG') % h = view(biograph(UG,[],'ShowArrows','off','ShowWeights','on')) % % Find the shortest path between node 1 and 6 % [dist,path,pred] = graphshortestpath(UG,1,6,'directed',false) % % Mark the nodes and edges of the shortest path % set(h.Nodes(path),'Color',[1 0.4 0.4]) % fowEdges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); % revEdges = getedgesbynodeid(h,get(h.Nodes(fliplr(path)),'ID')); % edges = [fowEdges;revEdges]; % set(edges,'LineColor',[1 0 0]) % set(edges,'LineWidth',1.5) clc;close all; clear; load data; % global quyu; quyu = [2,3];%一片区域 z_jl = lxjl(jdxx,lxxh);%计算路线的距离 z = qyxz(jdxx,quyu,z_jl); % 根据节点信息,从z中将y区域的节点和路线选出所有点的信息 hzlx(z); %绘制Z的图像

蚁群算法最短路径matlab程序

蚁群算法最短路径通用Matlab程序 下面的程序是蚁群算法在最短路中的应用,稍加扩展即可应用于机器人路径规划 function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% ---------------------------------------------------------------% ACASP.m % 蚁群算法动态寻路算法 % ChengAihua,PLA Information Engineering University,ZhengZhou,China % Email:aihuacheng@https://www.360docs.net/doc/b38436561.html, % All rights reserved %% ---------------------------------------------------------------% 输入参数列表 % G 地形图为01矩阵,如果为1表示障碍物 % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素) % K 迭代次数(指蚂蚁出动多少波) % M 蚂蚁个数(每一波蚂蚁有多少个) % S 起始点(最短路径的起始点) % E 终止点(最短路径的目的点) % Alpha 表征信息素重要程度的参数 % Beta 表征启发式因子重要程度的参数 % Rho 信息素蒸发系数 % Q 信息素增加强度系数 % % 输出参数列表 % ROUTES 每一代的每一只蚂蚁的爬行路线 % PL 每一代的每一只蚂蚁的爬行路线长度 % Tau 输出动态修正过的信息素 %% --------------------变量初始化---------------------------------- %load D=G2D(G); N=size(D,1);%N表示问题的规模(象素个数) MM=size(G,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(1,N);%启发式信息,取为至目标点的直线距离的倒数 %下面构造启发式信息矩阵 for i=1:N if ix==-0.5 ix=MM-0.5;

最短路径问题matlab求解详尽版

最短路径问题m a t l a b 求解详尽版 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

MATLAB 求最短路径 利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助Examples: S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量 W=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; %边权值向量,有向图, G(9,9)=0; 9个节点 G=sparse(S,E,W); %关联矩阵的稀疏矩阵表示 G(9,9)=0; P=biograph(G,[],'ShowWeights','on');%建立有向图对象P H=view(P);%显示各个路径权值 [Dist,Path]=graphshortestpath(G,1,9,'Method','Dijkstra') %求节点1到节点9的最短路径 set(Path),'Color',[1 ]);%以下三条语句用红色修饰最短路径edges=getedgesbynodeid(H,get(Path),'ID')); set(edges,'LineColor',[1 0 0]); set(edges,'LineWidth',; %以下是运行结果,节点1到节点9的最短路径为19 Dist = 19 Path =

1 3 4 5 7 9 利用graphallshortestpaths可以求出所有最短路径Dists=graphallshortestpaths(G) %求所有最短路径Dists = 0 1 2 5 9 6 16 12 19 Inf 0 Inf 6 10 8 17 13 20 Inf Inf 0 3 7 4 14 10 17 Inf Inf Inf 0 4 2 11 7 14 Inf Inf Inf Inf 0 Inf 7 Inf 10 Inf Inf Inf Inf Inf 0 Inf 7 15 Inf Inf Inf Inf Inf Inf 0 Inf 3 Inf Inf Inf Inf Inf Inf Inf 0 10

§19利用Matlab编程计算最短路径及中位点选址

139 §19. 利用Matlab 编程计算最短路径及中 位点选址 1、最短路问题 两个指定顶点之间的最短路径。 例如,给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )} ()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令

140 } {11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

网络计划流程图运用MATLAB确定关键线路的方法

运用Floyd 算法及MATLAB 编程确定网络计 划图关键线路的方法 古雨鑫 (西南科技大学四川绵阳 621000) 摘要:关键线路的确定对工程有着重要的意义,同时也是目前常用的一种工程项目进度控制的计划方法,本文通过运用Floyd 算法,以及MATLAB 编程对矩阵的处理能力,本文给出了两种确定关键线路的方法,可以简单方便的确定网络图中的关键线路。 关键词:MATLAB ,网络流程图,Floyd 算法,关键线路 1 基本理论 1.1基本概念 工程中一项工作从开始到完成需要的时间和资源,在网络图中一般用箭线表示,箭尾表示工作的开始,而箭头表示工作的结束,工作的代号(或名称)一般写在箭线的上方,工作的所需要消耗的时间(资源)一般写在箭线的下方,除此以外,还有不消耗资源和时间的虚工作(一般用虚线表示,只与工作有逻辑关系),紧接着前一项的工作称为紧前工作,紧接着后一项的工作称为紧后工作。 节点指紧前工作和紧后工作的交点,并附有数码(工程中箭头的数码必须大于箭尾的数码)。 关键线路指的是工程中从起始节点到最后节点的所要经过的最长线路。 1.2 确定关键线路的意义 现代工程的特点是规模巨大,对时间,资源,资源都有严格的要求,而关键线路更是直接决定工程的总工期,对工程的控制起到了重要的作用,找出关键线路在工程中有着重要的实际意义,对工程的控制有着决定的影响。 2 确定工程项目的MATLAB 算法方法 2.1采用Floyd 算法对关键线路的确定 Floyd 算法的基本思想是递推产生一个矩阵序列1 k ,,,,n A A A ,其中矩阵k A 的第i 行第j 列元素k (,)A i j 表示是从顶点i V 到顶点j V 的路径上所经过的顶点序号不大于k 的最短路径

暴强Dijkstra算法求任意两点间最短路径(matlab程序)

效果展示: 开头输入的是点的序列号(表示第几个点),显示的是最短路径的走法(同样以点的序列号显示,表示途径的第几个点)。 %编写m文件 function [distance,path]=dijkstra(A,s,e) % [DISTANCE,PA TH]=DIJKSTRA(A,S,E) % returns the distance and path between the start node and the end node. % % A: adjcent matrix % s: start node % e: end node % initialize n=size(A,1); % node number

D=A(s,:); % distance vector path=[]; % path vector visit=ones(1,n); % node visibility visit(s)=0; % source node is unvisible parent=zeros(1,n); % parent node % the shortest distance for i=1:n-1 % BlueSet has n-1 nodes temp=zeros(1,n); count=0; for j=1:n if visit(j) temp=[temp(1:count) D(j)]; else temp=[temp(1:count) inf]; end count=count+1; end [value,index]=min(temp); j=index; visit(j)=0; for k=1:n if D(k)>D(j)+A(j,k) D(k)=D(j)+A(j,k); parent(k)=j; end end end distance=D(e); % the shortest distance path if parent(e)==0 return; end path=zeros(1,2*n); % path preallocation t=e; path(1)=t; count=1; while t~=s && t>0 p=parent(t); path=[p path(1:count)]; t=p; count=count+1; end if count>=2*n error(['The path preallocation length is too short.',... 'Please redefine path preallocation parameter.']);

基于matlab的floyd算法+matlab计算最短路径

基于matlab的floyd算法 matlab计算最短路径 function [d,path]=floyd(a,sp,ep) % floyd - 最短路问题 % % Syntax: [d,path]=floyd(a,sp,ep) % % Inputs: % a - 距离矩阵是指i到j之间的距离,可以是有向的 % sp - 起点的标号 % ep - 终点的标号 % % Outputs: % d - 最短路的距离 % path - 最短路的路径 % a =[ 0 50 inf; 50 0 15 ; Inf 15 0 ];% a(i,j),从节点i到j之间的距离 % [d,path]=floyd(a,2,5) sp=3; ep=1; n=size(a,1); D=a; path=zeros(n,n); for i=1:n for j=1:n

if D(i,j)~=inf path(i,j)=j; %j是i的后续点 end end end for k=1:n for i=1:n for j=1:n if D(i,j)>D(i,k)+D(k,j) D(i,j)=D(i,k)+D(k,j); path(i,j)=path(i,k); end end end end p=[sp]; mp=sp; for k=1:n if mp~=ep d=path(mp,ep); p=[p,d]; mp=d; end end d=D(sp,ep) path=p

试计算下图的最短路径, 1.起点C点,终点A点。 2.起点A点,终点G点。 3.起点D点,终点F点。 试计算下图的最短路径, 1.起点F点,终点A点。 2. 起点E点,终点C点。

MATLAB实验报告-遗传算法解最短路径以及函数最小值问题

硕士生考查课程考试试卷 考试科目: MATLAB教程 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师 (签名) 考试日期:20 年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。 a d e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 3 21231(,,)5.12 5.12,1,2,3 i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: A 一、问题分析(10分) 1 4 10 11 如图如示,将节点编号,依次为1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为: 0 2 8 1 500 500 500 500 500 500 500 2 0 6 500 1 500 500 500 500 500 500 8 6 0 7 500 1 500 500 500 500 500 1 500 7 0 500 500 9 500 500 500 500 500 1 500 500 0 3 500 2 500 500 500 500 500 1 500 3 0 4 500 6 500 500 500 500 500 9 500 4 0 500 500 1 500 500 500 500 500 2 500 500 0 7 500 9 500 500 500 500 500 6 500 7 0 1 2 500 500 500 500 500 500 1 500 1 0 4 500 500 500 500 500 500 500 9 2 4 0 注:为避免计算时无穷大数吃掉小数,此处为令inf=500。 问题要求求出任意两点间的最短路径,Floyd 算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入for 循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算i 到j 的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。 二、实验原理与数学模型(20分) 实现原理为遗传算法原理: 按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。 数学模型如下: 设图G 由非空点集合12{,...}n V V V V = 和边集合12{,...}m E e e e = 组成,其中 121221(,)e ,P ,)(P ,P ),i i i i i i i i e P P E P =∈≠且若(则G 为一个有向图; 又设i e 的值为 i a ,12{,...},m A a a a = 故G 可表示为一个三元组{,,}G P E A = 则求最短路径的数学模型可以描述为:

相关文档
最新文档