SA模拟退火求解TSP问题
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问题相关推荐
- 模拟退火求解TSP问题
模拟退火求解TSP问题 模拟退火算法步骤 1.寻找下一个解 2.计算下一个解的能量 3.决定是否接受这个解 4.降温 算法模板 double randfloat() {return rand()/(R ...
- 局部搜索、模拟退火和遗传算法求解TSP问题
模拟退火和遗传算法求解TSP问题 源代码传送门:GITHUB 数据传送门:TSPLIB 文章目录 模拟退火和遗传算法求解TSP问题 摘要 1 导言 1.1 问题重述 1.2 TSP问题选择 1.3 思 ...
- 模拟退火算法 java_转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享...
以下文章来源于数据魔术师 ,作者周航 前言 大家好呀!我们你们好久不见的...咳咳,初次见面的小编! 之前重新整理了ILS的代码,有人留言问能不能提供java版. 正好最近在学启发式算法和java,为 ...
- 求解TSP的改进模拟退火算法研究
文章目录 一.理论基础 1.传统模拟退火算法 (1)模拟退火算法基本原理 (2)模拟退火算法模型流程 <1> 编码方式 <2> 目标函数 <3> 冷却进度表 < ...
- 用模拟退火算法求解TSP问题
模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法.该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概 ...
- 五种常见启发式算法求解TSP问题-总结篇
1. 前言 本文将总结先前设计的五个启发式算法的求解效果,算法文章如下表: 智能优化算法类别 启发式算法求解TSP问题系列博文 进化算法 遗传算法求解TSP问题 仿人智能优化算法 禁忌搜索算法求解TS ...
- 【运筹优化】求解TSP问题的算法合辑 + Java代码实现
文章目录 一.算法合辑 1.1 SA模拟退火算法 1.2 TS禁忌搜索算法 1.3 ACO蚁群算法 1.4 GA遗传算法 1.5 ILS迭代局部搜索算法 1.6 VNS变邻域搜索算法 1.7 ALNS ...
- 禁忌搜索算法求解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 ...
- 计算机设计大赛国奖作品_5. 模拟退火求解旅行商问题
计算机设计大赛国奖作品_5. 模拟退火求解旅行商问题 本系列是2021年中国大学生计算机设计大赛作品"环境监测无人机航线优化"的相关文档,获得2021年西北赛区一等奖,国赛三等奖. ...
最新文章
- 1.3亿突触、数万神经元,谷歌、哈佛发布史上最强三维人脑地图
- 把技术卖给不懂技术的人
- (chap4 IP协议) 路由控制表(Routing Table)
- 微软OTech第二次会议(广州站)
- java的equals方法_Java Date equals()方法与示例
- 2021中国集成电路行业投资市场研究报告
- Java中类变量(静态变量)和实例变量区别
- NGINX基于Tomcat配置负载均衡
- Java 泛型(generics)
- VMware下CentOS6.8配置GFS文件系统
- jde多目标_《和平精英》PEL职业联赛S3赛季:DKG战队获第四周周冠军,JDE“逆风翻盘”...
- Bailian4042 Rabin-Karp字符串匹配【文本】
- mac vscode 背景半透明_武装Mac|常用MacBook软件分类汇总
- B站后台源码疑似泄露,作为程序员我们得注意哪些?
- DOS命令学习(从入门到精通)
- WebP是什么格式?如何免费批量转换JPEG
- OLED屏幕应用实验
- 脑电情绪识别的学习过程
- cisco packet tracer 介绍
- LintCode 1218. 补数 JavaScript算法