SA模拟退火求解TSP问题

算法介绍

import numpy as np
import random as rd
from matplotlib import pyplot as plt
import seaborn as snsplt.rcParams['font.serif'] = 'Times New Roman'#显示字体
plt.rcParams['axes.unicode_minus'] = False#显示正负号
plt.rcParams['font.size'] ='20'#设置字体大小#计算车城市距离
def Dis(loc):Dis = []for i in range(loc.shape[0]):Dis_ = []for j in range(loc.shape[0]):distance = np.sqrt(np.power(loc[i] - loc[j], 2).sum())Dis_.append(distance)Dis.append(Dis_)return np.array(Dis)
#路径图
def draw(path, loc):x = []for node in path:x.append(loc[node])x = np.array(x)plt.plot(x[:, 0], x[:, 1],color='blue')plt.scatter(x[:, 0], x[:, 1], s=15, color='black')plt.show()
#CA_算法
class CA_TSP():def __init__(self,path,dis,loc,iteration ,T = 150,alpha=0.95,plot=True):""":param path: 初始路径:param loc: 城市坐标位置:param iteration: 退火迭代次数:param T: 初始温度:param plot: 是否绘图:param dis: 城市之间的距离:param flag:是偶计算需要城市之间的距离:param alpha:退火速度:param loc:城市坐标"""self.path = pathself.iteration = iterationself.plot = plotself.T = Tself.dis =disself.alpha =alphaself.loc = loc# 计算路线距离从a点到b点(闭合成圈)def length(self,path,dis):length = 0for node1, node2 in zip(path[:-1], path[1:]):length += dis[node1][node2]length = length + dis[path[-1]][path[0]]#闭合总长return length# 随机交换路径中的两个点,产生新的路径def New_path(self,path):if rd.random()>0.5:node = rd.sample(path, 2)path_ = []for i in range(len(path)):path_.append(path[i])temp = path[node[1]]path_[node[1]] = path[node[0]]path_[node[0]] = tempreturn path_#三角换效果一般#可能是参数选取的原因else:node = rd.sample(path, 3)path_ = []for i in range(len(path)):path_.append(path[i])temp0 = path[node[0]]temp1 = path[node[1]]temp2 = path[node[2]]path_[node[0]]=temp2path_[node[1]]=temp0path_[node[2]]=temp1return path_#主程序def run(self):l = []while self.T > 1:for i in range(self.iteration):newPath = self.New_path(self.path)  # 比较路径distanceDif = self.length(newPath, self.dis) - self.length(self.path, self.dis)  # 距离差值if distanceDif < 0:self.path = newPath  # 接受新的解else:  # 以概率exp(-ΔT/T)接受新的解if rd.random() < np.exp(- distanceDif / self.T):  # random()方法返回随机生成的一个实数,它在[0,1)范围内self.path = newPathl.append(self.length(self.path, self.dis))self.T = self.alpha * self.T# print(f'当前温度{self.T}',end='\n')print(f'最优路径-->>:{np.round(self.path,2)}')print(f'最优解 -->>:{self.length(self.path, self.dis)}')if self.plot:#收敛曲线与路径线路图plt.rcParams['font.sans-serif'] = ['SimHei']sns.set_style('white')sns.despine(top=True, right=True, )plt.grid(alpha=0.5)plt.plot(l,color='blue')s=r'路径是闭合总长,但绘图并没有闭合,以便看出首尾'plt.title(s)# plt.tight_layout()plt.show()return self.path, l
if __name__=='__main__':#测试数据1# loc = 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]])#存入本地文件数据loc = np.loadtxt(r'./location.txt', dtype='float')loc_N =loc.shape[0]path = list(range(loc_N))rd.shuffle(path)  # 初始路径dis = Dis(loc)#计算城市距离path,l = CA_TSP(path,dis,iteration=10000,T = 1000,plot=True,alpha=0.96,loc=loc).run()#返回路径与每次迭代的结果draw(path, loc)

SA模拟退火求解TSP问题相关推荐

  1. 模拟退火求解TSP问题

    模拟退火求解TSP问题 模拟退火算法步骤 1.寻找下一个解 2.计算下一个解的能量 3.决定是否接受这个解 4.降温 算法模板 double randfloat() {return rand()/(R ...

  2. 局部搜索、模拟退火和遗传算法求解TSP问题

    模拟退火和遗传算法求解TSP问题 源代码传送门:GITHUB 数据传送门:TSPLIB 文章目录 模拟退火和遗传算法求解TSP问题 摘要 1 导言 1.1 问题重述 1.2 TSP问题选择 1.3 思 ...

  3. 模拟退火算法 java_转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享...

    以下文章来源于数据魔术师 ,作者周航 前言 大家好呀!我们你们好久不见的...咳咳,初次见面的小编! 之前重新整理了ILS的代码,有人留言问能不能提供java版. 正好最近在学启发式算法和java,为 ...

  4. 求解TSP的改进模拟退火算法研究

    文章目录 一.理论基础 1.传统模拟退火算法 (1)模拟退火算法基本原理 (2)模拟退火算法模型流程 <1> 编码方式 <2> 目标函数 <3> 冷却进度表 < ...

  5. 用模拟退火算法求解TSP问题

    模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法.该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概 ...

  6. 五种常见启发式算法求解TSP问题-总结篇

    1. 前言 本文将总结先前设计的五个启发式算法的求解效果,算法文章如下表: 智能优化算法类别 启发式算法求解TSP问题系列博文 进化算法 遗传算法求解TSP问题 仿人智能优化算法 禁忌搜索算法求解TS ...

  7. 【运筹优化】求解TSP问题的算法合辑 + Java代码实现

    文章目录 一.算法合辑 1.1 SA模拟退火算法 1.2 TS禁忌搜索算法 1.3 ACO蚁群算法 1.4 GA遗传算法 1.5 ILS迭代局部搜索算法 1.6 VNS变邻域搜索算法 1.7 ALNS ...

  8. 禁忌搜索算法求解TSP旅行商问题C++(2020.11.19)

    TS算法求解TSP问题C++ 1.禁忌搜索算法 1.1 基本思想及主要特点 1.2 基本概念 1.3 算法流程 2. TS求解TSP问题的C++实现 2.1 输入数据文件:bayg29.tsp 2.2 ...

  9. 计算机设计大赛国奖作品_5. 模拟退火求解旅行商问题

    计算机设计大赛国奖作品_5. 模拟退火求解旅行商问题 本系列是2021年中国大学生计算机设计大赛作品"环境监测无人机航线优化"的相关文档,获得2021年西北赛区一等奖,国赛三等奖. ...

最新文章

  1. 1.3亿突触、数万神经元,谷歌、哈佛发布史上最强三维人脑地图
  2. 把技术卖给不懂技术的人
  3. (chap4 IP协议) 路由控制表(Routing Table)
  4. 微软OTech第二次会议(广州站)
  5. java的equals方法_Java Date equals()方法与示例
  6. 2021中国集成电路行业投资市场研究报告
  7. Java中类变量(静态变量)和实例变量区别
  8. NGINX基于Tomcat配置负载均衡
  9. Java 泛型(generics)
  10. VMware下CentOS6.8配置GFS文件系统
  11. jde多目标_《和平精英》PEL职业联赛S3赛季:DKG战队获第四周周冠军,JDE“逆风翻盘”...
  12. Bailian4042 Rabin-Karp字符串匹配【文本】
  13. mac vscode 背景半透明_武装Mac|常用MacBook软件分类汇总
  14. B站后台源码疑似泄露,作为程序员我们得注意哪些?
  15. DOS命令学习(从入门到精通)
  16. WebP是什么格式?如何免费批量转换JPEG
  17. OLED屏幕应用实验
  18. 脑电情绪识别的学习过程
  19. cisco packet tracer 介绍
  20. LintCode 1218. 补数 JavaScript算法

热门文章

  1. 我搞自由职业怎么样了
  2. 基于python的极简版家用网盘(使用bottle)
  3. 基于C语言的池塘夜降彩色雨设计
  4. android Notifications通知
  5. 华为三层交换机路由配置案例_华为三层交换机配置实例一例
  6. 菜鸟mysql四分钟导入千万级别的数据
  7. rowspan无效_关于在 table 中给 td 设定 position:absolute 引起的 rowspan 失效的问题
  8. RoboCom大赛——7-1懂得都懂
  9. CH4-程序活动单元Activity
  10. python基础编程练习题,Python随笔27:Python基础编程练习题19~20