强化学习求解TSP(三):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介

Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获得的累积奖励。

Q-learning的训练过程如下:

1. 初始化Q值函数,将所有状态-动作对的Q值初始化为0。

2. 在每个时间步,根据当前状态选择一个动作。可以使用ε-greedy策略来平衡探索和利用。

3. 执行选择的动作,并观察环境返回的奖励和下一个状态。

4. 根据Q值函数的更新规则更新Q值。Q值的更新公式为:Q(s, a) = Q(s, a) + α * (r + γ * max(Q(s', a')) - Q(s, a)),其中α是学习率,γ是折扣因子,r是奖励,s是当前状态,a是选择的动作,s'是下一个状态,a'是在下一个状态下选择的动作。

5. 重复步骤2-4,直到达到停止条件。

Q-learning的优点是可以在没有先验知识的情况下自动学习最优策略,并且可以处理连续状态和动作空间。它在许多领域中都有广泛的应用,如机器人控制、游戏策略和交通路线规划等。

二、TSP问题介绍

旅行商问题(Traveling salesman problem, TSP)是一个经典的组合优化问题,它可以描述为一个商品推销员去若干城市推销商品,要求遍历所有城市后回到出发地,目的是选择一个最短的路线。当城市数目较少时,可以使用穷举法求解。而随着城市数增多,求解空间比较复杂,无法使用穷举法求解,因此需要使用优化算法来解决TSP问题。TSP问题的应用非常广泛,不仅仅适用于旅行商问题本身,还可以用来解决其他许多的NP完全问题,如邮路问题、转配线上的螺母问题和产品的生产安排问题等等。因此,对TSP问题的有效求解具有重要意义。解决TSP问题的方法有很多,其中一种常用的方法是蚁群算法。除了蚁群算法,还有其他一些常用的解决TSP问题的方法,如遗传算法、动态规划和强化学习等。这些方法各有特点,适用于不同规模和特征的TSP问题。

三、Qlearning求解TSP问题

1、部分代码

可以自动生成地图也可导入自定义地图,只需要修改如下代码中chos的值即可。

import matplotlib.pyplot as plt
from Qlearning import Qlearning
#Chos: 1 随机初始化地图; 0 导入固定地图
chos=1
node_num=36 #当选择随机初始化地图时,自动随机生成node_num-1个城市
# 创建对象,初始化节点坐标,计算每两点距离
qlearn = Qlearning(alpha=0.5, gamma=0.01, epsilon=0.5, final_epsilon=0.05,chos=chos,node_num=node_num)
# 训练Q表、打印路线
iter_num=1000#训练次数
Curve,BestRoute,Qtable,Map=qlearn.Train_Qtable(iter_num=iter_num)
#Curve 训练曲线
#BestRoute 最优路径
#Qtable Qlearning求解得到的在最优路径下的Q表
#Map TSP的城市节点坐标## 画图
plt.figure()
plt.ylabel("distance")
plt.xlabel("iter")
plt.plot(Curve, color='red')
plt.title("Q-Learning")
plt.savefig('curve.png')
plt.show()

2、部分结果

(1)以国际通用的TSP实例库TSPLIB中的测试集bayg29为例:

Q-learning得到的最短路线: [1, 28, 6, 12, 9, 3, 29, 26, 5, 21, 2, 20, 10, 4, 15, 18, 14, 22, 17, 11, 19, 25, 7, 23, 27, 8, 24, 16, 13, 1]

(2)随机生成20个城市

Q-learning得到的最短路线: [1, 15, 9, 17, 11, 18, 12, 13, 8, 5, 3, 14, 19, 20, 6, 2, 4, 10, 7, 16, 1]

(3)随机生成25个城市

Q-learning得到的最短路线: [1, 4, 22, 14, 5, 7, 20, 6, 11, 3, 2, 25, 13, 17, 24, 21, 12, 8, 9, 16, 10, 18, 15, 23, 19, 1]

四、完整Python代码

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring 篇】注解之舞:Spring AOP的优雅表演

欢迎来到Spring的代码舞台,在这里,我们将沉浸在一场注解之舞的盛宴中。今天我们将探讨如何使用注解方式实现Spring AOP,一种优雅而富有表现力的编程技术。 AOP的魅力 在编程的舞台上,AOP(Aspect-Oriented Programmin…

CMU15-445-Spring-2023-Project #2 - 前置知识(lec07-010)

Lecture #07_ Hash Tables Data Structures Hash Table 哈希表将键映射到值。它提供平均 O (1) 的操作复杂度(最坏情况下为 O (n))和 O (n) 的存储复杂度。 由两部分组成: Hash Function和Hashing Scheme(发生冲突后的处理&…

[论文阅读]YOLO9000:Better,Faster,Stronger

摘要 我们引入了YOLO9000,一个可以检测超过9000种类别的先进的实时目标检测系统。首先我们提出了多种yolo检测方法的提升方式,既新颖又参考了 之前的工作。改进后的模型,YOLOV2在标准检测任务例如PASCAL VO 和COCO 上都取得了领先。使用一个…

每天学习一点点之 Spring Boot 1.x 升级 2.x 之 allowBeanDefinitionOverriding

最近组内大佬正在进行 Spring Boot 版本的升级,从 1.x 版本升级到 2.x 版本。在查看代码变更时,我注意到我之前编写的一个名为 ShardingRuleStrategy 的类被添加了 Primary 注解。这个类在原来的代码中被标记为 Component,同时也在 API 中被定…

Android开发基础(一)

Android开发基础(一) 本篇主要是从Android系统架构理解Android开发。 Android系统架构 Android系统的架构采用了分层的架构,共分为五层,从高到低分别是Android应用层(System Apps)、Android应用框架层&a…

Python基础知识:整理9 文件的相关操作

1 文件的打开 # open() 函数打开文件 # open(name, mode, encoding) """name: 文件名(可以包含文件所在的具体路径)mode: 文件打开模式encoding: 可选参数,表示读取文件的编码格式 """ 2 文件的读取 文…

Qt During startup program exited with code 0xc0000135

网上试了好多办法没有用,可以试试在pro目录下加入如图所示的.dll 可以下个everything搜索整个电脑查看是否有上述dll,如果没有也可以网上下载或者点击连接

文心大模型融入荣耀MagicOS!打造大模型“端云协同”创新样板

2024年1月10日,在荣耀MagicOS 8.0发布会及开发者大会上,荣耀终端有限公司CEO赵明宣布了“百模生态计划”,并与百度集团执行副总裁、百度智能云事业群总裁沈抖共同宣布,百度智能云成为荣耀大模型生态战略合作伙伴。 沈抖在现场演讲…

【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰

在上一篇博客(【UE Niagara学习笔记】04 - 火焰喷射时的黑烟效果)的基础上继续实现在火焰喷射的起点位置生成蓝色火焰的效果。 目录 效果 步骤 1. 创建新的发射器 2. 减少粒子生成数量 3. 减小粒子初始大小 4. 减少粒子喷射距离 5. 减少粒子初始…

网络服务DHCP与DNS

一.DHCP 1.DHCP概念 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 通常被应用在大型的局域网络环境中,主要作用是集中地管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务…

xss-labs(10-16)

level10:欢迎来到level10 尝试注入 <script>alert(欢迎来钓鱼)</script> 寻找注入点 让表单显示出来 随便输入一个字符康康 url出现了变化</

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法&#xff0c;采用 Scala 语言实现&#xff0c;是把一个 64 位的 long 型的 id&#xff0c;1 个 bit 是不用的&#xff0c;用其中的 41 bits 作为毫秒数&#xff0c;用 10 bits 作为工作机器 id&#xff0c;12 …