tsp的理论和实践系列(5)多起点的任务分配

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

问题概述
  1. 随着业务的扩张, 你有了更多的仓库/取件点.
  2. 随着业务的扩张, 你开始接受不少友商的订单, 致使你的取派点的比例从1:300, 一直降低到接近1:3, 也就是说平均一个取件点只有3个目的地, 甚至于不少都是1个目的地的订单.
思考

刚刚看到这个问题的时候, 感受上最小生成树已经不够用了, 那么怎么办? 咱们想到了一个很直观的方法.3d

  • 每一个配送员均可以有一个路径. 新的订单分配给谁? 取决于这个订单加入以后, 谁的路径增长的值最小, 简单地说就是成本最小原则.
  • 这基本上是一个克鲁斯卡尔算法, 多个订单进来, 每次都把开销最小(插入队列后造成的权重最小, 就是新增里程最小)的一个插入配送队列. 每次插入以后再更新一下这个被插入的队列(路径)对全部剩余订单的权重.

大约用了2天时间, 我实现了这个算法, 却悲哀的发现, 他虽然是一个多项式时间的算法, 可是开销达到了n的3次方, 虽然用强劲的机器, 或者引入并行运算就能解决, 可是, 这个算法还有一个关键的弱点: 不够简洁, 将来扩展会很困难, 因此, 咱们应该继续寻找更好地算法. 此时, 我想到了参考友商的方案.cdn

友商公开的方案

方案一, 二分图blog

  • 可是, 很遗憾, 咱们实际的数据逻辑是: 某个订单的起点和它的终点关系比较紧密, 而不一样的订单的起点之间没有什么关系. 这个二分图抽象并没有明显的业务实际含义, 相反, 它引入了一个没必要要的复杂度.

方案二: 多边形队列

  • 尺度问题, 只要a-a足够长, 那么顺轮的b-b订单就不会给他. 由于面积比下面的c-c-b-b大
  • 方向问题, 订单的方向和顺路由很大的关系, 每一个订单都要先取后送, 而计算面积的时候, 却没有考虑这个, 会致使错误的分配.
    • 好比途中的b-b会分给a-a仍是c-c呢? 从橙a出发, 明显不如橙c出发顺路. 可是面积不这么看, 并无考虑,
    • 因为路线方向的影响, 上面的aa线路只是少走了一条短边, 下面的cc线路会少走一条唱片
    • 上面的线路是a取-a派-b取-b派, 而下面的线路是c取-b取-b派-c派

至此感受咱们走到了死胡同, 若是要突破, 咱们须要更有力的工具, 各位大爷别急, 我们下回分说路由

相关文章
相关标签/搜索