• 大小: 6KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-18
  • 语言: Python
  • 标签: 蚁群算法  python  

资源简介

蚁群算法中TSP问题的一个用python解决的小DEMO

资源截图

代码片段和文件信息

import numpy as np
import matplotlib.pyplot as plt
coordinates = np.array([[565.0575.0][25.0185.0][345.0750.0][945.0685.0][845.0655.0]
                        [880.0660.0][25.0230.0][525.01000.0][580.01175.0][650.01130.0]
                        [1605.0620.0][1220.0580.0][1465.0200.0][1530.0  5.0][845.0680.0]
                        [725.0370.0][145.0665.0][415.0635.0][510.0875.0][560.0365.0]
                        [300.0465.0][520.0585.0][480.0415.0][835.0625.0][975.0580.0]
                        [1215.0245.0][1320.0315.0][1250.0400.0][660.0180.0][410.0250.0]
                        [420.0555.0][575.0665.0][1150.01160.0][700.0580.0][685.0595.0]
                        [685.0610.0][770.0610.0][795.0645.0][720.0635.0][760.0650.0]
                        [475.0960.0][95.0260.0][875.0920.0][700.0500.0][555.0815.0]
                        [830.0485.0][1170.0 65.0][830.0610.0][605.0625.0][595.0360.0]
                        [1340.0725.0][1740.0245.0]])

def getdistmat(coordinates):
    num = coordinates.shape[0]
    distmat = np.zeros((5252))
    for i in range(num):
        for j in range(inum):
            distmat[i][j] = distmat[j][i]=np.linalg.norm(coordinates[i]-coordinates[j])
    return distmat

distmat = getdistmat(coordinates)

numant = 40 #蚂蚁个数
numcity = coordinates.shape[0] #城市个数
alpha = 1   #信息素重要程度因子
beta = 5    #启发函数重要程度因子
rho = 0.1   #信息素的挥发速度
Q = 1

iter = 0
itermax = 250

etatable = 1.0/(distmat+np.diag([1e10]*numcity)) #启发函数矩阵,表示蚂蚁从城市i转移到矩阵j的期望程度
pheromonetable  = np.ones((numcitynumcity)) # 信息素矩阵
pathtable = np.zeros((numantnumcity)).astype(int) #路径记录表

distmat = getdistmat(coordinates) #城市的距离矩阵

lengthaver = np.zeros(itermax) #各代路径的平均长度
lengthbest = np.zeros(itermax) #各代及其之前遇到的最佳路径长度
pathbest = np.zeros((itermaxnumcity)) # 各代及其之前遇到的最佳路径长度


while iter < itermax:


    # 随机产生各个蚂蚁的起点城市
    if numant <= numcity:#城市数比蚂蚁数多
        pathtable[:0] = np.random.permutation(range(0numcity))[:numant]
    else: #蚂蚁数比城市数多,需要补足
        pathtable[:numcity0] = np.random.permutation(range(0numcity))[:]
        pathtable[numcity:0] = np.random.permutation(range(0numcity))[:numant-numcity]

    length = np.zeros(numant) #计算各个蚂蚁的路径距离

    for i in range(numant):


        visiting = pathtable[i0] # 当前所在的城市

        #visited = set() #已访问过的城市,防止重复
        #visited.add(visiting) #增加元素
        unvisited = set(range(numcity))#未访问的城市
        unvisited.remove(visiting) #删除元素


        for j in range(1numcity):#循环numcity-1次,访问剩余的numcity-1个城市

            #每次用轮盘法选择下一个要访问的城市
            listunvisited = list(unvisited)

            probtrans 

评论

共有 条评论