最短路径的问题,各位高手帮小妹一个忙吧

mier1222 2003-09-17 03:12:13
哪位会VB的GG,帮我做一个课程设计,其中最难的是最短路,最好能帮我做成一个function,我需要反复调用的。

已知条件是由大概133个节点组成的路网抽象出来的一个二维矩阵,矩阵中的值是任意两点间的费用。这133个节点中有23个节点是特殊的,我需要求的就是这23个点中任意一个节点到其他22个节点的最短路。比如先求v1与v2之间的最短路,求出一条最短路后,会通过一个函数更改最初的二维矩阵表,重新给该最短路所涉及的矩阵中的某些数据付值,这部分应该是一个循环,共循环5次,然后跳出循环,求v1与下一个点的最短路。注意路的费用矩阵是不断更新的。

我们的矩阵还没做完,你可以先自己做一个小点的假设的矩阵,最起码要实现这个矩阵中我所需求的特定两个点之间的最短路,以shortpath(vi,vj)的子程序形式,vi是始点,vj是终点。最终返回值是最短路径,存在一个数组中,如path(n),path(1)=vi,path(2)=v3,path(3)=v8,则由起点vi到终点vj的一条最短路就是:vi-v3-v8-vj

必须要用vb编,最短路需要做成一个可以反复调用的子函数。

在这里先谢了!!

...全文
24 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aha99 2003-09-17
  • 打赏
  • 举报
回复
这是最简单的算法问题啊
xz1980 2003-09-17
  • 打赏
  • 举报
回复
有点慢了^_^
你可以利用一元一次方程组的原理得到N条路径,然后比叫
你说的有点象写游戏^_^
daviddivad 2003-09-17
  • 打赏
  • 举报
回复
【wxd】在它的大作中提到:
本人载网站开发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
不明白的再问,有好方法告诉我
daviddivad 2003-09-17
  • 打赏
  • 举报
回复
在www.gischina.com中有现成的VB代码。
xz1980 2003-09-17
  • 打赏
  • 举报
回复
可以用穷举法得到每一条路径,然后进行比较即可^_^
wingchi 2003-09-17
  • 打赏
  • 举报
回复
太深奥了
viena 2003-09-17
  • 打赏
  • 举报
回复
高深,不懂
FjhdoTg 2003-09-17
  • 打赏
  • 举报
回复
我有一张图,不知道对你有没有帮助
告诉我油箱,我发给你
yijiansong 2003-09-17
  • 打赏
  • 举报
回复
到数据结构中看一下~~
mier1222 2003-09-17
  • 打赏
  • 举报
回复
我是学工商的,我们的变态学校给我们开了vb的课程,这个题我真的做不出来
射天狼 2003-09-17
  • 打赏
  • 举报
回复
求最短路径的问题可以到数据结构中看一下~~

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧