tsp的理论和实践(9)LK简介

tsp领域的问题, 并不都是tsp问题, 但是, tsp相关的算法一般都能解决, 只要你能为某一个充满个性的问题儿子找到他亲生的解决方案爸爸.

经过前面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的实现是非常困难的. 有大量的细节, 且听下回分解.

转载于:https://juejin.im/post/5d25b86a51882569755f48f8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值