LKH-3算法求解TSP問題基本原理與應用

通俗理解LKH-3算法

LKH-3(Lin-Kernighan-Helsgaun)是求解**旅行商問題(TSP)**的最強啟發式算法之一,由丹麥計算機科學家Keld Helsgaun在LKH-2基礎上改進而來。它的核心思想是:通過智能的“局部破壞與修復”策略,逐步優化路徑,最終找到接近最優的解。


1. 類比理解

想象你是一個快遞員,要訪問多個城市送貨,目標是走最短路線。LKH-3的工作方式類似于:

  1. 先隨便規劃一條路線(可能很長)。
  2. 不斷嘗試對路線做小改動(比如交換兩個城市的順序、反轉一段路徑)。
  3. 只保留能讓總距離變短的改動,丟棄無效的改動。
  4. 重復這個過程,直到無法再優化

2. 核心步驟分解

(1) 初始路徑生成
  • 隨便生成一條初始路徑(比如按城市編號順序連接)。
  • 或使用其他算法(如貪心算法)生成一個較好的起點。
(2) 局部優化(關鍵部分)

LKH-3通過k-opt交換不斷改進路徑:

  • k-opt交換:斷開路徑中的k條邊,嘗試用其他邊重新連接。
    • 2-opt:交換兩條邊(類似把路徑中的一段“翻轉”)。
    • 3-opt:交換三條邊(更復雜的重組,如圖)。
    • LKH-3支持動態k值(最高到5-opt甚至更高)。
(3) 候選集策略(加速關鍵)
  • 不是對所有城市都嘗試交換,而是優先檢查“可能有用的鄰居”
    • 對每個城市,預先計算最近的若干城市(如最近的20個),形成“候選列表”。
    • 只在這些候選城市之間嘗試交換,大幅減少計算量。
(4) 增量式更新
  • 每次優化后,只更新受影響的部分路徑,而非重新計算整個路徑長度。
(5) 多次迭代
  • 重復上述過程,直到連續N次嘗試都無法改進路徑。

3. 為什么LKH-3強大?

特性說明
動態k值根據問題復雜度自動調整交換的邊數(2-opt到5-opt),靈活性高。
候選集優化通過預選“潛力城市”減少無效計算,速度比暴力搜索快100倍以上。
適應性策略對不同類型的TSP問題(隨機分布、聚類分布等)均表現良好。
并行化可多線程同時嘗試多種交換策略。

4. 舉個實際例子

假設有5個城市,初始路徑為 A→B→C→D→E→A,總距離=100:

  1. 嘗試2-opt:斷開邊 A-BC-D,重新連接為 A-CB-D,新路徑 A→C→B→D→E→A,距離=95(接受優化)。
  2. 嘗試3-opt:斷開 A-CB-DE-A,重組為 A→D→B→E→C→A,距離=92(進一步優化)。
  3. 直到無法改進:最終可能得到 A→D→E→B→C→A,距離=90(近似最優解)。

5. 和傳統算法的對比

算法優點缺點
窮舉法保證找到最優解計算時間隨城市數量指數級爆炸
遺傳算法適合大規模問題結果不穩定,可能陷入局部最優
LKH-3速度快,解的質量接近最優實現復雜,參數需要調優

6. 實際應用場景

  • 物流配送:優化快遞員、外賣騎手的路線。
  • 電路板設計:最小化鉆孔機的移動路徑。
  • DNA測序:尋找基因片段的最優拼接順序。

7. 進一步學習

  • 官方實現:LKH-3代碼
  • 數學細節:研究論文 Helsgaun, K. (2017). “An Effective Implementation of the Lin-Kernighan Traveling Salesman Heuristic”

代碼實戰

Python 3.10 需安裝elkai庫
實測效果明顯優于傳統ACO(蟻群算法)+ 2-opt/3-opt局部優化的方法
在這里插入圖片描述

elkai源碼Github地址
https://github.com/fikisipi/elkai?tab=readme-ov-file

import elkaiimport yaml
import numpy as npimport cv2# data.yml是opencv存儲的,距離矩陣,N*N,CV_64FC1,N表示城市數量
fs = cv2.FileStorage("data.yml", cv2.FILE_STORAGE_READ)
data = fs.getNode("double_matrix").mat()
fs.release()# yaml_path = "data.yml"  # 替換為你的文件路徑
# cities = read_opencv_yaml_to_array(yaml_path)cities = elkai.DistanceMatrix(data)path = cities.solve_tsp()print(path) # Output: [0, 2, 1, 0]# 手動計算總距離
total_dist = 0
for i in range(len(path)-2):total_dist += data[path[i]][path[i+1]]
print(total_dist) # Output: 10.0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88137.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲開發學習記錄

初始化只是第一次實例化的時候調用,show和unshow是打開界面和關閉界面的時候,會多次調用 在一個腳本里面show是每一次打開界面的時候需要做的事情,而Init是初始化。UIMgr里面的數據結構:為什么我要先從數據結構入手呢?…

一級緩存與二級緩存深度剖析:作用域、配置與同步方案全解析

引言 在分布式系統與高并發場景下,緩存機制已成為提升系統性能的關鍵技術。本文從作用域、失效機制、配置實踐到同步方案,系統化解析一級緩存與二級緩存的核心差異與工程實踐。 一、一級緩存:會話級數據加速器 1.1 作用域與生命周期 作用域&a…

OneCode MQTT插件開發實戰:基于Paho.Client的物聯網通信解決方案

引言 在物聯網應用開發中,MQTT協議因其輕量、低帶寬占用的特性被廣泛采用。OneCode平臺提供的xui.MQTT插件基于Eclipse Paho.Client實現了完整的MQTT通信能力,本文將從插件用途、核心實現、開發要點和功能擴展四個維度,詳解如何基于該插件構建…

1.1_5_1 計算機網絡的性能指標(上)

在這個小節中我們要學習計算機網絡的性能指標,我們在考研當中主要掌握這樣的七個性能指標,分別是速率、帶寬、吞吐量、時延、時延帶寬積、往返時延和信道利用率。我會把相關性比較緊密的性能指標放在一起講解。在這個視頻中,我們先來學習前三…

Python 性能優化指南:深入剖析代碼分析與優化工具

Python 性能優化指南:深入剖析代碼分析與優化工具 在 Python 的廣泛應用場景中,性能優化既是挑戰,也是機遇。無論是構建 Web 應用還是處理數據分析,理解代碼性能瓶頸并有效優化至關重要。本文將探討 Python 代碼性能分析的核心方法,并逐步解析關鍵工具的使用技巧,帶您從…

力扣打卡第二十一天 中后遍歷+中前遍歷 構造二叉樹

106. 從中序與后序遍歷序列構造二叉樹 給定兩個整數數組 inorder 和 postorder ,其中 inorder 是二叉樹的中序遍歷, postorder 是同一棵樹的后序遍歷,請你構造并返回這顆 二叉樹 。 示例 1: 輸入:inorder [9,3,15,20,7], postor…

Notepad++正則表達全解

摘要:Notepad正則表達式符號大全包含11類常用語法:基礎符號(.^$?等)、預定義字符類(\d\w\s等)、錨點(\b\B)、量詞({n,m})、分組引用(()$1)、字符…

前后端分離(java) 和 Nginx在服務器上的完整部署方案(redis、minio)

一、準備工作 服務器環境要求 銀河麒麟 V10 操作系統 開放端口:MinIO (9000、9001)、 Redis (6379)、應用服務 jar包(18888)、前端服務(8080) 系統用戶:具有 sudo 權限的用戶 操作:需要先有必備的工具前端的vsCode,webStrom、后臺的idea&…

貪心算法:簡單而高效的求解策略C++

貪心算法詳解及C實現 1. 什么是貪心算法 貪心算法(Greedy Algorithm)是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法策略。 貪心算法與動態規劃不同在于它…

IDEA 中使用 <jsp:useBean>動作指令時,class屬性引用無效

問題&#xff1a;在 IDEA 中創建 Java Web項目&#xff0c;在src/model包下存在一個Student類該類中包含&#xff1a;全參構造器、私有屬性的get/set方法。然后在 jsp 頁面中使用 <jsp:useBean>創建Student類的對象&#xff1a;訪問頁面時報錯&#xff1a;原因&#xff1…

【網絡】Linux 內核優化實戰 - net.core.flow_limit_table_len

目錄參數作用查看與修改調優建議相關警告net.core.flow_limit_table_len 是 Linux 內核中的一個網絡參數&#xff0c;用于控制**流限制表&#xff08;Flow Limit Table&#xff09;**的大小。這個表主要用于限制網絡流量中單個"流"&#xff08;通常指來自同一源IP、端…

前端開發常見問題技術文章大綱

前端開發常見問題技術文章大綱 常見性能優化問題 頁面加載速度慢的原因及解決方案渲染阻塞資源的優化方法內存泄漏的檢測與修復 跨瀏覽器兼容性問題 不同瀏覽器對CSS和JavaScript的支持差異Polyfill和Shim的使用場景如何利用工具檢測兼容性問題 響應式設計挑戰 媒體查詢的最佳實…

Redis常見性能問題和解決方案有哪些?

Redis 作為高性能的內存數據庫&#xff0c;在實際使用中可能會遇到性能問題。以下是常見的性能問題及其解決方案&#xff0c;用中文總結如下&#xff1a; 1. 高延遲問題 問題描述&#xff1a;客戶端請求響應時間過長&#xff0c;可能由于網絡、命令復雜度或服務器負載導致。 解…

閃測儀應用案例丨手機中框如何突破「尺寸檢測」瓶頸?

越來越多的手機中框&#xff0c;正改為更復雜的鏤空設計&#xff0c;這種設計不僅保持了手機中框的結構強度&#xff0c;還進一步減輕了機身重量&#xff0c;同時提升了散熱性能。這讓手機中框的自動化生產增加了很多難點&#xff0c;其中的尺寸檢測就遇到了許多瓶頸。? 尺寸精…

【字節跳動】數據挖掘面試題0011:介紹下時間序列分析常用知識點

文章大綱時間序列分析全面解析一、時間序列分析的基本概念二、時間序列分析的主要方法1. 描述性分析2.統計分析方法3.預測模型&#xff08;1&#xff09;傳統統計模型&#xff08;2&#xff09;現代機器學習模型三、時間序列分析的應用場景四、模型評估五、在字節跳動的應用場景…

ubuntu中交叉編譯iperf3到目標平臺xilinx

注&#xff1a;此文為ubuntu x86系統編譯程序到xilinx aarch64系統中。 一、工具準備 x86上編譯aarch64的編譯器 sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu #保證編譯器在環境變量中&#xff0c;嘗試執行aarch64-linux-gnu-gcc 目標平臺的根文件系統rootf…

Java-數據結構-集合框架

什么是集合框架集合本質是java所實現的一組數據結構&#xff0c;提供了不同的增刪改查方法。集合就是定義了接口&#xff0c;再通過不同的類去實現定義的接口&#xff0c;這些實現了接口的類就是集合類&#xff0c;例如list&#xff0c;stack&#xff0c;map。集合框架的重要性…

黑馬點評系列問題之基礎篇16jedis redis依賴引入后仍然還是報錯

問題描述依賴已經導入進去了&#xff0c;在倉庫里有***.jar和***.pom這兩個文件&#xff0c;但是點開右面的maven還是有很多爆紅。點擊maven里的更新還是不行。解決點到配置文件pom.xml在lombok這個依賴的代碼下面&#xff0c;添加上版本號&#xff0c;刷新一下右鍵單擊pom.xml…

SQL 一鍵轉 GORM 模型,支持字段注釋、類型映射、tag 自定義!

SQL 一鍵轉 GORM 模型&#xff0c;支持字段注釋、類型映射、tag 自定義&#xff01; 在使用 Golang GORM 開發項目時&#xff0c;你是否也經歷過這些「重復性痛苦」&#xff1a; ? 拿到建表 SQL&#xff0c;要手動寫 struct? 字段多、類型復雜&#xff0c;還要寫 json、go…

前端計算機視覺:使用 OpenCV.js 在瀏覽器中實現圖像處理

一、OpenCV.js 簡介與環境搭建OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個強大的計算機視覺庫&#xff0c;廣泛應用于圖像和視頻處理領域。傳統上&#xff0c;OpenCV 主要在后端使用 Python 或 C 等語言。但隨著 WebAssembly (Wasm) 技術的發展&…