tsp的理論和實踐(9)LK簡介

tsp目錄算法

  1. 最簡單的實踐 juejin.im/post/5d1b14…
  2. 最簡單的理論 juejin.im/post/5d1b15…
  3. 當前tsp的現狀 juejin.im/post/5d1b19…
  4. 單起點任務分配 juejin.im/post/5d1c6d…
  5. 多起點任務分配 juejin.im/post/5d1dbe…
  6. 更簡潔的多起點分配 juejin.im/post/5d1dc2…
  7. 起點時間窗 juejin.im/post/5d1f1f…
  8. 終點時間窗和hk juejin.im/post/5d1f44…
  9. LK簡介 juejin.im/post/5d25b8…
  10. tsp系列暫停一下 juejin.im/post/5d302e…

tsp領域的問題, 並不都是tsp問題, 可是, tsp相關的算法通常都能解決, 只要你能爲某一個充滿個性的問題兒子找到他親生的解決方案爸爸.post

通過前面8篇的努力, 咱們實際上已經解決了幾乎全部的訂單分配問題, 可是, 分配不等於實際路線, 若是通過計算, 咱們給一我的分配了50單, 或者經過好比無人機技術, 咱們能夠24小時配送100單, 那麼這100單怎麼排布路線?優化

需求分析
  • 給100單這個數量級的訂單排布路線. 訂單數量級: 100 到 1000.
  • 隨時會插入訂單, 爲了優化效率, 這個計算咱們在客戶端計算, 也就是在手機上計算.
  • 考慮無人機的狀況, 這個計算要很是有效率, 所以, 咱們用簡單算法中效率最高的LK算法.
LK簡介
  • LK是一個交換的思路.
    • 好比: 12345造成了一條路徑
    • 咱們發現23這一段和45這一段交換成24和35會快.
    • 最終交換出來的路線就是12435. 如圖示:

  • LK是一個對初始路線不敏感的算法, 咱們能夠想象成登山, 他總能爬到附近的一個高峯, 可是, 這個高峯不見得是珠穆朗瑪峯. 所以, 後續有動態的LKH算法和鏈式LK算法
  • LK自己就是鏈式調用的. 參見下圖:

  • 咱們從C點出發, 目標是替換掉cb這根紅線.
  • 咱們發現c5這根藍線<cd. 那麼就用c5這根藍線替換掉cb這根紅線.
  • 此時, 還需記錄一個判斷就是藍線+虛線是否小於紅線+綠線. 若是小, 那麼這就是一次完美的二交換, 不管是否小, 都要繼續進行下去.

  • 此時, 嘗試用49取代45, 只要(49+5c)<(45+cb), 藍線的總和<紅線的總和.
  • 若是此時(49+5c+8b)<(45+cb+89), 那麼這就是一次成功的三交換.
  • 一樣的不管是否三交換成功, 咱們都繼續交換下去, 下一次考慮的是綠線89的替換藍線.
  • 如此不停的交換下去, 直到沒有辦法作新的交換. 那麼就回退到有更多選擇的步驟, 再次進行交換.
  • 程序的終止爲設計的次數/時間到了, 或者進行了充分的交換, 沒有新的交換能夠作了爲止.
  • LK算法實際上是以2交換爲基礎的持續交換策略.
lk的擴展
  • lkh將基礎2交換替換爲5交換. keld helsgaun實現
  • 鏈式lk在一次lk找到解的狀況下, 作一次隨機4交換, 而後繼續作lk.
  • 動態lk, 可以根據須要作10交換等等更高的交換, Applegate和keld helsgaun分別實現
lk的實現

lk的實現是很是困難的. 有大量的細節, 且聽下回分解.設計

相關文章
相關標籤/搜索