蚁群算法基本思想

蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。蚂蚁是如何做到这一点的呢?

原来,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物一信息激素一也可称之为信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响它们以后的行为。当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大(当然,随时间的推移会逐渐减弱),所以蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称之为蚂蚁的自催化行为。由于其原理是一种正反馈机制.因此,也可将蚂蚁王国理解为所谓的增强型学习系统。

在自然界中,蚁群的这种寻找路径的过程表现为一种正反馈过程,“蚁群算法”就是模仿生物学蚂蚁群觅食寻找最优路径原理衍生出来的。

蚁群算法数学模型

应该说前面介绍的蚁群算法只是一种算法思想,要是想真正应用该算法,还需要针对一个特定问题, 建立相应的数学模型。现仍以经典的TSP问题为例,来进一步阐述如何基于蚁群算法来求解实际问题。

对于TSP问题,为不失一般性,设整个蚂蚁群体中蚂蚁的数量为m,城市的数量为n,城市i与城市j之间的距离为dijd_{ij}dij​ (i,j=1,2,…,n),t时刻城市i与城市j连接路径上的信息素浓度为τij\tau _{ij}τij​(t)。初始时刻,蚂蚁被放置在不同的城市里,且各城市间连接路径上的信息素浓度相同,不妨设τij\tau _{ij}τij​(0)=$\tau (0)。然后蚂蚁将按一定概率选择线路,不妨设(0)。然后蚂蚁将按一定概率选择线路,不妨设(0)。然后蚂蚁将按一定概率选择线路,不妨设P_{ij}^{k}(t)$为t时刻蚂蚁k从城市i转移到城市j的概率。我们知道,“蚂蚁TSP”策略会受到两方面的左右,首先是访问某城市的期望,另外便是其他蚂蚁释放的信息素浓度,所以定义:

其中,$ \eta _{ij}^{t}$ 为启发函数,表示蚂蚁从城市i转移到城市j的期望程度:allowkallow_{k}allowk​(k=1, 2, …, m)为蚂蚁k待访问城市集合,开始时,allowkallow_{k}allowk​中有n一1个元素,即包括除了蚂蚁k出发城市的其他多有城市, 随着时间的推移,allowkallow_{k}allowk​中的元素越来越少,直至为空;a为信息素重要程度因子,简称信息度因子。其值越大,表示信息影响强度越大;β\betaβ为启发函数重要程度因子,简称启发函数因子,其值越大,表明启发函数影响越大。

在蚂蚁遍历城市的过程中,与实际情况相似的是,在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素的强度也在通过挥发等方式逐渐消失。为了描述这一特征,不妨令p(0<p<1)表示信息素的挥发程度。这样,当所有蚂蚁完整走完一遍所有城市之后,各个城市间连接路径上的信息浓度为:

其中,Δτijk\Delta \tau_{ij}^{k}Δτijk​为第k只蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度;Δτij\Delta \tau_{ij}Δτij​为所有蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度。

一般Δτijk\Delta \tau_{ij}^{k}Δτijk​的值可由ant cycle system模型进行计算:

其中,Q为信息素常数,表示蚂蚁循环一次所释放的信息素总量;LkL_{k}Lk​为第k只蚂蚁经过路径的总长度。

蚁群算法流程

用蚁群算法求解TSP问题的算法流程如下图所示,具体每步的含义如下:

  • 步骤1:对相关参数进行初始化,包括蚁初始化群规模、信息素因子、启发函数因子、信息素、挥发因子、信息素常数、最大迭代次数等,以及将数据读人程序,并对数据进行基本的处理,如将城市的坐标位置,转为城市间的矩阵。
  • 步骤2:随机将蚂蚁放于不同的出发点,对每个蚂蚁计算其下一个访问城市,直至所更新信息素表有蚂蚁访问完所有城市。
  • 步骤3:计算各个蚂蚁经过的路径长度LkL_{k}Lk​,记录当前迭代次数中的最优解,同时对各个城市连接路径上的信息素浓度进行更新。
  • 步骤4:判断是否达到最大迭代次数,若否,则返回步骤2,否则终止程序。
  • 步骤5:输出程序结果,并根据需要输出程序寻优过程中的相关指标,如运行时间、收敛迭代次数等。

python简单实现

import numpy as np
import matplotlib.pyplot as plt# 建立“蚂蚁”类
class Ant(object):def __init__(self, path):self.path = path                       # 蚂蚁当前迭代整体路径self.length = self.calc_length(path)   # 蚂蚁当前迭代整体路径长度def calc_length(self, path_):              # path=[A, B, C, D, A]注意路径闭环length_ = 0for i in range(len(path_)-1):delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)length_ += np.linalg.norm(delta)return length_@staticmethoddef calc_len(A, B):                        # 静态方法,计算城市A与城市B之间的距离return np.linalg.norm((A.x - B.x, A.y - B.y))# 建立“城市”类
class City(object):def __init__(self, x, y):self.x = xself.y = y# 建立“路径”类
class Path(object):def __init__(self, A):                     # A为起始城市self.path = [A, A]def add_path(self, B):                     # 追加路径信息,方便计算整体路径长度self.path.append(B)self.path[-1], self.path[-2] = self.path[-2], self.path[-1]# 构建“蚁群算法”的主体
class ACO(object):def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):self.ants_num = ant_num   # 蚂蚁个数self.maxIter = maxIter    # 蚁群最大迭代次数self.alpha = alpha        # 信息启发式因子self.beta = beta          # 期望启发式因子self.rho = rho            # 信息素挥发速度self.Q = Q                # 信息素强度###########################self.deal_data('coordinates.dat')                         # 提取所有城市的坐标信息###########################self.path_seed = np.zeros(self.ants_num).astype(int)      # 记录一次迭代过程中每个蚂蚁的初始城市下标self.ants_info = np.zeros((self.maxIter, self.ants_num))  # 记录每次迭代后所有蚂蚁的路径长度信息self.best_path = np.zeros(self.maxIter)                   # 记录每次迭代后整个蚁群的“历史”最短路径长度###########################self.solve()              # 完成算法的迭代更新self.display()            # 数据可视化展示def deal_data(self, filename):with open(filename, 'rt') as f:temp_list = list(line.split() for line in f)                                   # 临时存储提取出来的坐标信息self.cities_num = len(temp_list)                                                   # 1. 获取城市个数self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list)     # 2. 构建城市列表self.city_dist_mat = np.zeros((self.cities_num, self.cities_num))                  # 3. 构建城市距离矩阵for i in range(self.cities_num):A = self.cities[i]for j in range(i, self.cities_num):B = self.cities[j]self.city_dist_mat[i][j] = self.city_dist_mat[j][i] = Ant.calc_len(A, B)self.phero_mat = np.ones((self.cities_num, self.cities_num))                       # 4. 初始化信息素矩阵# self.phero_upper_bound = self.phero_mat.max() * 1.2                              ###信息素浓度上限self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num))          # 5. 初始化启发函数矩阵def solve(self):iterNum = 0                                                            # 当前迭代次数while iterNum < self.maxIter:self.random_seed()                                                 # 使整个蚁群产生随机的起始点delta_phero_mat = np.zeros((self.cities_num, self.cities_num))     # 初始化每次迭代后信息素矩阵的增量##########################################################################for i in range(self.ants_num):city_index1 = self.path_seed[i]                                # 每只蚂蚁访问的第一个城市下标ant_path = Path(self.cities[city_index1])                      # 记录每只蚂蚁访问过的城市tabu = [city_index1]                                           # 记录每只蚂蚁访问过的城市下标,禁忌城市下标列表non_tabu = list(set(range(self.cities_num)) - set(tabu))for j in range(self.cities_num-1):                             # 对余下的城市进行访问up_proba = np.zeros(self.cities_num-len(tabu))             # 初始化状态迁移概率的分子for k in range(self.cities_num-len(tabu)):up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) * \np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)proba = up_proba/sum(up_proba)                             # 每条可能子路径上的状态迁移概率while True:                                                # 提取出下一个城市的下标random_num = np.random.rand()index_need = np.where(proba > random_num)[0]if len(index_need) > 0:city_index2 = non_tabu[index_need[0]]breakant_path.add_path(self.cities[city_index2])tabu.append(city_index2)non_tabu = list(set(range(self.cities_num)) - set(tabu))city_index1 = city_index2self.ants_info[iterNum][i] = Ant(ant_path.path).lengthif iterNum == 0 and i == 0:                                    # 完成对最佳路径城市的记录self.best_cities = ant_path.pathelse:if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities = ant_path.pathtabu.append(tabu[0])                                           # 每次迭代完成后,使禁忌城市下标列表形成完整闭环for l in range(self.cities_num):delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]self.best_path[iterNum] = Ant(self.best_cities).lengthself.update_phero_mat(delta_phero_mat)                             # 更新信息素矩阵iterNum += 1def update_phero_mat(self, delta):self.phero_mat = (1 - self.rho) * self.phero_mat + delta# self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判断是否超过浓度上限def random_seed(self):                                                     # 产生随机的起始点下表,尽量保证所有蚂蚁的起始点不同if self.ants_num <= self.cities_num:                                   # 蚂蚁数 <= 城市数self.path_seed[:] = np.random.permutation(range(self.cities_num))[:self.ants_num]else:                                                                  # 蚂蚁数 > 城市数self.path_seed[:self.cities_num] = np.random.permutation(range(self.cities_num))temp_index = self.cities_numwhile temp_index + self.cities_num <= self.ants_num:self.path_seed[temp_index:temp_index + self.cities_num] = np.random.permutation(range(self.cities_num))temp_index += self.cities_numtemp_left = self.ants_num % self.cities_numif temp_left != 0:self.path_seed[temp_index:] = np.random.permutation(range(self.cities_num))[:temp_left]def display(self):                                                         # 数据可视化展示plt.figure(figsize=(6, 10))plt.subplot(211)plt.plot(self.ants_info, 'g.')plt.plot(self.best_path, 'r-', label='history_best')plt.xlabel('Iteration')plt.ylabel('length')plt.legend()plt.subplot(212)plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')plt.xlabel('x')plt.ylabel('y')plt.savefig('ACO.png', dpi=500)plt.show()plt.close()ACO()

输出:


参考文献

[1]https://www.cnblogs.com/xxhbdk/p/9177423.html
[2]《matlab在数学建模中的应用》

深度学习经典算法 | 蚁群算法解析相关推荐

  1. 【其他】结构技术优化算法--蚁群算法(ant colony optimization)

    目录 1 遗传基因算法 2 模拟退火算法 2.1爬山算法 2.2随机概率优化 3 群体智能算法 3.1蚁群算法 3.2粒子群算法 4总结 1 遗传基因算法 遗传算法(Genetic Algorithm ...

  2. python闭环最短路径_深度学习经典算法 | 蚁群算法解析

    蚁群算法基本思想 蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题.根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发 ...

  3. Python实现VRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 ...

  4. matlab教程蚁群算法,蚁群算法怎样用MATLAB仿真

    蚁群算法采用matlab开发的仿真平台:算法实现,路径显示,人机交互控制等 希望对你有帮助! 是可以运行的 %    the procedure of ant colony algorithm for ...

  5. 【进阶四】Python实现(MD)HVRP常见求解算法——蚁群算法(ACO)

    蚁群算法+Split 求解异构车辆路径规划问题 目录 信息传递 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 信息传递 python实现6种智能 ...

  6. 智能算法---蚁群算法介绍

    蚁群算法是一种群智能算法,也是启发式算法.基本原理来源于自然界蚂蚁觅食的最短路径原理. (一)蚁群算法的由来 蚁群算法最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中, ...

  7. 【进阶一】Python实现MDCVRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现蚁群算法(ACO)对多车场车辆路径规划问题(MDCVRP)进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. ...

  8. 蚁群优化算法的JAVA实现_优化算法|蚁群算法的理解及实现

    蚁群算法 1. 蚁群算法基本原理 蚁群算法(Ant Colony Algorithm, ACA)由Marco Dorigo于1992年提出. 蚁群原理: 蚁群算法的基本原理来源于自然界觅食的最短路径原 ...

  9. 计算智能-群智能算法-蚁群算法matlab实现

    方法一:Main_0 信息素跟随蚂蚁一步一变化(已完成,信息素变化函Pheromones_Change_0) 方法二:Main_1 信息素在蚂蚁走完一圈后一次性变化(Main1已完成,信息素变化函数P ...

最新文章

  1. SpringBoot上传文件大小限制
  2. 《树莓派Python编程指南》——2.3 小结
  3. 这个AI能帮你女朋友自拍:从照片生成3D视频,总有个角度让她满意
  4. 让我们来开发一种更类似人脑的神经网络吧(五)
  5. 我们为什么要接受教育
  6. 设计模式 之 桥接模式
  7. 信息学奥赛C++语言: 趣味整数5(勾股数)
  8. flutter优缺点_混合开发框架最全对比,为什么我更推荐Flutter?
  9. linux系统ssh服务无法启动,Linux上的SSH无法启动
  10. 自定义键盘组件_一文读懂!iOS系统组件的设计规范全解!
  11. 计划任务中使用NT AUTHORITY\SYSTEM用户和普通管理员用户有什么差别
  12. java变量和常量_java变量和常量的区别是什么
  13. Atitit 数据库结果集映射 ResultSetHandler 目录 1. 常见的四种配置ResultSetHandler 1 2. Dbutil 1 3. Mybatis 致敬 3 4. H
  14. 学习韩顺平java基础笔记 (自用)
  15. Highcharts 隐藏右下角的官网链接
  16. 天野学院易语言模拟脚本制作
  17. python多行写入文件_写入文件
  18. python中路径什么意思_python路径引用r的含义
  19. 26岁,2020 - 观《人生七年》
  20. 华为 15 到 18 级的研发族社招工作岗位内推

热门文章

  1. 五子棋 AI(AIpha-beta算法)
  2. linux安装jdk环境
  3. 【机器学习】ICA 原理以及相关概率论,信息论知识简介
  4. Hadoop MapReduce执行过程(一)
  5. Visual Studio 2008 每日提示(十)
  6. java基础教程知识点,[Java教程]js基础知识点总结
  7. python处理mat数据和处理png的区别_Python---利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)...
  8. 动态规划——使用最小花费爬楼梯(Leetcode 746)
  9. 二叉树——医院设置(洛谷 P1364)
  10. Oracle ADG备库SYSAUX数据文件坏块恢复处理(ORA-00600,ORA-10567,ORA-10564......