?? modulemmas.bas
字號:
Attribute VB_Name = "ModuleMMAS"
Public MaxAnts '使用的螞蟻只數(shù)
Public MaxCities '城市數(shù)目
Public Alpha As Double
Public Beta As Double
Public Rou As Double
Public TaoMax As Double
Public TaoMin As Double
Public Tao0 As Double
Public MaxIter As Integer
Public W As Double
Public Sigma As Double
Public CalcTimes As Double
Public Q0 As Double
Public Type Tour_Of_Ant
fromCity As Integer
toCity As Integer
Prob As Double ''''Used to find the reason why this ant choose this path
End Type
Public Type Ant_MMAS
Tour() As Tour_Of_Ant
StartingCity As Integer
CurrentCity As Integer
Visited() As Boolean
LengthOfPath As Double
End Type
Public Type City_Type
x As Double
y As Double
End Type
Public Ant() As Ant_MMAS
Public City() As City_Type
Public Dis() As Double
Public Tao() As Double
Public NTao() As Boolean
Public SignUseNew As Boolean
Public SignComputeAvg As Boolean
Public SignAlwaysCleanResult As Boolean
Public SignDrawBestLen As Boolean
Public SignDrawAvgLen As Boolean
Public SignDrawTogether As Boolean
Public SignDrawPath As Boolean
Public SignDrawTao As Boolean
Public SignShowStep_by_Step As Boolean
Public SignPause As Boolean
Public SignShowNextMove As Boolean
Public CityXMax As Double, CityXMin As Double, CityYMax As Double, CityYMin As Double
Public TaoMaxInIter As Double
Public Function Init_MMAS()
Dim TspFile As String '存儲TSP問題的城市布局的文件
Alpha = Val(frmMMAS.txtAlpha.Text)
Beta = Val(frmMMAS.txtBeta.Text)
Rou = Val(frmMMAS.txtRou.Text)
TaoMax = Val(frmMMAS.txtTaoMax.Text)
TaoMin = Val(frmMMAS.txtTaoMin.Text)
MaxIter = Val(frmMMAS.txtMaxIter.Text)
Tao0 = Val(frmMMAS.txtTao0.Text)
Sigma = Val(frmMMAS.txtSigma)
W = Val(frmMMAS.txtW.Text)
CalcTimes = Val(frmMMAS.txtCalcTime.Text)
Q0 = Val(frmMMAS.txtQ0.Text)
MaxAnts = Val(frmMMAS.txtMaxAnts.Text)
TspFile = frmMMAS.lstCityData.Text + ".txt" '以上步驟把用戶在軟件界面中設(shè)置的參數(shù)存儲在對應(yīng)的變量中
Open TspFile For Input As #1 '打開TSP文件
Input #1, MaxCities '從文件的第一行讀出該TSP問題的城市數(shù)量
ReDim City(1 To MaxCities)
ReDim Ant(1 To MaxAnts)
ReDim Dis(1 To MaxCities, 1 To MaxCities)
ReDim Tao(1 To MaxCities, 1 To MaxCities)
ReDim NTao(1 To MaxCities, 1 To MaxCities)
For i = 1 To MaxAnts
ReDim Ant(i).Tour(1 To MaxCities)
ReDim Ant(i).Visited(1 To MaxCities)
Next i '根據(jù)城市的數(shù)量調(diào)整個數(shù)組的大小
For i = 1 To MaxCities
Input #1, a
Input #1, City(i).x
Input #1, City(i).y
Next i '從文件中讀出各城市的坐標(biāo)
Close #1
'''''''''''''''''為計算過程中繪制城市位置以及螞蟻的路徑作準(zhǔn)備''''''''''''''''
'''''''''''''''''即,計算城市的x、y坐標(biāo)的最大最小值''''''''''''''''''''''''''
CityXMin = City(1).x: CityXMax = City(1).x
CityYMin = City(1).y: CityYMax = City(1).y
For i = 2 To MaxCities
If City(i).x > CityXMax Then
CityXMax = City(i).x
Else
If City(i).x < CityXMin Then
CityXMin = City(i).x
End If
End If
If City(i).y > CityYMax Then
CityYMax = City(i).y
Else
If City(i).y < CityYMin Then
CityYMin = City(i).y
End If
End If
Next i
''''''''''''''''設(shè)置各條路徑上的信息素濃度的初始值''''''''''''''''''''''''''''
For i = 1 To MaxCities
For j = 1 To MaxCities
Tao(i, j) = Tao0
NTao(i, j) = False '這個數(shù)組用來表明每條路經(jīng)商的信息素濃度是否改變
Next j
Next i
For i = 1 To MaxAnts
Ant(i).StartingCity = 1 '設(shè)置每只螞蟻的起始城市為1號城市
Ant(i).CurrentCity = 0 '這個變量用來表示螞蟻當(dāng)前所在的城市,這里先把它清零
Ant(i).LengthOfPath = 0 '初始化螞蟻的一次周游的路徑長度為0
For j = 1 To MaxCities
''''''''''''''設(shè)置每只螞蟻的每一次選擇的起始城市和目的城市為0''''''''''''''
Ant(i).Tour(j).fromCity = 0
Ant(i).Tour(j).toCity = 0
Ant(i).Visited(j) = False '設(shè)置螞蟻已經(jīng)訪問過的城市的標(biāo)志為“假”
Next j
Ant(i).Tour(1).fromCity = Ant(i).StartingCity '設(shè)置螞蟻的第一次選擇的起始城市為螞蟻周游的起始城市
Next i
For i = 1 To MaxCities
For j = 1 To MaxCities
Dis(i, j) = Sqr((City(i).x - City(j).x) ^ 2 + (City(i).y - City(j).y) ^ 2) '計算每兩個城市之間的距離
Next j
Next i
End Function
Public Sub Init_for_Avg_Calc() '為計算平均值做準(zhǔn)備
For i = 1 To MaxCities
For j = 1 To MaxCities
Tao(i, j) = Tao0
NTao(i, j) = False
Next j
Next i
For i = 1 To MaxAnts
Ant(i).StartingCity = 1
Ant(i).CurrentCity = 0
Ant(i).LengthOfPath = 0
For j = 1 To MaxCities
Ant(i).Tour(j).fromCity = 0
Ant(i).Tour(j).toCity = 0
Next j
Ant(i).Visited(i) = False
Ant(i).Tour(1).fromCity = Ant(i).StartingCity
Next i
End Sub
Public Function Iteration_Init() As Integer
For i = 1 To MaxAnts
Ant(i).StartingCity = 1
Ant(i).CurrentCity = 0
Ant(i).LengthOfPath = 0
For j = 1 To MaxCities
Ant(i).Tour(j).fromCity = 0
Ant(i).Tour(j).toCity = 0
Ant(i).Visited(j) = False
Next j
Ant(i).Tour(1).fromCity = Ant(i).StartingCity
Next i
End Function
Public Function SelectCity(ByVal n As Integer, ByVal NoTour As Integer) As Integer
Dim STao As Double, P As Double, Sp As Double
Dim STaoMax As Double, ArgSTaoMax As Integer
Randomize Time
P = Rnd
If P <= Q0 Then
STaoMax = 0
j = Ant(n).CurrentCity
For i = 1 To MaxCities
If Ant(n).Visited(i) = False Then
If STaoMax < Tao(j, i) Then
STaoMax = Tao(j, i)
ArgSTaoMax = i
End If
End If
Next i
SelectCity = ArgSTaoMax
Exit Function
End If
STao = 0
j = Ant(n).CurrentCity
For i = 1 To MaxCities
If Ant(n).Visited(i) = False Then
STao = STao + (Tao(j, i) ^ Alpha) * ((1 / Dis(j, i)) ^ Beta)
End If
Next i
If STao = 0 Then
MsgBox "Error!Travel has been completed, but the ants are still running.STao=0"
SelectCity = -1
Exit Function
End If
''''''Used to find the reason why this ant choose this path'''''''
' Ant(n).Tour(NoTour).Prob = STao
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Randomize Time
P = Rnd * STao
Sp = 0
For i = 1 To MaxCities
If Ant(n).Visited(i) = False Then
Sp = Sp + (Tao(j, i) ^ Alpha) * ((1 / Dis(j, i)) ^ Beta)
If Sp >= P Then
SelectCity = i
Ant(n).Tour(NoTour).Prob = ((Tao(j, i) ^ Alpha) * ((1 / Dis(j, i)) ^ Beta)) / STao
Exit Function
End If
End If
Next i
MsgBox "Error!STao>Sp"
SelectCity = -1
End Function
Public Function Local_Update(ByVal i As Integer, ByVal j As Integer)
Tao(i, j) = (1 - Rou) * Tao(i, j) + Rou * Tao0
Tao(j, i) = Tao(i, j)
End Function
Public Function PhUpdate(ByVal n As Integer) As Integer
Dim aa As Double, bb As Double
For i = 1 To MaxCities
For j = 1 To MaxCities
Tao(i, j) = (1 - Rou) * Tao(i, j)
NTao(i, j) = False
NTao(j, i) = False
If Tao(i, j) > TaoMax Then
Tao(i, j) = TaoMax
Else
If Tao(i, j) < TaoMin Then
Tao(i, j) = TaoMin
End If
End If
Tao(j, i) = Tao(i, j)
Next j
Next i
For i = 1 To MaxCities
aa = Ant(n).Tour(i).fromCity
bb = Ant(n).Tour(i).toCity
Tao(aa, bb) = Tao(aa, bb) + W / Ant(n).LengthOfPath
NTao(aa, bb) = True
NTao(bb, aa) = True
If Tao(aa, bb) > TaoMax Then
Tao(aa, bb) = TaoMax
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -