⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module1.bas

📁 一个动态调度的软件
💻 BAS
字号:
Attribute VB_Name = "min_dis"
'Public Declare Sub ShowDlg Lib "xds.dll" (ByRef a As Long)




'求最短路径
Public Function min_dis(ByRef Adjoin As Variant, ByVal start As Integer _
, ByVal endd As Integer _
, ByRef Min_Length As Integer, ByRef Min_Row() As Integer) As Boolean    '节点认为是字符型


  u1 = UBound(Adjoin, 1)   '取出邻接矩阵的第一维最大下标
  u2 = UBound(Adjoin, 2)   '取出邻接矩阵的第二维最大下标
  
  Dim L() As Integer       '存放临时节点
  Dim prev() As Integer    '存放前导点的数组
  Dim d() As Integer       '存放最短路径长度,d(i)表示从起点到i点的最短路径长度
  
  '初始化临时节点表,把跟起始点相连的点都存放进去
  ReDim L(0 To u2)
  Dim k As Integer
  k = 0
  For j = 0 To u2
    L(j) = -1
    If Adjoin(start, j) > 0 Then
       L(j) = j
    End If
  Next
  

  '初始化d()数组,跟起始点没有直线连通的点,暂时不知道最短路径长度,设为无穷大,用-1表示
  ReDim d(0 To u2)
  k = 0
  For m = 0 To u2
    If Adjoin(start, m) > 0 Then
       d(m) = Adjoin(start, m)
    Else
       d(m) = -1
    End If

  Next
  
  '初始prev()数组,跟起始点有直线相连的点的前导点都是起始点
  ReDim prev(0 To u2)
  For p = 0 To u2
     If Adjoin(start, p) > 0 Then
        prev(p) = start
     Else
        prev(p) = -1
     End If
  Next
  
  
  '开始循环求最短路径
  Dim min_d, n As Integer
  
  Do While Not isVoid(L)
     min_d = get_min_d(L, d)
     
'     MsgBox min_d                      '用来逐次打印最短路径上的点
  
  Debug.Print "%%%%%%%%%%"
     Dim ss As String
     ss = ""
     For y = 0 To u2
      ss = ss + " " + CStr(L(y))
     Next
      Debug.Print ss
       Debug.Print "%%%%%%%%%%"
       L(min_d) = -1
       
       
     For n = 0 To u2
       If Adjoin(min_d, n) > 0 Then
          If n <> prev(min_d) And (prev(n) = -1 Or compare(d(n), d(min_d) + Adjoin(min_d, n)) = 1) Then
              d(n) = d(min_d) + Adjoin(min_d, n)
          
          
             If prev(n) = -1 Then
                If Not Add_to_L(L, n) Then
                   MsgBox "将新网络点" & CStr(n) & "加入L数组出错!"
                   Exit Function
                End If
             End If
             
             prev(n) = min_d
          End If
          
       End If
     Next
     
  Loop
  
  '循环结束
  Min_Length = d(endd)
  
  Dim min_row_tmp() As Integer
  ReDim min_row_tmp(0 To u2)
  min_row_tmp(0) = endd

  k = 1
  endd_tmp = endd
  Do While prev(endd_tmp) <> start
      min_row_tmp(k) = prev(endd_tmp)
      endd_tmp = prev(endd_tmp)
      k = k + 1
  Loop
  
  min_row_tmp(k) = start
  ReDim Min_Row(0 To k)
  
  For q = 0 To k
       Min_Row(q) = min_row_tmp(k - q)         '将倒序的路径改为顺序的
  Next

  
  
End Function

'判断一个整数数组是否"为空"
Public Function isVoid(a() As Integer) As Boolean

   u = UBound(a, 1)
   
   For i = 0 To u
     If a(i) > 0 Then
        isVoid = False    '不为空
        Exit Function
     End If
   Next
   
   isVoid = True '为空
   
   
End Function


'从数组L中获取d(i)最小的点i
Public Function get_min_d(a() As Integer, d() As Integer) As Integer
  u = UBound(a, 1)
  
  Dim min, j As Integer
  j = -1
  min = d(0)
  
  Dim ss As String
  
  For i = 0 To u
      ss = ss + " " + CStr(d(i))
     If a(i) >= 0 Then
        If 1 = compare(min, d(a(i))) Then
           min = d(a(i))
           j = a(i)
        End If
     End If
  Next

 Debug.Print "ss====;" + ss
  get_min_d = j

  
End Function

'比较两个路径之间的大小,由于“-1"表示无穷大,所以”-1”比任何非无穷数都大
'a>b 返回 1,a =b 返回 0,a<b 返回-1
Public Function compare(ByVal a As Integer, ByVal b As Integer) As Integer
   If a = -1 Then
      If b <> -1 Then
         compare = 1
      Else
         compare = 0
      End If
   Else
      If b = -1 Then
         compare = -1
      Else
         If a > b Then
            compare = 1
         ElseIf a = b Then
            compare = 0
         Else
            compare = -1
         End If
      End If
   End If
   
      
End Function

'把一个新的点加入到L数组
Public Function Add_to_L(ByRef a() As Integer, ByVal b As Integer) As Boolean
  a(b) = b
  Add_to_L = True
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -