蚁群算法(ant system,AS)

news2024/9/23 23:35:47
蚁群算法

  蚂蚁系统(ant system,AS)由Dorigo于1996年发表,文章题目为[《The Ant System : optimization by a colony of cooperating agents》](https://www.docin.com/p-1565494487.html)。在耳熟能详的TSP旅行商问题上AS算法有着不错的效果,这也是被大多数人认可的一种随机演化算法。

蚁群算法的思想来源于蚂蚁觅食的过程:

  • 单个蚂蚁的行为比较简单
  • 但蚁群在不同的环境下,能寻找到达食物源的最短路径
  • 蚂蚁在其经过的路径上释放“信息素”
  • 蚁群内的蚂蚁会沿着“信息素”浓度较高的路径行走,形成正反馈
  • 人工蚂蚁可以超越真实蚂蚁,如具有有限记忆存储能力

   一般而言机器智慧都是产生于多个个体之间的“交流”,如当下比较火的深度学习,层与层之间链接方式是尤为关键的,后续的传播方向就是由这些链接来决定的,又比如传统的群体智能优化算法PSO,一个种群之中个体和最优个体之间有一种交流,就是个体向最优个体学习,而蚁群算法中的个体交流像是人类阅读图书跟前人交流,蚂蚁通过“阅读”前人留下的“信息素”来更好的判断下一步要怎么走,人类社会中也有老话:不听老人言吃亏在眼前,所以蚂蚁跟着“信息素”走能够极大地保证单只蚂蚁的行为是普遍正确的。
  如果蚁群中只有一只蚂蚁,这显然是不行的,单只蚂蚁的智慧能力比较局限,它只能和上一个自己进行“交流”并且效率十分低,所以一般认为单只蚂蚁是很难产生智慧的。一个蚁群就像是一个人类社会,无论在长江黄河流域还是在黄土高原地区,当地的人们总能找到一种适合自己生存的方式,而蚂蚁觅食也是如此,在一定时间的演化下,蚂蚁的“信息素”就如同人类社会的书籍一般宝贵。另外,人工蚂蚁相较于真实的蚂蚁具有很多优势,例如,只要计算机的内存足够大,那么蚂蚁的记忆是无限的,对于真实的生物来说,这显然是不能达到的,毕竟总要遗忘。
蚁群算法的过程:

  • 初始化:城市数n、距离矩阵d、蚂蚁数量、沉积常数、挥发率、每条边的初始信息素。
  • while 条件不满足
  • 构建每个蚂蚁的路径(随机比例+轮盘赌)
  • 计算每个蚂蚁的路劲总长度
  • 更新每条边的信息素(全局信息素更新:沉积+挥发)
  • end
    构建蚂蚁路径:
  • 第k只蚂蚁,已访问城市集合 C k C_{k} Ck
  • 对每一个未访问的城市j,计算随机比例: p i j ( k ) = τ i j α / d i j β ∑ m ∉ C k τ i m α / d i m β p^{(k)}_{ij}=\frac{τ^{α}_{ij}/d^{β}_{ij}}{\sum_{m\notin{C_{k}}}τ^{α}_{im}/d^{β}_{im}} pij(k)=m/Ckτimα/dimβτijα/dijβ
  • 让蚂蚁k以上述随机比例(轮盘赌)到达城市j
    信息素更新
  • 所有蚂蚁的路径构建完毕后,进行信息素的更新
    τ i j = ( 1 − ρ ) τ i j + ∑ k = 1 N Δ τ i j ( k ) τ_{ij}=(1-ρ)τ_{ij}+\sum^{N}_{k=1}{\Delta \tau^{(k)}_{ij}} τij=(1ρ)τij+k=1NΔτij(k)
    Δ τ i j ( k ) = { Q / L k , 边 ( i , j ) 在 蚂 蚁 k 的 路 径 上 0 , 其 他 \Delta τ^{(k)}_{ij} =\left\{\begin{aligned} Q/L_{k} ,& 边(i,j)在蚂蚁k的路径上\\ 0,其他\end{aligned}\right. Δτij(k)={Q/Lk,0,(i,j)k
    典型的TSP问题:
      一个典型的TSP问题就是中国31个省会都走一次的最短路径。本文就以这个问题为例实现AS算法。
    城市信息:
from matplotlib import pyplot as plt
import numpy as np
import random

locations={
    '拉萨':(1304,2312),
    '北京':(3639,1315),
    '上海':(4177,2244),
    '天津':(3712,1399),
    '石家庄':(3488,1535),
    '太原':(3326,1556),
    '呼和浩特':(3238,1229),
    '沈阳':(4196,1004),
    '长春':(4312,790),
    '哈尔滨':(4386,570),
    '西安':(3007,1970),
    '兰州':(2562,1756),
    '银川':(2788,1491),
    '西宁':(2381,1676),
    '乌鲁木齐':(1332,695),
    '济南':(3715,1678),
    '南京':(3918,2179),
    '杭州':(4061,2370),
    '合肥':(3780,2212),
    '南昌':(3676,2578),
    '福州':(4029,2838),
    '台北':(4263,2931),
    '郑州':(3429,1908),
    '武汉':(3507,2367),
    '长沙':(3394,2643),
    '广州':(3439,3201),
    '南宁':(2935,3240),
    '海口':(3140,3550),
    '成都':(2545,2357),
    '贵阳':(2778,2826),
    '昆明':(2370,2975)
}

初始化:

n=len(locations)  #城市数量
dis=np.zeros((n,n)) # 距离矩阵
τ=np.ones((n,n))*1e-6 # 初始信息素
position=list(locations.values())

# 计算城市之间距离
for i in range(n):
    for j in range(i+1,n):
        dis[i,j]=np.linalg.norm(np.array(position[i])-np.array(position[j]))
        dis[j,i]=dis[i,j]


# parameter`在这里插入代码片`
N=n # 蚂蚁数量
Q=20 # 沉积常数
ρ=0.618 #挥发率
α=1
β=6
city=set(range(n)) #城市标记0-30
# C=[[set([i]),[i],set(),0] for i in range(N)] # 已访问城市集合 Ck为第k个蚂蚁访问的轨迹

def generate_ants():
    C=[]
    for _ in range(N):
        point=random.choice(range(n))
        C.append([set([point]),[point],set(),0])
    return C
C=generate_ants() #生成蚁群,其中每个蚂蚁用[走过的城市,按顺序走过的城市,路径,距离]来表示

构建蚁群路径:

def build_path():
    for ant in range(N):
        no_visit=city-C[ant][0]
        p=np.zeros((n))
        while no_visit:
            denominator=sum(map(lambda x:τ[C[ant][1][-1],x]**α/dis[C[ant][1][-1],x]**β,no_visit))
            for j in no_visit:
                p[j]=(τ[C[ant][1][-1],j]**α/dis[C[ant][1][-1],j]**β)/denominator
            for j in range(1,n):
                p[j]=p[j]+p[j-1]
            q=random.random()
            for j in range(n):
                if q<p[j]:
                    break
            C[ant][0].add(j)
            C[ant][2].add((C[ant][1][-1],j))
            C[ant][3]+=dis[C[ant][1][-1],j]
            C[ant][1].append(j)
            no_visit=city-C[ant][0]
            p=np.zeros((n))
        C[ant][3]+=dis[C[ant][1][-1],C[ant][1][0]]
        C[ant][2].add((C[ant][1][-1],C[ant][1][0]))

更新信息素:

def update_pheromone():
    for i in range(n):
        for j in range(i+1,n):
            τ[i][j]=(1-ρ)*τ[i][j]+sum(map(lambda x:Q/x[3] if (i,j) in x[2] or (j,i) in x[2] else 0,C))
            τ[j][i]=τ[i][j]

测试:

build_path()
update_pheromone()
best=min(C,key=lambda x:x[-1]) #获取当前蚁群的最优蚂蚁
C=generate_ants()
# C=[[set([i]),[i],set(),0] for i in range(N)]
dis_record=[best[-1]]  #最优距离记录
epoch=1000  #迭代1000次
for e in range(epoch):
    build_path()
    update_pheromone()
    temp=min(C,key=lambda x:x[-1]) 
    if temp[-1]<best[-1]:
        best=temp
    dis_record.append(best[-1]) 
    # C=[[set([i]),[i],set(),0] for i in range(N)]
    C=generate_ants()
# 绘图
plt.scatter([i[0] for i in position],[i[1] for i in position])
for k,v in locations.items():
    plt.text(v[0],v[1],k,fontproperties="simhei")
for i in best[2]:
    plt.plot([position[i[0]][0],position[i[1]][0]],[position[i[0]][1],position[i[1]][1]],color='g')
plt.title('min_dis={}'.format(best[-1]))
plt.show()

结果:
在这里插入图片描述
总结:
  目前这个问题通过CTSP求得的最优解是15378km,我调了一些参数,始终未能达到其最优的结果,以后有时间再做调整!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dynamsoft Barcode Reader C, C++, .NET, Java SDK

Dynamsoft Barcode Reader 9.6.0 支持 win/mac/linux,没有Python版本提供 Adds support for handling barcode image orientation. November 30, 2022 - 16:06 New Version Features C, C, .NET, Java and Python SDK Added support for handling image orientation. With …

为什么数据库不应该使用外键

当我们想要持久化地存储数据时&#xff0c;使用关系型数据库往往都是最稳妥的选择&#xff0c;这不仅因为今天的关系型数据库种类非常丰富并且稳定&#xff0c;还因为不同社区对关系型数据库的支持都非常完备。我们在前面的文章中曾经分析过 为什么 MySQL 的自增主键不单调也不…

利用Python处理excel表格,pandas分割表格、拆分表格

前言 记录一下&#xff0c;在使用pandas处理excel表格表格时候&#xff0c;关于分割(切分)表格这一块儿的操作。 这个系列会有三篇左右文章&#xff0c;这是第一篇&#xff0c;excel表格切割 我们常说的 excel文件&#xff0c; 在广义上&#xff0c;是指以 xls 或 xlsx 为后缀…

Compose 动画艺术探索之灵动岛

本文为稀土掘金技术社区首发签约文章&#xff0c;14天内禁止转载&#xff0c;14天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 本篇文章是此专栏的第五篇文章&#xff0c;本篇文章应该是此专栏中最后一篇直接关于动画的文章了&#xff0c;之后文章中可能会提到&#…

SpringBoot @InitBinder注解实现Bean国际化校验

参考资料 参考&#xff1a; 妥当性チェックのエラーメッセージ出力方法 (需翻墙)springMVC之InitBinder的用法1springMVC之InitBinder的用法2springMVC之InitBinder 和 ValidatorSpring MVCにおけるフォームバリデーションの適用事例【後編】 目录一. 前期准备1.1 自定义校验注…

【spark】第一章——Spark简介及环境配置

文章目录1. Spark 概述1.1 Spark 是什么1.2 Spark and Hadoop1.3 Spark or Hadoop1.4 Spark 核心模块2. Spark 快速上手2.1 创建 Maven 项目2.1.1 增加 Scala 插件2.1.2 增加依赖关系2.1.3 WordCount2.1.4 异常处理3. Spark 运行环境3.1 Local 模式3.1.1 解压缩文件3.1.2 启动 …

MATLAB源码-GRABIT从图像文件中提取数据点。

源码链接&#xff1a; https://download.csdn.net/download/tgs2033/87238015https://download.csdn.net/download/tgs2033/87238015 GRABIT从图像文件中提取数据点。 GRABIT启动用于从图像文件中提取数据的GUI程序。它能够读取BMP、JPG、TIF、GIF和PNG文件&#xff08;IMREAD…

12月3日:thinkphp模型与数据库相同的部分

定义 定义一个模型类 <?phpnamespace app\index\model; use think\Model;//定义一个User模型类 class User extends Model{//默认主键为自动识别&#xff0c;如果需要指定&#xff0c;可以设置属性//protected $pk uid; //$pk代表主键&#xff0c;primary key的缩写 } …

[附源码]Python计算机毕业设计Django基于JAVA技术的旅游信息交互系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]Python计算机毕业设计Django基于Java酒店管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

特征解耦,torch.cumprod(),np.random.seed(),plt.scatter

1.infoGAN 通常&#xff0c;我们学到的特征是混杂在一起的&#xff0c;如上图所示&#xff0c;这些特征在数据空间中以一种复杂的无序的方式进行编码&#xff0c;但是如果这些特征是可分解的&#xff0c;那么这些特征将具有更强的可解释性&#xff0c;我们将更容易的利用这些特…

BI-SQL丨MEGRE

MEGRE MEGRE语句&#xff0c;在SQL的生态圈中&#xff0c;一直都隶属于一个比较重要的位置。 要知道&#xff0c;在实际的项目应用中&#xff0c;我们经常需要从上游数据源&#xff0c;进行原始数据的抽取、清洗、存储、分析等操作&#xff0c;特别是在存储这一环节&#xff…

SpringCloud Ribbon / Feign

文章目录什么是Ribbon&#xff1f;Ribbon的作用&#xff1f;什么是Feign&#xff1f;Feign的作用&#xff1f;什么是Ribbon&#xff1f; Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具. Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供…

介绍HTTP

介绍 HTTP HTTP 协议用于客户端和服务器端之间的通信。请求访问资源的一端被称为客户端&#xff0c; 而提供资源响应的一端被称为服务器端。 HTTP 是一种不保存状态的协议&#xff0c;即无状态&#xff08;stateless&#xff09; 协议&#xff0c;它不对之前发生过的请求和响…

Kotlin高仿微信-第54篇-扫一扫

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

安卓APP源码和报告——音乐播放器

课 程 设 计 报 告 院 系&#xff1a;专 业&#xff1a;题 目&#xff1a;科 目&#xff1a;学 生&#xff1a;指导教师&#xff1a;完成时间&#xff1a;目 录 1. 引言1 1.1 目的1 1.2 背景1 2. 需求分析1 3. 系统设计1 3.1总体设计1 3.2功能设计1 4. 系统开发2 4.1…

秋招经验分享:最终我还是选择了百度

点击进入—>3D视觉工坊学习交流群自我介绍感谢工坊的邀请&#xff0c;来做这次秋招经验的分享。本科和研究生都是自动化专业&#xff0c;研究生期间做移动机器人的定位方向&#xff0c;现在是百度的一名算法工程师&#xff0c;很喜欢现在的工作环境和氛围&#xff0c;强烈推…

【LeetCode每日一题】——72.编辑距离

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 字符串 二【题目难度】 困难 三【题目编号】 72.编辑距离 四【题目描述】 给你两个单词 word…

【Linux】常用的Linux命令(初学者必读)

一、学习Linux的原因 开源&#xff0c;免费系统迭代更新系统性能稳定安全性高多任务&#xff0c;多用户耗资源少内核小应用领域广泛使用及入门容易 二、Linux常用的命令 我使用的Linux环境是在 腾讯云服务器上的Centos 7和 Xshell。 下面我把常用的一些命令分成了几个部分&am…

VPS8505 微功率隔离电源专用芯片2.3-6VIN/24V/1A 功率管 替代金升阳模块

文章目录 前言一、是什么&#xff1f;二、特点三、应用领域四、简化应用五、引脚及功能六、参数测试电路 总结前言 隔离电源市场&#xff0c;一直被塑封模块产品占领&#xff0c;之前国内无专业 做隔离芯片的厂家&#xff0c;市场以模块厂进口芯片方案为主&#xff1b;…