蚁群算法

该博客主要展示了使用蚁群算法实现最佳路径搜索的代码。定义了BACA类执行蚁群基本算法,包括初始化参数、读取城市信息、放置蚂蚁等操作;还定义了ANT类表示蚂蚁,具有选择城市、移动到下一个城市等方法。通过迭代搜索找出最佳路径并记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os,sys,random,string
from string import *
from math import *
BestTour =[]#最佳路径选择城市顺序
CitySet = set()#城市集合
CityList = []#城市列表,城市序号
PheromoneTraiList = []#信息素列表
PheromoneDeltaTraiList = []#释放信息素列表
CityDistanceList = []#城市距离列表
AntList = []#蚂蚁
shortlen = 0
#定义类BACA,执行蚁群基本算法
class BACA:
def init(self,cityCount=51,antCount=50,q=80,alpha=2,beta=5,rou=0.3,nMax=10):
self.CityCount = cityCount
self.AntCount = antCount
self.Q = q
self.Alpha = alpha
self.Beta = beta
self.Rou = rou
self.Nmax = nMax
self.Shortest = 10e8
random.seed()
#设置最佳路径初始值为0
for nCity in range(self.CityCount):
BestTour.append(0)
#设置一个城市到每个城市的路径信息素100和释放信息素0初始值
for row in range(self.CityCount):
pheromoneList = []
pheromoneDeltaList = []
for col in range(self.CityCount):
pheromoneList.append(100)
pheromoneDeltaList.append(0)
PheromoneTraiList.append(pheromoneList)
PheromoneDeltaTraiList.append(pheromoneDeltaList)
#定义读取城市文件
def ReadCityInfo(self,fileName):
file = open(fileName)
#设置城市集合和城市列表
for line in file.readlines():
lists = line.split()#字符串分割后存在列表中元素是字符串
cityN = lists[0]
cityX = lists[1]
cityY = lists[2]
CitySet.add(int(cityN))
CityList.append((int(cityN),float(cityX),float(cityY)))
#设置一个城市到每个城市距离值
for row in range(self.CityCount):
distanceList = []
for col in range(self.CityCount):
distance = sqrt(pow(CityList[row][1]-CityList[col][1],2)+pow(CityList[row]
[2]-CityList[col][2],2))
distance = round(distance,6)
distanceList.append(distance)
CityDistanceList.append(distanceList)
#定义蚂蚁选择城市,蚂蚁对象实例化
def PutAnts(self):
for antNum in range(self.AntCount):
city = random.randint(1,self.CityCount)
ant = ANT(city)
AntList.append(ant)
#搜索最佳路径方法主程序
def Search(self):
for iter in range(self.Nmax):#迭代次数,蚂蚁跑圈的次数
self.PutAnts()#蚂蚁初始城市实例化对象
for ant in AntList:#循环每只蚂蚁
for ttt in range(len(CityList)):#一只蚂蚁所有城市
ant.MoveToNextCity(self.Alpha,self.Beta)
ant.UpdatePathLen()
tmpLen = AntList[0].CurrLen
tmpTour = AntList[0].TabuCityList
for ant in AntList[1:]:
if ant.CurrLen < tmpLen:
tmpLen = ant.CurrLen
tmpTour = ant.TabuCityList
if tmpLen < self.Shortest:
shortlen = tmpLen
self.Shortest = tmpLen
BestTour = tmpTour
print(iter,’:’,self.Shortest,’:’,BestTour)
with open(‘ee.txt’,“a”) as f:
f.write(‘最短路径: ‘+str(shortlen)+’\n’+‘路线’+str(BestTour))

        self.UpdatePheromoneTrail()
#定义更新信息素
def UpdatePheromoneTrail(self):
    #释放信息素
    for ant in AntList:
        for city in ant.TabuCityList[0:-1]:
            idx = ant.TabuCityList.index(city)
            nextCity = ant.TabuCityList[idx+1]
            PheromoneDeltaTraiList[city-1][nextCity-1] = self.Q/ant.CurrLen
            PheromoneDeltaTraiList[nextCity-1][city-1] = self.Q/ant.CurrLen
        lastCity = ant.TabuCityList[-1]
        firstCity = ant.TabuCityList[0]
        PheromoneDeltaTraiList[lastCity-1][firstCity-1] = self.Q/ant.CurrLen
        PheromoneDeltaTraiList[firstCity-1][lastCity-1] = self.Q/ant.CurrLen
    #路径信息素
    for (city1,city1X,city1Y) in CityList:
        for (city2,city2X,city2Y) in CityList:
            PheromoneTraiList[city1-1][city2-1] = ((1-self.Rou)*PheromoneTraiList[city1-1]
            [city2-1]+PheromoneDeltaTraiList[city1-1][city2-1])
            PheromoneDeltaTraiList[city1-1][city2-1] = 0#释放信息素初始化0

#定义蚂蚁类,是蚂蚁具有方法和属性
class ANT:
def init(self,currCity = 0):
self.TabuCitySet = set()
self.TabuCityList = []
self.AllowedCitySet = set()
self.TransferProbabilityList = []
self.CurrCity = 0
self.CurrLen = 0.0
self.AddCity(currCity)
pass
def SelectNextCity(self,alpha,beta):
if len(self.AllowedCitySet) == 0:
return(0)
sumProbability = 0.0
for city in self.AllowedCitySet:
sumProbability = sumProbability+(pow(PheromoneTraiList[self.CurrCity-1][city-1],
alpha)pow(1.0/CityDistanceList[self.CurrCity-1][city-1],beta))
self.TransferProbabilityList = []
for city in self.AllowedCitySet:
transferProbability = (pow(PheromoneTraiList[self.CurrCity-1][city-1],alpha)

pow(1.0/CityDistanceList[self.CurrCity-1][city-1],beta))/sumProbability
self.TransferProbabilityList.append((city,transferProbability))
select = 0.0
for city,cityProb in self.TransferProbabilityList:
if cityProb > select:
select = cityProb
threshold = select*random.random()
for (cityNum,cityProb) in self.TransferProbabilityList:
if cityProb >= threshold:
return(cityNum)
return(0)
def MoveToNextCity(self,alpha,beta):
nextCity = self.SelectNextCity(alpha,beta)
if nextCity > 0:
self.AddCity(nextCity)
def ClearTabu(self):
self.TabuCityList = []
self.TabuCitySet.clear()
self.AllowedCitySet = CitySet - self.TabuCitySet
def UpdatePathLen(self):
for city in self.TabuCityList[0:-1]:
nextCity = self.TabuCityList[self.TabuCityList.index(city)+1]

        self.CurrLen = self.CurrLen+CityDistanceList[city-1][nextCity-1]
    lastCity = self.TabuCityList[-1]
    firstCity = self.TabuCityList[0]
    self.CurrLen = self.CurrLen+CityDistanceList[lastCity-1][firstCity-1]
def AddCity(self,city):
    if city <= 0:
        return
    self.CurrCity = city
    self.TabuCityList.append(city)
    self.TabuCitySet.add(city)
    self.AllowedCitySet = CitySet-self.TabuCitySet

if name == “main”:
theBaca = BACA()
theBaca.ReadCityInfo(“acatsp.tsp”)
theBaca.Search()

os.system("pause")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值