查看: 14810|回复: 16|关注: 0

[已答复] matlab搜索图中任意两点间所有路径的matlab程序

[复制链接]

新手

5 麦片

财富积分


050


1

主题

1

帖子

0

最佳答案
发表于 2012-11-5 22:04:19 | 显示全部楼层 |阅读模式
function possiablePaths = findPath(Graph, partialPath, destination, partialWeight)
% findPath按深度优先搜索所有可能的从partialPath出发到destination的路径,这些路径中不包含环路
% Graph: 路网图,非无穷或0表示两节点之间直接连通,矩阵值就为路网权值
% partialPath: 出发的路径,如果partialPath就一个数,表示这个就是起始点
% destination: 目标节点
% partialWeight: partialPath的权值,当partialPath为一个数时,partialWeight为0
pathLength = length(partialPath);
lastNode = partialPath(pathLength); %得到最后一个节点
nextNodes = find(0<Graph(lastNode,:) & Graph(lastNode,:)<inf); %根据Graph图得到最后一个节点的下一个节点
GLength = length(Graph);
possiablePaths = [];
if lastNode == destination
% 如果lastNode与目标节点相等,则说明partialPath就是从其出发到目标节点的路径,结果只有这一个,直接返回
possiablePaths = partialPath;
possiablePaths(GLength + 1) = partialWeight;
return;
elseif length( find( partialPath == destination ) ) ~= 0
return;
end
%nextNodes中的数一定大于0,所以为了让nextNodes(i)去掉,先将其赋值为0
for i=1:length(nextNodes)
if destination == nextNodes(i)
  %输出路径
  tmpPath = cat(2, partialPath, destination);      %串接成一条完整的路径
  tmpPath(GLength + 1) = partialWeight + Graph(lastNode, destination); %延长数组长度至GLength+1, 最后一个元素用于存放该路径的总路阻
  possiablePaths( length(possiablePaths) + 1 , : ) = tmpPath;
  nextNodes(i) = 0;
elseif length( find( partialPath == nextNodes(i) ) ) ~= 0
  nextNodes(i) = 0;
end
end
nextNodes = nextNodes(nextNodes ~= 0); %将nextNodes中为0的值去掉,因为下一个节点可能已经遍历过或者它就是目标节点
for i=1:length(nextNodes)
tmpPath = cat(2, partialPath, nextNodes(i));
tmpPsbPaths = findPath(Graph, tmpPath, destination, partialWeight + Graph(lastNode, nextNodes(i)));
possiablePaths = cat(1, possiablePaths, tmpPsbPaths);
end
%输入桐乡到富阳的高速公路网络图的边权矩阵
a=[0,62,66,inf,inf,inf,inf;
      62,0,inf,25,11,inf,inf;
      66,inf,0,9,inf,inf,49;
      inf,25,9,0,11,14,inf;
      inf,11,inf,11,0,13,inf;
      inf,inf,inf,14,13,0,35.8;
      inf,inf,49,inf,inf,35.8,0;];
%调用搜索图中任意两点间所有路径的M文件
findPath(a, 1, 7, 0)

这代码run不出结果 为什么????

论坛优秀回答者

1532

主题

1万

帖子

482

最佳答案
QQ
  • 关注者: 5337
发表于 2012-11-6 06:44:39 | 显示全部楼层
为了他人能尽快帮助你,我已经简单修改了你的帖子,希望你以后发帖时注意查看发帖帮助:


                               
登录/注册后可看大图
math (博士、教授)Email: iLoveMATLAB@gmail.com     QQ: 1023785467
我在网络上的言论、见解等只代表我个人的观念,与任何研究机构、商业公司等无关。欢迎你通过任何方式与我探讨学术和技术上的问题(学生提问的话,请在论坛上发帖提问)。最新日志: 专程去北京拜访宋知用老师

论坛优秀回答者

1532

主题

1万

帖子

482

最佳答案
QQ
  • 关注者: 5337
发表于 2012-11-6 06:45:46 | 显示全部楼层
直接给出你的错误信息,或者使用最短代码-错误重现的方式来提问,没有多少人有时间帮你debug程序,尤其是函数,因为我们根本就没有函数所需要的输入参数来测试。
math (博士、教授)Email: iLoveMATLAB@gmail.com     QQ: 1023785467
我在网络上的言论、见解等只代表我个人的观念,与任何研究机构、商业公司等无关。欢迎你通过任何方式与我探讨学术和技术上的问题(学生提问的话,请在论坛上发帖提问)。最新日志: 专程去北京拜访宋知用老师

新手

5 麦片

财富积分


050


0

主题

2

帖子

0

最佳答案
发表于 2012-11-15 17:32:27 | 显示全部楼层
我也在网上下载了这个程序,跟楼主一样的结果,他那个程序运行不报错,就是不出来结果啊。。

新手

5 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
发表于 2013-3-13 11:49:56 | 显示全部楼层
楼上各位解决了吗?
我最近也要做这个,也出现问题了,我运行程序还报错呢。。
错误信息:
Error using findPath (line 7)
Not enough input arguments.

楼上解决了的话,麻烦告知下~

新手

5 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
发表于 2013-3-13 12:09:51 | 显示全部楼层
Maximum recursion limit of 500 reached. Use
set(0,'RecursionLimit',N)
to change the limit.  Be aware that exceeding your available stack
space can
crash MATLAB and/or your computer.

错误信息。。   把N设置成1000都会崩溃,现在降低到5个点了,还是不行

新手

6 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2013-11-11 11:24:02 | 显示全部楼层
可以用的啊 有输出结果的 先把最后的矩阵a在命令行输入 然后调用函数findPath(a, 1, 7, 0)就可以了啊  把函数中最后定义的矩阵和调用的函数先注释掉

新手

5 麦片

财富积分


050


0

主题

8

帖子

0

最佳答案
发表于 2014-3-11 09:40:49 | 显示全部楼层
不知道楼主解决没~这个程序是好用的~

新手

25 麦片

财富积分


050


7

主题

26

帖子

0

最佳答案
发表于 2015-1-4 15:30:38 | 显示全部楼层
程序可以用的,谢谢哈

新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2015-1-15 14:56:00 | 显示全部楼层
还是 不会用啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表