软盟收藏
 用户中心
 加盟指南
 网上订购
软件联盟 商业源码 名企管理 策划方案 募捐会馆 会员服务 源码下载 开发文档 SAP教程 房地产策划 商业图库
软件联盟现时:2010年9月8日 星期三 位于: 源码文档- 开发文档 → 开发技术(VB开发专栏)
最短路径算法源码(VB源码教程)
2005年4月17日  作者:未知  商业源码:策划管理,名企内参,咨询顾问  浏览选项:    本文已被浏览 4134 次
本人在开发网站gis游戏,自编的最短路径查询程序,速度特快,3万节点,35000条路全部遍历,只需1秒。现将最短路径的思路告诉大家,希望大家在优化,并用不同语言编制,我正在学delphi,准备用delphi做成库,本例以由拓扑关系的arc/info 文件为数据源。其中a1,b1,c1是以fnode排序生成的数组,a1对应fnode,b1对应tnode,c1对应length,同样a2,b2,c2,是以tnode 生成的数组。Indexa1是对应某一起点与其相连的终点的个数,indexb1时对应某一终点与其相连的起点的个数,即其拓扑关系。
Public Function shortpath(startno As Integer, endno As Integer) As Single
以开始点,结束点为参数。
Dim result() As Single
Dim result1 As Integer
定义结果点
Dim s1 As Single
Dim min As Single
Dim ii, i, j, aa As Integer
Dim yc() As Boolean
Dim ycd() As Boolean
Dim rs1() As Single
Dim no() As Integer
Dim nopoint As Integer
ReDim yc(1 To maxno) As Boolean
ReDim ycd(1 To maxno) As Boolean
ReDim rs1(1 To maxno) As Single
ReDim result(1 To 2, 1 To maxno) As Single
定义结果,其中result(1,maxno)为结果点,result(2,maxno)为结果长度。
For i = 1 To maxno// maxno为网中最大的节点数。
yc(i) = False //标记已经查过的点。
ycd(i) = False //标记已经作结果点用过的点
rs1(i) = 1E+38 //假设从起点到任一点的距离都为无穷大
Next i
ll = startno //设置开始点。
yc(ll) = True //标记开始点为真。即已经作结果点用过。
j = 0
For aa = 1 To maxno
先从与开始点相连的终点寻找 
For i = 1 To indexa1(2, ll) //以与ll点相连的起点的个数循环
result1 = b1(indexa1(1, ll) - i + 1)找出与LL点相连的终点的点号
s1 = c1(indexa1(1, ll) - i + 1) + result(2, ll)找出长度并求和
If yc(result1) = True Then GoTo 200如果以被经查过进行下一个
If ycd(result1) = True Then//如果已经作为结果点判断哪一个长
If rs1(result1) >= s1 Then//如果这一点到起点的长度比现在的路线长,替代
rs1(result1) = s1
result(1, result1) = ll//设置到这点的最短路径的前一点为LL点(精华部分)
result(2, result1) = s1设置到这点的最短路径长度
GoTo 200
Else
GoTo 200
End If
End If
如果上面的条件都不符合则进行下面的语句
ycd(result1) = True
rs1(result1) = s1
result(1, result1) = ll
result(2, result1) = s1
每找到一个点加一,为了下面的判断
j = j + 1
ReDim Preserve no(1 To j) As Integer
从新 定义数组并使其值为当前的点号
no(j) = result1
200 Next I
再从与开始点相连的终点寻找,与上面一样不再标注 
For i = 1 To indexb2(2, ll)
result1 = a2(indexb2(1, ll) - i + 1)
s1 = c2(indexb2(1, ll) - i + 1) + result(2, ll)
If yc(result1) = True Then GoTo 300
If ycd(result1) = True Then
If rs1(result1) >= s1 Then
rs1(result1) = s1
result(1, result1) = ll
result(2, result1) = s1
GoTo 300
Else
GoTo 300
End If
End If
ycd(result1) = True
rs1(result1) = s1
result(1, result1) = ll
result(2, result1) = s1
j = j + 1
ReDim Preserve no(1 To j) As Integer
no(j) = result1
300 Next I

设置最小为无穷大,最短路径点为空
min = 1E+38
minpoint = Null
(优化部分)
找出已经查过点中长度最短的点
For i = aa To j
If min > rs1(no(i)) Then
ii = i
min = rs1(no(i))
minpoint = no(i)
End If
Next I
如果没有结果,即起点与终点没有通路退出程序
If min = 1E+38 Then Exit Function
(重点优化)将两点互换,减少循环。
no(ii) = no(aa)
no(aa) = minpoint
标记已经作为结果点判断过
yc(minpoint) = True
ll = minpoint
判断结果点是否等于终点,如果等于则已经找到最短路径
If minpoint = endno Then Exit For
Next aa
返回最短路径长度
Stpath = result(2, endno)
End Function 
 发布人:lala
 [ → 我要发表文章 ]
上篇文章:网络游戏外挂制作过程详解
下篇文章:用Asp.net实现简单的文字水印
→ 主题所属分类:  开发技术 → VB开发专栏 → 『关闭窗口』
 热门文章
 穿透防火墙的数据传输源码 (4614)
 Delphi中如何调用VC++创建的动态链接库? (4589)
 使用Delphi和WebServices技术开发短信应用 (4384)
 把.NET部署到没有安装Fram的机器上 (4327)
 用DELPHI实现的黑客程序技巧集锦 (4181)
 最短路径算法源码(VB源码教程) (4135)
 ASP.NET添加客户端代码的几种方法 (4112)
 提高ASP.NET性能的若干方法 (4079)
 利用随机数加密字串的算法(vb) (3941)
 Java常见问题大全集 (3941)
 最近更新
 Google店大欺客:伪开源Android危机四伏 (2月3日)
 从各大软件公司笔试压轴题学习SQL语句 (12月31日)
 Oracle并行查询发挥多CPU的威力 (7月8日)
 SQL Server 2008企业视频讲座 (12月5日)
 一个完美的中文大写日期转换函数 (8月1日)
 海量数据库的查询优化及分页算法方案 (8月1日)
 用友ERP-NC精华实用SQL脚本之:快速复制公司的... (2月21日)
 IC卡写卡操作的源码(深圳达实公司) (3月16日)
 专家分享Oracle数据库业务优化心得 (1月15日)
 多线程验证DoubleCheckedLocking (11月3日)
 文章搜索
搜索选项:            
  → 评论内容 (点击查看)
(没有相关评论)
  → 发表我的评论
您的姓名:  您的E-mail:

评论内容:
发表评论:  
关于我们咨询反馈合作媒体免费金币行业管理名企内参矢量图库素材模板客户名录快乐淘宝广告合作网站地图
本站总访问量: 19762488 人次 ┋ 围观高峰 948 人在线 ┋ 现时围观 41 人
商业源码:策划管理,名企内参,咨询顾问 [节能型] ┋联系邮件 服务QQ:308071592
软件创业联盟 ©2002-2018 版权所有 浙ICP备09028508号 电话:0571-8590-3599