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的实现是很是困难的. 有大量的细节, 且听下回分解.设计

相关文章
相关标签/搜索