当前位置: 首页 > news >正文

模拟退火算法(SA)求解旅行商问题(TSP)python

目录

一、模拟退火算法求解TSP(city14)的python代码

二、city14的运行结果

三、 模拟退火算法求解TSP(city30)的python代码

四、city30的运行结果


一、模拟退火算法求解TSP(city14)的python代码

import random
import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False'''计算路径总路程的函数'''
def fitness(n,X,Y,X0):''':param n: 城市数量:param X: n个城市的横坐标:param Y: n个城市的纵坐标:param X0: 一个解向量:return: 总路程'''s=0for i in range(n):if i!=n-1:s=s+np.sqrt((X[X0[i]]-X[X0[i+1]])**2+(Y[X0[i]]-Y[X0[i+1]])**2)else:s=s+np.sqrt((X[X0[i]]-X[X0[0]])**2+(Y[X0[i]]-Y[X0[0]])**2)return s'''定义领域搜索运算操作——交换操作'''
def exchange(X0,q):''':param X0: 一个解向量:param q: 指定的需要交换的数的两个位置的列表,列表长度为2:return: 一个领域解'''X1=X0.copy()temp=X1[q[0]]X1[q[0]]=X1[q[1]]X1[q[1]]=tempreturn X1'''定义随机产生初始解的函数'''
def initialX0(n):''':param n: 城市数量:return: 一个初始解'''X0=random.sample(range(n),n)return X0'''模拟退火算法——TSP'''
def SA_TSP(n,X,Y,n_TK,r,T_f):''':param n: 城市数量:param X: n个城市的横坐标:param Y: n个城市的纵坐标:param n_TK: 内循环的迭代次数:param T_down: 降温变化:param T_f: 终止温度:return: 最优路径和最短距离''''''产生一个初始解'''X0=initialX0(n)print("初始解:\n{}".format(X0))print("初始解的总路程:\n{}".format(fitness(n,X,Y,X0)))'''初始温度'''T0=1000'''存储历史最优路径'''X_min=[]X_min.append(X0)'''存储历史最优距离'''s_min=[]s_min.append(fitness(n,X,Y,X0))k=0while T0>T_f:for i in range(n_TK):#随机产生两个位置q=random.sample(range(n),2)#领域运算得到一个随机领域解X1=exchange(X0,q)#计算初始解和随机领域解的目标函数值s1=fitness(n,X,Y,X0)s2=fitness(n,X,Y,X1)#更新历史最优解if s2<min(s_min):s_min.append(s2)X_min.append(X1)else:s_min.append(s_min[-1])X_min.append(X_min[-1])'''判断是否更新解'''if s2<s1:X0=X1else:E=math.exp(-(s2-s1)/T0)R=random.uniform(0,1)if E>R:X0=X1k=k+1'''降温'''T0=T0*r'''绘制优化过程'''plt.plot(range(k+1),s_min)plt.grid()plt.title("模拟退火算法——TSP的优化过程")plt.xlabel("迭代次数")plt.ylabel("总路程")plt.show()'''绘制路线图'''#最优路径W=X_min[-1]for i in range(n):if i!=n-1:plt.plot([X[W[i]],X[W[i+1]]],[Y[W[i]],Y[W[i+1]]],c='plum')else:plt.plot([X[W[i]],X[W[0]]],[Y[W[i]],Y[W[0]]],c='plum')plt.scatter(X,Y,c='red')plt.title("路线图")plt.xlabel("x")plt.ylabel("y")plt.show()return X_min[-1],s_min[-1]'''主函数'''
if __name__=="__main__":'''城市的数量'''n=14'''定义14个城市的坐标'''city_x=[16.47,16.47,20.09,22.39,25.23,22.00,20.47,17.20,16.30,14.05,16.53,21.52,19.41,20.09]city_y=[96.10,94.44,92.54,93.37,97.24,96.05,97.02,96.29,97.38,98.12,97.38,95.59,97.13,92.55]'''内循环的迭代次数'''n_Tk=200'''降温变化'''r=0.9'''终止温度'''T_f=0.001'''模拟退火算法求解TSP'''Xmin,smin=SA_TSP(n,city_x,city_y,n_Tk,r,T_f)print("最优路径:\n{}".format(Xmin))print("最短距离:\n{}".format(smin))

二、city14的运行结果

 

三、 模拟退火算法求解TSP(city30)的python代码

import random
import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False'''计算路径总路程的函数'''
def fitness(n,X,Y,X0):''':param n: 城市数量:param X: n个城市的横坐标:param Y: n个城市的纵坐标:param X0: 一个解向量:return: 总路程'''s=0for i in range(n):if i!=n-1:s=s+np.sqrt((X[X0[i]]-X[X0[i+1]])**2+(Y[X0[i]]-Y[X0[i+1]])**2)else:s=s+np.sqrt((X[X0[i]]-X[X0[0]])**2+(Y[X0[i]]-Y[X0[0]])**2)return s'''定义领域搜索运算操作——交换操作'''
def exchange(X0,q):''':param X0: 一个解向量:param q: 指定的需要交换的数的两个位置的列表,列表长度为2:return: 一个领域解'''X1=X0.copy()temp=X1[q[0]]X1[q[0]]=X1[q[1]]X1[q[1]]=tempreturn X1'''定义随机产生初始解的函数'''
def initialX0(n):''':param n: 城市数量:return: 一个初始解'''X0=random.sample(range(n),n)return X0'''模拟退火算法——TSP'''
def SA_TSP(n,X,Y,n_TK,r,T_f):''':param n: 城市数量:param X: n个城市的横坐标:param Y: n个城市的纵坐标:param n_TK: 内循环的迭代次数:param T_down: 降温变化:param T_f: 终止温度:return: 最优路径和最短距离''''''产生一个初始解'''X0=initialX0(n)print("初始解:\n{}".format(X0))print("初始解的总路程:\n{}".format(fitness(n,X,Y,X0)))'''初始温度'''T0=2000'''存储历史最优路径'''X_min=[]X_min.append(X0)'''存储历史最优距离'''s_min=[]s_min.append(fitness(n,X,Y,X0))k=0while T0>T_f:for i in range(n_TK):#随机产生两个位置q=random.sample(range(n),2)#领域运算得到一个随机领域解X1=exchange(X0,q)#计算初始解和随机领域解的目标函数值s1=fitness(n,X,Y,X0)s2=fitness(n,X,Y,X1)#更新历史最优解if s2<min(s_min):s_min.append(s2)X_min.append(X1)else:s_min.append(s_min[-1])X_min.append(X_min[-1])'''判断是否更新解'''if s2<s1:X0=X1else:E=math.exp(-(s2-s1)/T0)R=random.uniform(0,1)if E>R:X0=X1k=k+1'''降温'''T0=T0*r'''绘制优化过程'''plt.plot(range(k+1),s_min)plt.grid()plt.title("模拟退火算法——TSP的优化过程")plt.xlabel("迭代次数")plt.ylabel("总路程")plt.show()'''绘制路线图'''#最优路径W=X_min[-1]for i in range(n):if i!=n-1:plt.plot([X[W[i]],X[W[i+1]]],[Y[W[i]],Y[W[i+1]]],c='plum')else:plt.plot([X[W[i]],X[W[0]]],[Y[W[i]],Y[W[0]]],c='plum')plt.scatter(X,Y,c='red')plt.title("路线图")plt.xlabel("x")plt.ylabel("y")plt.show()return X_min[-1],s_min[-1]'''主函数'''
if __name__=="__main__":'''城市的数量'''n=30'''定义30个城市的坐标'''city_x=[41, 37, 54, 25, 7, 2, 68, 71, 54, 83, 64, 18, 22, 83, 91, 25, 24, 58, 71, 74, 87,18, 13, 82, 62, 58, 45,41,44, 4]city_y=[94, 84, 67, 62, 64, 99, 58, 44, 62, 69, 60, 54, 60, 46, 38, 38, 42, 69, 71, 78, 76,40, 40, 7, 32, 35, 21,26,35, 50]'''内循环的迭代次数'''n_Tk=300'''降温变化'''r=0.9'''终止温度'''T_f=0.001'''模拟退火算法求解TSP'''Xmin,smin=SA_TSP(n,city_x,city_y,n_Tk,r,T_f)print("最优路径:\n{}".format(Xmin))print("最短距离:\n{}".format(smin))

四、city30的运行结果

 

相关文章:

模拟退火算法(SA)求解旅行商问题(TSP)python

目录 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 二、city14的运行结果 三、 模拟退火算法求解TSP&#xff08;city30&#xff09;的python代码 四、city30的运行结果 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 impor…...

Intelijj使用Gitee团队开发

初始化项目到Gitee服务器 成功标识&#xff1a; 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 &#xff08;最多不超过5人&#xff09; 3.通过链接或者二维码邀请新成员&#xff0c;或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…...

气象台使用vr模拟仿真实训教学降低成本投入

气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件&#xff0c;在环境试验中&#xff0c;温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…...

智能井盖是什么?万宾科技智能井盖传感器有什么特点

智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能&#xff0c;还能通过数字化、自动化的方式实现远程监控和智能管理&#xff0c;提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…...

使用 类加载器 或者 类对象 读取文件

相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是放在我们模块里面 &#xff09;同理可得&#xff0c;我们直接创建 文件 b.txt 会在项目的根目…...

《深度学习推荐系统》王喆 笔记

这个笔记&#xff0c;是我记录的阅读该书&#xff0c;对我比较有用的一些点。不算是能完全覆盖全书知识点的笔记。 能完全覆盖全书知识点&#xff0c;比较详尽的笔记&#xff0c;可以参考如下。 《深度学习推荐系统》超级详细读书笔记https://www.zhihu.com/tardis/bd/art/44…...

微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT

10月17日&#xff0c;微软在官网宣布&#xff0c;现在可以在Azure OpenAI公共预览版中对GPT-3.5-Turbo、Babbage-002 和Davinci-002模型进行数据微调。 使得开发人员通过自己的数据集&#xff0c;便能打造独一无二的ChatGPT。例如&#xff0c;通过海量医疗数据进行微调&#x…...

Kali Linux 安装搭建 hadoop 平台 详细教程

1&#xff09;前期环境准备&#xff1a;&#xff08;虚拟机、jdk、ssh&#xff09; 2&#xff09;SSH相关配置 安装SSH Server服务器&#xff1a;apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…...

leetcode做题笔记190. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指定为有符号整数类型&#xff0c;并且不应影响您的实现&#xff0c;因…...

JAVA如何获取服务器ip

一、最简单的方法就是使用InetAddress获取本机ip InetAddress.getLocalHost().getHostAddress(); public static void main(String[] args) {try {//用 getLocalHost() 方法创建的InetAddress的对象InetAddress address InetAddress.getLocalHost();System.out.println(addr…...

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含&#xff1a; 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样&#xff0c;Power BI要求其用户熟悉商业智能&#xff08;BI&#xff09;解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…...

网络参考资料搬运(3)

(1) Python: 使用Python打开新的终端(terminal)并执行语句 通过Python 打开各系统&#xff08;MAC, LINUX, WINDOWS&#xff09;下的终端 &#xff08;Terminal&#xff09; python执行shell脚本的几种方法 自己写Linux命令 用Python写个Linux系统命令 Python 使用sftp传输文件…...

Bias in Emotion Recognition with ChatGPT

本文是LLM系列文章&#xff0c;针对《Bias in Emotion Recognition with ChatGPT》的翻译。 chatGPT在情绪识别中的偏差 摘要1 引言2 方法3 结果4 讨论5 结论 摘要 本技术报告探讨了ChatGPT从文本中识别情绪的能力&#xff0c;这可以作为交互式聊天机器人、数据注释和心理健康…...

【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能

​医院医学影像PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大&#xff0c;代码完整。 PACS系统与医院HIS实现双向数据交换&#xff0c…...

深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU、GELU等。

深度学习中常用的激活函数 1. Sigmoid函数2. Tanh函数3. ReLU函数4. LeakyReLU函数5. PReLU函数6. ELU函数&#xff1a;7. GELU函数&#xff1a; 深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU等。 1. Sigmoid函数 Sigmoid函数公式为 f ( x ) 1 1 e −…...

mysql同时使用order by排序和limit分页数据重复问题

目录 场景再现&#xff1a; 解决方案&#xff1a; 问题分析&#xff1a; mysql官方描述&#xff1a; 场景再现&#xff1a; 最近排查数据时发现使用order by及limit分页时会出现不同页数数据重复问题及有的数据分页不会显示,但是按条件搜索就可以搜索出来。 解决方案&#x…...

英语——歌诀篇——歌诀记忆法

介词用法速记歌 年月季前要用in&#xff0c; 日子前面却不行。 遇到几号要用on&#xff0c; 上午下午又用in。 要说某时上下午&#xff0c; 用on换in才可行。 午夜黄昏和黎明&#xff0c; 要用at不用in。 差儿分到几点&#xff0c; 写个“to”在中间。 若是几点过几分&#xf…...

打破运维疆界:异构复杂网络环境的集中监控和管理

在当今多元化的IT环境中&#xff0c;异构环境的管理成为了企业IT团队的一大挑战。如何在多种技术架构、多样的应用环境中实现高效的运维管理&#xff0c;是众多企业正在面临的问题。在本文中&#xff0c;我们将探讨监控易在异构环境中的运维监控表现&#xff0c;并通过实际案例…...

ubuntu安装debian包的命令dpkg和apt的详解

dpkg是Debian Packager的缩写 官方文档https://manpages.ubuntu.com/manpages/jammy/en/man1/dpkg.1.html ubuntu的dpkg命令类似centos的rpm命令&#xff0c;dpkg主要用于对已下载到本地和已安装的.deb软件包进行管理比如安装、构建、删除。dpkg不能自动下载和安装.deb软件包也…...

【暴力剪枝】CF1708D

https://codeforces.com/contest/1708/problem/D 题意 思路 这样的操作下&#xff0c;数列减的速度是非常快的&#xff0c;也就是说&#xff0c;易出现很多的0&#xff0c;0的操作没啥意义&#xff0c;所以我们要找到第一个 >0 的数对其后的序列进行排序&#xff0c;就能大…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...