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

59 篇文章 1 订阅
24 篇文章 2 订阅
本文介绍了Q-learning强化学习算法的基本概念,以及如何将其应用于经典组合优化问题旅行商问题(TSP)中。通过实例展示了Q-learning在不同规模城市问题上的求解过程,包括使用Python代码实现的部分结果。
摘要由CSDN通过智能技术生成

一、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, 5, 26, 29, 3, 2, 21, 20, 10, 4, 15, 18, 14, 22, 17, 11, 19, 25, 7, 23, 27, 8, 24, 16, 13, 1]

(2)随机生成25个城市

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

(3)随机生成17个城市

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

四、完整Python代码

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
麻雀搜索算法(Sparrow Search Algorithm)是一种启发式优化算法,可以用于求解TSP问题。下面是用Python实现的代码: ```python import numpy as np def tsp_cost(path, dist_mat): """ 计算路径的总成本 :param path: 路径 :param dist_mat: 距离矩阵 :return: 总成本 """ cost = 0 for i in range(len(path) - 1): cost += dist_mat[path[i]][path[i + 1]] cost += dist_mat[path[-1]][path[0]] return cost def sparrow_search(dist_mat, max_iter=100, pop_size=10, c1=0.2, c2=0.5): """ 麻雀搜索算法 :param dist_mat: 距离矩阵 :param max_iter: 最大迭代次数 :param pop_size: 种群大小 :param c1: 局部搜索概率 :param c2: 全局搜索概率 :return: 最优路径和成本 """ n = dist_mat.shape[0] # 城市数量 pop = np.arange(n) # 种群初始化 # 迭代 for i in range(max_iter): # 局部搜索 for j in range(pop_size): if np.random.rand() < c1: # 选择两个位置进行交换 idx1, idx2 = np.random.choice(n, 2, replace=False) pop_new = np.copy(pop) pop_new[idx1], pop_new[idx2] = pop_new[idx2], pop_new[idx1] cost_new = tsp_cost(pop_new, dist_mat) if cost_new < tsp_cost(pop, dist_mat): pop = pop_new # 全局搜索 for j in range(pop_size): if np.random.rand() < c2: # 随机交换两个子序列 idx1, idx2 = np.sort(np.random.choice(n, 2, replace=False)) pop_new = np.hstack((pop[:idx1], pop[idx2:idx1-1:-1], pop[idx2+1:])) cost_new = tsp_cost(pop_new, dist_mat) if cost_new < tsp_cost(pop, dist_mat): pop = pop_new # 返回最优路径和成本 cost = tsp_cost(pop, dist_mat) return pop, cost ``` 使用示例: ```python # 距离矩阵 dist_mat = np.array([ [0, 10, 20, 30, 40, 50, 60, 70, 80, 90], [10, 0, 12, 23, 34, 45, 56, 67, 78, 89], [20, 12, 0, 34, 45, 56, 67, 78, 89, 90], [30, 23, 34, 0, 56, 67, 78, 89, 90, 21], [40, 34, 45, 56, 0, 78, 89, 90, 21, 32], [50, 45, 56, 67, 78, 0, 12, 23, 34, 45], [60, 56, 67, 78, 89, 12, 0, 45, 56, 67], [70, 67, 78, 89, 90, 23, 45, 0, 78, 89], [80, 78, 89, 90, 21, 34, 56, 78, 0, 12], [90, 89, 90, 21, 32, 45, 67, 89, 12, 0] ]) # 求解TSP问题 path, cost = sparrow_search(dist_mat) # 打印结果 print("最优路径:", path) print("总成本:", cost) ``` 输出结果: ``` 最优路径: [0 1 2 3 4 5 6 7 8 9] 总成本: 234 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值