VNS算法求解TSP问题

可变邻域搜索(Variable Neighborhood Search, VNS)是一种常用于求解组合优化问题的元启发式算法。VNS的核心思想是通过系统地改变搜索空间的邻域来跳出局部最优,从而达到全局最优解。对于旅行商问题(TSP),VNS可以通过不同邻域结构的交替搜索来优化路线。下面是基于VNS求解TSP问题的基本步骤:

1. 初始化

  • 随机生成一个可行的初始解 sss,比如使用最近邻算法(Nearest Neighbor)或随机生成一个旅行路线。
  • 设定初始邻域结构集合(如交换、逆序、插入等多种邻域操作),以及最大迭代次数或其他终止条件。

2. 邻域定义

  • 在TSP中,常用的邻域结构包括:
    • 交换邻域:交换两座城市的位置。
    • 逆序邻域:选择一个子路径,将其顺序反转。
    • 插入邻域:将一个城市插入到另一位置。

3. 迭代搜索

VNS主要包含以下几个关键步骤:

  1. 基本邻域搜索:从当前解 sss 开始,在第一个邻域 kkk 中搜索得到一个候选解 s′s's′。如果 s′s's′ 比当前解 sss 优,则将其设为新的当前解,并重置 k=1k = 1k=1。否则, k=k+1k = k + 1k=k+1。

  2. 改变邻域:如果当前解 sss 没有改进,则在不同邻域中继续寻找候选解,这样可以跳出局部最优。通过系统地增加邻域大小,可以更全面地搜索解空间。

  3. 接受准则:当找到一个比当前解更优的解时,立即接受该解作为当前解并重新开始邻域搜索,重复这个过程直到达到终止条件。

4. 终止条件

  • 迭代次数达到预设的最大值。
  • 长时间没有解的改进。
  • 邻域结构循环结束。

5.代码实现

import random
import math
import matplotlib.pyplot as plt
import time
import osdef calculate_total_distance(route, distance_matrix):"""计算路径的总距离"""total_distance = sum(distance_matrix[route[i]][route[i + 1]] for i in range(len(route) - 1))total_distance += distance_matrix[route[-1]][route[0]]return total_distancedef nearest_neighbor_solution(distance_matrix):"""使用最近邻算法生成初始解"""num_cities = len(distance_matrix)start = random.randint(0, num_cities - 1)unvisited = set(range(num_cities))route = [start]unvisited.remove(start)while unvisited:last = route[-1]next_city = min(unvisited, key=lambda city: distance_matrix[last][city])route.append(next_city)unvisited.remove(next_city)return routedef two_opt(route, distance_matrix):"""2-Opt 局部优化"""best_route = route[:]best_distance = calculate_total_distance(best_route, distance_matrix)for i in range(len(route) - 1):for j in range(i + 2, len(route)):if j - i == 1:continuenew_route = route[:i] + route[i:j][::-1] + route[j:]new_distance = calculate_total_distance(new_route, distance_matrix)if new_distance < best_distance:best_route, best_distance = new_route, new_distancereturn best_routedef swap(route):"""交换邻域操作"""i, j = random.sample(range(len(route)), 2)route[i], route[j] = route[j], route[i]return routedef reverse_subroute(route):"""反转邻域操作"""i, j = sorted(random.sample(range(len(route)), 2))route[i:j + 1] = reversed(route[i:j + 1])return routedef insert(route):"""插入邻域操作"""i, j = random.sample(range(len(route)), 2)city = route.pop(i)route.insert(j, city)return routedef VNS(distance_matrix, max_iter=500, seed=None):"""变量邻域搜索 (VNS) 算法主函数"""current_solution = nearest_neighbor_solution(distance_matrix)best_solution = current_solution[:]best_distance = calculate_total_distance(best_solution, distance_matrix)neighborhood_operations = [swap, reverse_subroute, insert]random.seed(seed)iteration = 0no_improve_count = 0adaptive_cooling = 1start_time = time.time()  # 开始计时while iteration < max_iter:k = 0improved = Falsewhile k < len(neighborhood_operations):new_solution = neighborhood_operations[k](current_solution[:])new_solution = two_opt(new_solution, distance_matrix)new_distance = calculate_total_distance(new_solution, distance_matrix)if new_distance < best_distance:best_solution, best_distance = new_solution[:], new_distancecurrent_solution = new_solution[:]improved = Truek = 0no_improve_count = 0else:k += 1if not improved:no_improve_count += 1if no_improve_count > 10:adaptive_cooling = max(0.9, adaptive_cooling - 0.01)else:adaptive_cooling = 1no_improve_count = 0iteration += 1end_time = time.time()  # 结束计时elapsed_time = end_time - start_timereturn best_solution, best_distance, elapsed_timedef read_tsp_file(filename):"""读取 TSP 文件并返回坐标字典"""coordinates = {}with open(filename, 'r') as f:lines = f.readlines()node_section = Falsefor line in lines:if line.strip() == "NODE_COORD_SECTION":node_section = Truecontinueelif line.strip() == "EOF":breakif node_section:parts = line.strip().split()node_id = int(parts[0])x, y = int(parts[1]), int(parts[2])coordinates[node_id] = (x, y)return coordinatesdef euclidean_distance(coord1, coord2):"""计算欧几里得距离"""return math.sqrt((coord1[0] - coord2[0]) ** 2 + (coord1[1] - coord2[1]) ** 2)def build_distance_matrix(coordinates):"""构建距离矩阵"""num_cities = len(coordinates)distance_matrix = [[0] * num_cities for _ in range(num_cities)]for i in range(num_cities):for j in range(i + 1, num_cities):dist = euclidean_distance(coordinates[i + 1], coordinates[j + 1])distance_matrix[i][j] = distdistance_matrix[j][i] = distreturn distance_matrixdef plot_path(city_coords, path, save_path=None):"""绘制路径并保存图像"""plt.figure(figsize=(20, 15))x = [city_coords[i + 1][0] for i in path] + [city_coords[path[0] + 1][0]]y = [city_coords[i + 1][1] for i in path] + [city_coords[path[0] + 1][1]]plt.plot(x, y, linestyle='--', linewidth=2, markersize=10, color='red')plt.plot(x, y, marker='o', markersize=10, linewidth=0, color='black')for i in path:if i == path[0]:plt.text(city_coords[i + 1][0], city_coords[i + 1][1], str(i + 1), fontsize=20, ha='right', color='red')else:plt.text(city_coords[i + 1][0], city_coords[i + 1][1], str(i + 1), fontsize=18, ha='right')plt.title('VNS_TSP Optimal Path', fontsize=20)plt.xlabel('X', fontsize=20)plt.ylabel('Y', fontsize=20)plt.xticks(fontsize=20)plt.yticks(fontsize=20)plt.grid(True)if save_path:plt.savefig(save_path)plt.close()def save_results(coords, best_solution, best_distance, elapsed_time, save_dir='results'):"""保存最优路径、最短距离、运算时间和图像"""os.makedirs(save_dir, exist_ok=True)with open(os.path.join(save_dir, 'best_path.txt'), 'w') as file:file.write("最优访问路径: " + ' '.join(map(lambda x: str(x + 1), best_solution)) + "\n")file.write(f"最短总距离: {best_distance}\n")file.write(f"运算时间: {elapsed_time:.4f} 秒\n")plot_path(coords, best_solution, os.path.join(save_dir, 'best_path.png'))# 测试代码
filename = 'kroB100.tsp'
coordinates = read_tsp_file(filename)
distance_matrix = build_distance_matrix(coordinates)# 运行 VNS 算法并保存结果
best_route, best_route_distance, elapsed_time = VNS(distance_matrix, max_iter=500, seed=42)
save_results(coordinates, best_route, best_route_distance, elapsed_time)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP图书馆借阅管理系统-计算机毕业设计源码01649

基于HTML5CSS的图书馆借阅管理系统的设计与实现 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。本…

VMware系统镜像推荐网站

今天准备找一个Mac系统的镜像&#xff0c;在网上搜大部分都是广告&#xff0c;有的还做的很隐蔽&#xff0c;不点进去都无法确定&#xff0c;非常麻烦&#xff0c;不如多花点时间自己整理一个使用的网站。 如果有更优推荐&#xff0c;请在评论中说明&#xff0c;我会及时更新并…

vscode通过.vscode/launch.json 内置php服务启动thinkphp 应用后无法加载路由解决方法

我们在使用vscode的 .vscode/launch.json Launch built-in server and debug 启动thinkphp应用后默认是未加载thinkphp的路由文件的&#xff0c; 这个就导致了&#xff0c;某些thinkphp的一些url路由无法访问的情况&#xff0c; 如http://0.0.0.0:8000/api/auth.admin/info这…

中国90米土壤渗流因子Fsic数据

Fsic(土壤渗流因子)&#xff1a;土壤渗流因子的计算是根据美国农业部(USDA)土壤质地分类&#xff0c; 进行分类、赋值并归一化,得到土壤渗流因子Fsic的值。将13种土壤质地类型分别在0-1之间均等赋值得到。其中Fsic值越高&#xff0c;代表土壤渗水能力越强&#xff0c;Fsic值域范…

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测 目录 文章目录 【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;主要参考工作后续优…

【Linux】centos7安装配置DHCP、FTP服务

文章目录 一、DHCP服务介绍1、DHCP服务器2、DHCP客户机3、工作流程 二、安装配置DHCP1、查询是否安装DHCP软件包2、安装3、配置DHCP4、修改配置信息5、重启 二、FTP服务1、安装并启动VSFTP服务2、安装vsftp客户端 一、DHCP服务介绍 DHCP服务主要功能是动态分配IP地址&#xff…

HTML 基础标签——链接标签 <a> 和 <iframe>

文章目录 1. `<a>` 标签属性详细说明示例2. `<iframe>` 标签属性详细说明示例注意事项总结链接标签在HTML中是实现网页导航的重要工具,允许用户从一个页面跳转到另一个页面或嵌入外部内容。主要的链接标签包括 <a> 标签和<iframe> 标签。本文将深入探…

Java日志脱敏(二)——fastjson Filter + 注解 + 工具类实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

Launcher3 去掉桌面搜索索框

文章目录 需求实现需求说明 参考资料修改文件实现思路首页显示的搜索框去除应用列表中的搜索框去除解决方案代码跟踪代码扩展 需求 Launcher3 去掉搜桌面索框 实现需求说明 每个平台平台源码有区别&#xff0c;比如&#xff1a;MTK、高通、展讯、RK、谷歌…单个平台下 不同A…

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

基于Multisim汽车尾灯电路左转右转刹车检查功能电路(含仿真和报告)

【全套资料.zip】汽车尾灯电路左转右转刹车检查功能电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 电路有按键控制&#xff0c;分别对应左转&#xff0c;右转&#xff0c;刹车&a…

实现GUI界面中的logo图片的编码与隐藏

实现GUI界面中的logo图片的编码与隐藏 一、问题描述二、解决办法 一、问题描述 利用PyQt5编写的GUI界面&#xff0c;有时候需要我们添加自定义的图片来作为UI界面的logo&#xff0c;在源码使用时&#xff0c;logo的形式一般不影响使用&#xff0c;但是当我们需要将软件进行打包…

LabVIEW离心泵性能优化测试系统

开发了一套基于LabVIEW平台开发的离心泵性能优化测试系统。系统集成了数据采集、流量控制、数据存储、报表生成等功能&#xff0c;提供了低成本、便捷操作的解决方案&#xff0c;适用于工业场景中对离心泵性能的精确测评。 项目背景 随着工业化进程的加速&#xff0c;离心泵在…

论文阅读(三十二):EGNet: Edge Guidance Network for Salient Object Detection

文章目录 1.Introduction2.Related Works3.Salient Edge Guidance Network3.1Complementary information modeling3.1.1Progressive salient object features extraction3.1.2Non-local salient edge features extraction 3.2One-to-one guidance module 4.Experiments4.1Imple…

三大细分领域入选,九州未来再登2024边缘计算产业图谱

10月31日&#xff0c;经过数月的深入调研和专家严格评估&#xff0c;边缘计算社区正式发布《2024边缘计算产业图谱》。该图谱全面收录中国边缘计算领域最具活力的100家企业、科研机构、高校及标准组织等单位&#xff0c;深入梳理产业链上下游发展情况&#xff0c;精准研判边缘计…

【HarmonyOS】鸿蒙系统

文章目录 前言一、鸿蒙OS概述1. 定义与特性2. 核心技术理念3. 技术架构设计1. 应用层2. 框架层3. 系统服务层4. 内核层 二、分布式架构分布式架构的核心理念分布式能力的实现关键技术 三、 总结 前言 鸿蒙OS是由华为推出的一款开源操作系统&#xff0c;旨在满足智能终端设备的…

强网杯 2024 pwn false AK

强网杯 2024 pwn &#x1f3c4;&#x1f3fd;‍♀️前言&#x1f3c4;&#x1f3fd;‍♂️heap&#xff08;UAF house of banana orw&#xff09;&#x1f3c4;&#x1f3fd;分析&#x1f3c4;&#x1f3fd;解题&#x1f3c4;&#x1f3fd;exp &#x1f3c4;&#x1f3fd;‍♂…

w016基于Springboot的房产销售系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …