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

Python实战:用NetworkX可视化TSP问题,手把手教你实现最邻近与插入算法

Python实战用NetworkX可视化TSP问题手把手教你实现最邻近与插入算法当你在规划一次跨越多个城市的旅行路线时如何找到最短的路径这就是经典的旅行商问题TSP。作为组合优化领域的著名难题TSP在物流配送、电路板钻孔、DNA测序等领域都有广泛应用。本文将带你用Python的NetworkX库通过可视化方式直观理解两种经典近似算法——最邻近方法和最邻近插入法。1. 环境准备与问题建模在开始编码前我们需要搭建开发环境并理解如何用图论建模TSP问题。推荐使用Anaconda创建Python 3.8环境安装以下核心库pip install networkx matplotlib numpyTSP问题可以抽象为一个加权完全无向图每个城市代表图中的一个节点城市间的距离表示为边的权重目标是找到总权重最小的哈密顿回路经过每个节点一次且返回起点用NetworkX创建随机城市网络的代码示例import networkx as nx import numpy as np def generate_random_cities(num_cities, seed42): np.random.seed(seed) G nx.complete_graph(num_cities) for u, v in G.edges(): G.edges[u,v][weight] np.random.randint(50, 200) return G # 生成10个城市的随机距离矩阵 cities_graph generate_random_cities(10)2. 最邻近方法实现与可视化最邻近方法(Nearest Neighbor)是一种贪心算法其核心思想是每次选择距离当前城市最近的未访问城市作为下一站。让我们分解实现步骤算法流程选择任意起点城市重复以下步骤直到访问所有城市找到距离当前城市最近的未访问城市移动到该城市并标记为已访问最后返回起点完成回路Python实现关键代码def nearest_neighbor_tsp(G, start_node0): unvisited set(G.nodes) current start_node unvisited.remove(current) path [current] while unvisited: # 找到最近的未访问邻居 neighbors [(n, G.edges[current,n][weight]) for n in G.neighbors(current) if n in unvisited] next_node min(neighbors, keylambda x: x[1])[0] path.append(next_node) unvisited.remove(next_node) current next_node # 返回起点完成回路 path.append(start_node) return path可视化对比不同起点的选择会导致不同的解质量。下图展示了从城市0和城市3出发的结果对比import matplotlib.pyplot as plt def plot_tsp_solution(G, path, title): pos nx.circular_layout(G) nx.draw(G, pos, with_labelsTrue) # 绘制路径 path_edges list(zip(path[:-1], path[1:])) nx.draw_networkx_edges(G, pos, edgelistpath_edges, edge_colorr, width2) plt.title(title) plt.show() # 从不同起点出发的对比 path1 nearest_neighbor_tsp(cities_graph, 0) path2 nearest_neighbor_tsp(cities_graph, 3) plot_tsp_solution(cities_graph, path1, 起点为城市0的最邻近解) plot_tsp_solution(cities_graph, path2, 起点为城市3的最邻近解)注意最邻近方法的时间复杂度为O(n²)适合中小规模问题但解的质量受起点影响较大通常不是最优解。3. 最邻近插入法进阶实现为了改进最邻近方法的不足我们引入最邻近插入法。这种方法通过动态调整现有路径来获得更好的近似解算法优势不受初始起点选择的显著影响通常能获得比简单最邻近方法更优的解仍保持多项式时间复杂度分步实现def nearest_insertion_tsp(G): # 初始选择一个节点作为回路 nodes list(G.nodes) tour [nodes[0], nodes[0]] while len(tour) len(nodes): # 找到距离当前回路最近的节点 min_dist float(inf) nearest_node None for node in set(nodes) - set(tour[1:-1]): for tour_node in tour[:-1]: dist G.edges[node, tour_node][weight] if dist min_dist: min_dist dist nearest_node node # 在所有可能位置插入选择最优的 best_tour None best_length float(inf) for i in range(1, len(tour)): new_tour tour[:i] [nearest_node] tour[i:] length calculate_tour_length(G, new_tour) if length best_length: best_length length best_tour new_tour tour best_tour return tour def calculate_tour_length(G, path): return sum(G.edges[u,v][weight] for u,v in zip(path[:-1], path[1:]))性能对比实验我们可以系统比较两种算法的表现# 生成多个随机实例进行测试 results [] for _ in range(10): G generate_random_cities(15, seednp.random.randint(100)) # 测试最邻近方法取不同起点中的最佳解 nn_lengths [] for start in range(5): # 尝试5个不同起点 path nearest_neighbor_tsp(G, start) nn_lengths.append(calculate_tour_length(G, path)) # 测试插入法 ni_path nearest_insertion_tsp(G) results.append({ nn_best: min(nn_lengths), ni: calculate_tour_length(G, ni_path) }) # 计算平均改进比例 improvements [(r[nn_best]-r[ni])/r[nn_best] for r in results] avg_improvement np.mean(improvements) * 100 print(f插入法平均比最邻近方法优化了{avg_improvement:.1f}%)典型输出显示插入法通常能比最邻近方法优化5-15%的路径长度。4. 算法优化与扩展应用掌握了基础实现后我们可以进一步优化算法并探索实际应用场景性能优化技巧使用优先队列加速最近邻搜索对大规模问题采用分治策略缓存距离计算减少重复工作混合策略实现def hybrid_tsp(G, num_starts5): 结合最邻近方法和插入法的混合策略 best_tour None best_length float(inf) for start in range(min(num_starts, len(G.nodes))): # 先用最邻近方法生成初始解 nn_tour nearest_neighbor_tsp(G, start) # 再用插入法优化 current_tour nn_tour[:-1] # 去掉重复的起点 improved_tour nearest_insertion_tsp(G, initial_tourcurrent_tour) length calculate_tour_length(G, improved_tour) if length best_length: best_length length best_tour improved_tour return best_tour实际应用调整处理非对称距离矩阵如单行道情况加入时间窗口约束考虑多旅行商场景可视化进阶技巧使用交互式绘图可以更好地理解算法过程import matplotlib.animation as animation def animate_tsp_construction(G, path_generator): fig, ax plt.subplots(figsize(10, 6)) pos nx.circular_layout(G) def update(frame): ax.clear() nx.draw(G, pos, axax, with_labelsTrue) current_path path_generator.send(frame) path_edges list(zip(current_path[:-1], current_path[1:])) nx.draw_networkx_edges(G, pos, edgelistpath_edges, edge_colorr, width2, axax) ax.set_title(fStep {frame}) ani animation.FuncAnimation(fig, update, frameslen(G.nodes), interval800, repeatFalse) plt.close() return ani # 使用生成器逐步产生路径 def path_generator(G, algorithm): path [] for step in algorithm(G): path step yield path yield path [path[0]] # 闭合回路 # 生成动画 ani animate_tsp_construction(cities_graph, path_generator(cities_graph, stepwise_nearest_neighbor)) HTML(ani.to_jshtml())这种动态可视化能清晰展示算法每一步的决策过程特别适合教学演示。

相关文章:

Python实战:用NetworkX可视化TSP问题,手把手教你实现最邻近与插入算法

Python实战:用NetworkX可视化TSP问题,手把手教你实现最邻近与插入算法 当你在规划一次跨越多个城市的旅行路线时,如何找到最短的路径?这就是经典的旅行商问题(TSP)。作为组合优化领域的著名难题&#xff0c…...

BERT模型实战指南:从原理到部署优化

1. BERT模型基础认知 2018年那个秋天,当BERT论文首次出现在arXiv上时,NLP领域的研究者们很快意识到:一个新时代到来了。这个基于Transformer架构的双向编码器表示模型,彻底改变了我们对语言模型预训练的理解。与传统的单向语言模型…...

DS4Windows终极指南:解锁PlayStation手柄在Windows平台的完整潜力

DS4Windows终极指南:解锁PlayStation手柄在Windows平台的完整潜力 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 想要在Windows电脑上使用PlayStation手柄获得原生游戏体验&a…...

Windows多显示器DPI缩放不一致?SetDPI命令行工具让你精准掌控显示比例

Windows多显示器DPI缩放不一致?SetDPI命令行工具让你精准掌控显示比例 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 还在为多显示器DPI缩放混乱而烦恼吗?SetDPI是一款基于C开发的Windows命令行工具,…...

蓝桥杯单片机备赛:手把手教你用DS18B20做个简易温度计(附完整代码)

蓝桥杯单片机实战:DS18B20温度传感器从硬件连接到数码管显示的完整指南 在蓝桥杯单片机竞赛中,温度测量是一个经典且实用的项目场景。DS18B20作为一款广泛使用的数字温度传感器,凭借其单总线接口、高精度和易集成的特点,成为参赛选…...

怎样高效重置Navicat试用期:macOS平台完整实用方案

怎样高效重置Navicat试用期:macOS平台完整实用方案 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac Navicat Premi…...

视频直播点播/高清点播/音视频点播EasyDSS一站式视频平台赋能大型比赛直播新体验

大型体育赛事、电竞比赛等直播活动,对音视频系统的安全性、稳定性、并发承载与全流程管理提出严苛要求。EasyDSS私有化视频会议系统凭借私有化部署、全链路视频能力、AI智能加持三大核心优势,为大型比赛直播构建安全、高效、可管可控的技术底座&#xff…...

小型语言模型在智能体AI中的优势与应用

1. 小型语言模型为何成为智能体AI的未来过去两年,大型语言模型(LLMs)如GPT-4、Claude等凭借其惊人的通用能力主导了AI领域。但最近来自微软研究院的Phi-3系列模型证明,参数量仅3B的小型模型在特定任务上可以达到甚至超越70B参数大…...

ncmdumpGUI:网易云音乐NCM文件解密转换的图形界面解决方案

ncmdumpGUI:网易云音乐NCM文件解密转换的图形界面解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲…...

保姆级教程:用TensorFlow 2.x和PyTorch分别搭建你的第一个3D CNN视频分类模型

双框架实战:从零构建3D CNN视频分类模型的TensorFlow与PyTorch对比指南 当处理视频数据时,传统的2D卷积神经网络难以捕捉时间维度的信息。3D卷积神经网络(3D CNN)通过在空间和时间维度上同时进行卷积操作,成为视频分类…...

2026年降AI工具保姆级测评:4元到8元价位哪款最值?

选降AI工具最头疼的事情之一,就是价格差别太大,不知道该怎么选。 4块多的嘎嘎降AI,8块钱的比话,还有价格更低的率零,效果到底差多少?我整理了一下这几个月实际使用的记录,把4元到8元这个区间的…...

STM32 HAL库驱动ADS1256避坑指南:从SPI时序到电压换算的完整流程

STM32 HAL库驱动ADS1256避坑指南:从SPI时序到电压换算的完整流程 第一次用STM32的HAL库折腾ADS1256这块24位ADC芯片时,我对着跳动的数据线差点把示波器砸了——明明按照手册连的线,读出来的数值却像心电图一样乱蹦。后来才发现,从…...

2026年SCI论文降AI工具怎么选?实测4款告诉你答案

投了3个月的稿,最后因为AI率被编辑部退回来了。 邮件里说得很客气,但意思很明确:文章检测到AI辅助写作的痕迹,请修改后重新投稿。我当时一脑袋问号,那篇稿子明明是我自己写的,就是用DeepSeek帮忙润色了几个…...

D5.4.熟练掌握HPA控制器的使用

📝 HPA 实验总结 一、实验目标 掌握 Kubernetes HPA(Horizontal Pod Autoscaler)的使用,实现基于 CPU 使用率的 Pod 自动扩缩容。 二、实验环境 项目 配置 集群 7 节点(3 master + 4 node) Metrics Server v0.7.1 测试应用 Tomcat 7.0.93 HPA 版本 autoscali…...

为什么92%的C++团队尚未启用C++26反射?揭秘标准草案TS状态、编译器支持缺口与安全启用checklist

更多请点击: https://intelliparadigm.com 第一章:C26反射特性在元编程中的应用 C26 正式引入原生编译时反射(std::reflexpr)作为核心元编程设施,彻底摆脱了宏和模板元编程的间接性桎梏。开发者 now 可直接查询、遍历…...

Java智能地址解析架构解决方案:5大企业级实践指南

Java智能地址解析架构解决方案:5大企业级实践指南 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 在当今数字化业务场景中,地址数据标准化处理已成为企业级应用的核心技术…...

【架构实战】DDD领域驱动设计:从战略到战术

一、DDD概述 领域驱动设计(Domain-Driven Design,DDD)是一种软件设计方法论: DDD核心思想: 将业务领域知识作为软件设计的核心通过深入理解业务来构建领域模型让软件更好地反映业务本质 DDD的价值: 解决复杂…...

C++ 多态编程与纯虚函数详解

C++ 多态编程与纯虚函数详解 多态(Polymorphism)是面向对象编程的核心特性之一,它允许同一接口表现出不同的行为。C++ 支持编译时多态(静态多态)和运行时多态(动态多态)。本文重点讲解运行时多态,以及实现它的关键工具——虚函数与纯虚函数。 一、多态的基本概念 静态…...

如何将影像组学特征与肿瘤微环境(免疫细胞浸润、核形态、PD-L1) 建立关联,以预测免疫治疗响应及预后

01导语各位同学,大家好。现在做影像组学,如果还只停留在“提取特征—建个模型—算个AUC”,那就有点像算命算得挺准,但为啥准,自己也说不明白。别人一问:你这特征到底代表啥?背后有啥道理&#x…...

Conda换源后还是安装失败?试试这个‘组合拳’:官方源+国内源+conda-forge的混合配置指南

Conda混合源配置实战:破解特殊包安装失败的终极方案 当你在深夜赶项目进度时,突然遇到PackagesNotFoundError的红色报错,即使已经配置了国内镜像源也无济于事——这种挫败感每个数据科学工作者都深有体会。传统教程只会教你单一地切换镜像源&…...

成都创意广告机构推荐与优势分析

成都创意广告机构推荐与优势分析1. 阿佩克思(Apex)阿佩克思作为成立于1993年的西部头部咨询机构,以其卓越的品牌服务和整合营销能力闻名于业界。与奥美、新希望等知名品牌的合作,使其在政府及企业战略咨询、品牌营销等领域具有了广…...

告别Eclipse臃肿!5分钟搞定VS Code搭建RISC-V开发环境(含GCC/OpenOCD配置)

告别Eclipse臃肿!5分钟搞定VS Code搭建RISC-V开发环境(含GCC/OpenOCD配置) 如果你正在寻找一种更轻量、更现代化的RISC-V开发体验,那么VS Code可能是你一直在等待的解决方案。与传统的Eclipse相比,VS Code以其快速的启…...

收藏!2026年AI工程师月薪20804元,16个岗位抢1人,小白/程序员必看的大模型赛道机遇

2026年AI工程师平均月薪达20804元,智能驾驶系统工程师供需比高达16:1。机器人、新材料、光电子行业职位数同比大幅增长,薪资普遍过万。产业升级推动新质生产力爆发,高薪背后是技术要求和人才紧缺,更是小白、程序员转型大模型领域的…...

终极指南:如何使用ncmdump轻松解密网易云音乐NCM文件

终极指南:如何使用ncmdump轻松解密网易云音乐NCM文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定播放器里播放?🎵 那些以…...

别再用OpenCV了!用Python的face_recognition库,5行代码搞定人脸识别(附完整项目)

5行代码解锁人脸识别新姿势:face_recognition库实战指南 当开发者第一次接触人脸识别技术时,往往会陷入OpenCV复杂的配置和冗长的代码中。但今天,我要告诉你一个秘密武器——face_recognition库,它能让你用5行核心代码完成OpenCV需…...

从UVM糖果教程到芯片验证:深入理解packer策略对象与$bits/$size的妙用

从UVM糖果教程到芯片验证:深入理解packer策略对象与$bits/$size的妙用 第一次看到UVM中的pack/unpack机制时,我正为一个跨时钟域验证问题头疼不已。传统的手动位拼接方式不仅容易出错,每次协议变更都需要重新计算偏移量。直到偶然翻看《UVM糖…...

终极深度配置指南:3种高效方法彻底掌握Windows风扇控制软件

终极深度配置指南:3种高效方法彻底掌握Windows风扇控制软件 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…...

告别模块依赖:手把手教你将Qt6 MQTT库作为第三方库集成到任意项目

告别模块依赖:手把手教你将Qt6 MQTT库作为第三方库集成到任意项目 在物联网项目开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。Qt作为跨平台开发框架,其官方提供的qtmqtt模块却常常让开发者陷入依赖管理的困境——传统安装到Qt系…...

不再停留在概念!金融垂直智能体,营销风控价值逐步兑现

今年以来,OpenClaw 小龙虾的横空出世,再度唤醒了社会大众对智能体助手的追捧,这一热门趋势也进一步延伸到金融行业。尽管像OpenClaw这样的智能体能够为金融机构提供更平价、易用的智能体落地痛到,但是碍于金融行业的强数据驱动、严…...

WarcraftHelper:魔兽争霸III终极增强插件完全指南

WarcraftHelper:魔兽争霸III终极增强插件完全指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III的陈旧限制而烦恼吗&a…...