文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【路径规划】全局路径规划算法——蚁群算法(含python实现)

2023-09-22 19:00

关注

文章目录

参考资料

1. 简介

蚁群算法(Ant Colony Algorithm, ACO) 于1991年首次提出,该算法模拟了自然界中蚂蚁的觅食行为。蚂蚁在寻找食物源时, 会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。 信息素浓度的大小表征路径的远近信息素浓度越高, 表示对应的路径距离越短。通常, 蚂蚁会以较大的概率优先选择信息素浓度较高的路径, 并释放一定量的信息素, 以增强该条路径上的信息素浓度, 这样,会形成一个正反馈。 最终, 蚂蚁能够找到一条从巢穴到食物源的最佳路径, 即距离最短。

2. 基本思想

3. 算法精讲

不失一般性,我们定义一个具有N个节点的有权图 G = ( N , A ) G=(N,A) G=(N,A),其中N表示节点集合 N = 1,2,...,n N={1,2,...,n} N=1,2,...,n,A表示边, A = (i,j)∣i,j∈N A={(i,j)|i,j\in N} A=(i,j)i,jN。节点之间的距离(权重)设为 ( d i j ) n × n (d_{ij})_{n\times n} (dij)n×n目标函数即最小化起点到终点的距离之和。

4. 算法步骤

  1. 对相关参数进行初始化,如蚁群规模(蚂蚁数量) m m m、信息素重要程度因子 α \alpha α、启发函数重要程度因子 β \beta β、信息素挥发因子 ρ \rho ρ、信息素常数 Q Q Q、最大迭代次数 i t e r m a x itermax itermax

  2. 构建解空间,将各个蚂蚁随机地置于不同的出发点,为每只蚂蚁确定当前候选道路集

  3. 更新信息素计算每个蚂蚁经过路径长度 L k ( k = 1 , 2 , … , m ) L_k(k=1,2,…,m) Lk(k=1,2,m),记录当前迭代次数中的最优解(最短路径)。同时,对各个节点连接路径上信息素浓度进行更新。

  4. 判断是否终止若 i t e r < i t e r m a x iteriter<itermax,则令 i t e r = i t e r + 1 iter=iter+1 iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。

5. python实现

使用蚁群算法解决旅行商问题(TSP),代码来自博客

import numpy as npimport matplotlib.pyplot as plt# 城市坐标(52个城市)coordinates = np.array([[565.0,575.0],[25.0,185.0],[345.0,750.0],[945.0,685.0],[845.0,655.0],            [880.0,660.0],[25.0,230.0],[525.0,1000.0],[580.0,1175.0],[650.0,1130.0],            [1605.0,620.0],[1220.0,580.0],[1465.0,200.0],[1530.0,  5.0],[845.0,680.0],            [725.0,370.0],[145.0,665.0],[415.0,635.0],[510.0,875.0],[560.0,365.0],            [300.0,465.0],[520.0,585.0],[480.0,415.0],[835.0,625.0],[975.0,580.0],            [1215.0,245.0],[1320.0,315.0],[1250.0,400.0],[660.0,180.0],[410.0,250.0],            [420.0,555.0],[575.0,665.0],[1150.0,1160.0],[700.0,580.0],[685.0,595.0],            [685.0,610.0],[770.0,610.0],[795.0,645.0],[720.0,635.0],[760.0,650.0],            [475.0,960.0],[95.0,260.0],[875.0,920.0],[700.0,500.0],[555.0,815.0],            [830.0,485.0],[1170.0, 65.0],[830.0,610.0],[605.0,625.0],[595.0,360.0],            [1340.0,725.0],[1740.0,245.0]])def getdistmat(coordinates):    num = coordinates.shape[0]    distmat = np.zeros((52, 52))    for i in range(num):        for j in range(i, num):            distmat[i][j] = distmat[j][i] = np.linalg.norm(                coordinates[i] - coordinates[j])    return distmat# #//初始化distmat = getdistmat(coordinates)numant = 45 ##// 蚂蚁个数numcity = coordinates.shape[0] ##// 城市个数alpha = 1 ##// 信息素重要程度因子beta = 5 ##// 启发函数重要程度因子rho = 0.1 ##// 信息素的挥发速度Q = 1 ##//信息素释放总量iter = 0##//循环次数itermax = 200#//循环最大值etatable = 1.0 / (distmat + np.diag([1e10] * numcity)) #// 启发函数矩阵,表示蚂蚁从城市i转移到矩阵j的期望程度pheromonetable = np.ones((numcity, numcity)) #// 信息素矩阵pathtable = np.zeros((numant, numcity)).astype(int) #// 路径记录表distmat = getdistmat(coordinates) #// 城市的距离矩阵lengthaver = np.zeros(itermax) #// 各代路径的平均长度lengthbest = np.zeros(itermax) #// 各代及其之前遇到的最佳路径长度pathbest = np.zeros((itermax, numcity)) #// 各代及其之前遇到的最佳路径长度#//核心点-循环迭代while iter < itermax:    #// 随机产生各个蚂蚁的起点城市    if numant <= numcity:        #// 城市数比蚂蚁数多        pathtable[:, 0] = np.random.permutation(range(0, numcity))[:numant]    else:        #// 蚂蚁数比城市数多,需要补足        pathtable[:numcity, 0] = np.random.permutation(range(0, numcity))[:]        pathtable[numcity:, 0] = np.random.permutation(range(0, numcity))[            :numant - numcity]    length = np.zeros(numant)  # 计算各个蚂蚁的路径距离    for i in range(numant):        visiting = pathtable[i, 0]  # 当前所在的城市        unvisited = set(range(numcity))  # 未访问的城市,以集合的形式存储{}        unvisited.remove(visiting)  # 删除元素;利用集合的remove方法删除存储的数据内容        for j in range(1, numcity):  # 循环numcity-1次,访问剩余的numcity-1个城市            # 每次用轮盘法选择下一个要访问的城市            listunvisited = list(unvisited)            probtrans = np.zeros(len(listunvisited))            for k in range(len(listunvisited)):                probtrans[k] = np.power(pheromonetable[visiting][listunvisited[k]], alpha) \                    * np.power(etatable[visiting][listunvisited[k]], beta)            cumsumprobtrans = (probtrans / sum(probtrans)).cumsum()            cumsumprobtrans -= np.random.rand()            k = listunvisited[(np.where(cumsumprobtrans > 0)[0])[0]]            # 元素的提取(也就是下一轮选的城市)            pathtable[i, j] = k  # 添加到路径表中(也就是蚂蚁走过的路径)            unvisited.remove(k)  # 然后在为访问城市set中remove()删除掉该城市            length[i] += distmat[visiting][k]            visiting = k        # 蚂蚁的路径距离包括最后一个城市和第一个城市的距离        length[i] += distmat[visiting][pathtable[i, 0]]        # 包含所有蚂蚁的一个迭代结束后,统计本次迭代的若干统计参数    lengthaver[iter] = length.mean()    if iter == 0:        lengthbest[iter] = length.min()        pathbest[iter] = pathtable[length.argmin()].copy()    else:        if length.min() > lengthbest[iter - 1]:            lengthbest[iter] = lengthbest[iter - 1]            pathbest[iter] = pathbest[iter - 1].copy()        else:            lengthbest[iter] = length.min()            pathbest[iter] = pathtable[length.argmin()].copy()    # 更新信息素    changepheromonetable = np.zeros((numcity, numcity))    for i in range(numant):        for j in range(numcity - 1):            changepheromonetable[pathtable[i, j]][pathtable[i, j + 1]] += Q / distmat[pathtable[i, j]][                pathtable[i, j + 1]]  # 计算信息素增量        changepheromonetable[pathtable[i, j + 1]][pathtable[i, 0]] += Q / distmat[pathtable[i, j + 1]][pathtable[i, 0]]    pheromonetable = (1 - rho) * pheromonetable + \        changepheromonetable  # 计算信息素公式    if iter%30==0:        print("iter(迭代次数):", iter)    iter += 1  # 迭代次数指示器+1# 做出平均路径长度和最优路径长度fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))axes[0].plot(lengthaver, 'k', marker=u'')axes[0].set_title('Average Length')axes[0].set_xlabel(u'iteration')axes[1].plot(lengthbest, 'k', marker=u'')axes[1].set_title('Best Length')axes[1].set_xlabel(u'iteration')fig.savefig('average_best.png', dpi=500, bbox_inches='tight')plt.show()# 作出找到的最优路径图bestpath = pathbest[-1]plt.plot(coordinates[:, 0], coordinates[:, 1], 'r.', marker=u'$\cdot$')plt.xlim([-100, 2000])plt.ylim([-100, 1500])for i in range(numcity - 1):    m = int(bestpath[i])    n = int(bestpath[i + 1])    plt.plot([coordinates[m][0], coordinates[n][0]], [             coordinates[m][1], coordinates[n][1]], 'k')plt.plot([coordinates[int(bestpath[0])][0], coordinates[int(n)][0]],         [coordinates[int(bestpath[0])][1], coordinates[int(n)][1]], 'b')ax = plt.gca()ax.set_title("Best Path")ax.set_xlabel('X axis')ax.set_ylabel('Y_axis')plt.savefig('best path.png', dpi=500, bbox_inches='tight')plt.show()

来源地址:https://blog.csdn.net/weixin_42301220/article/details/125129090

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯