蚁群算法python实现

首先我们需要对蚁群算法有个大概的了解,你可以先前往蚁群算法

有了大概了解后,在根据大概的流程图阅读下面代码,一步步自己动手实现。以下代码附带注释无需过多说明。

import time

import numpy as np
import random


class MMAS(object):
    def __init__(self):
        super(MMAS, self).__init__()
        self.a = 1  # 信息素的幂
        self.b = 6  # 启发式的幂
        self.p = 0.1  # 挥发系数
        self.m = 3  # 蚂蚁的个数
        self.n = 5  # 城市个数
        self.N_max = 10
        self.dis = np.loadtxt('seleman.txt')  # numpy直接读取邻接矩阵
        self.tao = np.ones((self.n, self.n)) * 0.1  # 初始化tao,根据实验证明取 1/(n*L) n是城市数量,L是较小的正实数,这里随意取,原文初始的值记作tao_0
        self.info = np.zeros((self.n, self.n))  # 转换概率 选择路径时根据这个概率结合JK选取下一个城市(不是那种JK,是禁忌表)
        self.heuristic = 1 / self.dis  # 启发式

        self.Jk = [[] for i in range(self.m)]  # m个禁忌列表,因为有m个蚂蚁

        self.best_path = []  # 最好的路径
        self.L = np.inf  # 最好的路径对应的距离,也就是最短距离

    def place(self):
        # 放置蚂蚁
        x = list(range(self.n))
        pos = random.sample(x, self.m)  # 蚂蚁的放的位置,在x中随机抽m个作为初始值
        for idx, p in enumerate(pos):  # 把初始所在的城市放在禁忌表里
            self.Jk[idx].append(p)

    def update_pheromone(self):
        # 这里用MMAS更新,图方便
        return self.tao * (1 - self.p) + 1 / self.L

    def find_best_path(self):
        # 找最优路径,根据m个蚂蚁走的m条路径中计算最短的
        distance = 0
        for k in range(self.m):
            for j in range(self.n - 1):
                distance += self.dis[self.Jk[k][j]][self.Jk[k][j + 1]]
            if distance < self.L:
                self.best_path = self.Jk[k]
                self.L = distance

        return self.best_path, self.L

    def select_next(self, t, k):
        Max_j = 0
        Max = -np.inf
        for j in range(self.n):
            if j in self.Jk[k]:  # 在禁忌表里就不考虑
                continue
            if Max < self.info[t][j]:
                Max = self.info[t][j]
                Max_j = j

        return Max_j

    def reset(self):
        # 初始化话选的路径的概率
        self.info = self.tao ** self.a * self.heuristic ** self.b

    # 流程看这里,这是并行的选择,相当于同时派m个蚂蚁,一起找最优路径
    def run(self):

        # 遍历N_max次
        for N in range(self.N_max):
            # 一开始随机放置蚂蚁
            self.place()
            # 刷新初始化路径的选择概率
            self.reset()
            # 遍历每一个城市,因为上面的操作已经初始化蚂蚁在一个城市所以只需要在剩下的n-1个城市里选择
            for t in range(self.n - 1):
                # 遍历每一个蚂蚁,让蚂蚁选择路径
                for k in range(self.m):
                    # 每条蚂蚁从当前位置开始选择一条路
                    Next = self.select_next(t, k)
                    # 选择完后把选择的城市加入禁忌表里,禁忌表里的城市不能再选
                    self.Jk[k].append(Next)

            # 更新信息素
            self.tao = self.update_pheromone()
            # 找到最好的路径,和最短距离
            self.best_path, self.L = self.find_best_path()

            # 禁忌表清零
            self.Jk = [[] for i in range(self.m)]

        return self.best_path, self.L


if __name__ == '__main__':
    AS = MMAS()
    print(AS.run())

下面是seleman.txt的内容:

0 1 2 2 3
2 0 3 4 2
3 2 0 4 1
3 4 5 0 5
2 4 1 4 0

你可能感兴趣的:(演化计算,python,算法)