小程序3分钟跑最后一公里极速配送
2016-09-13 00:11
381 查看
得分:586581
未计算时间复杂度:运行时间 < 3min(i5,8GB)
赛题描述:
https://tianchi.shuju.aliyun.com/competition/information.htm?spm=5176.100067.5678.2.t7Bjn1&raceId=231581
较简单的解题思路:
由于不同订单同时到达同一配送点,订单服务时间依旧是分开算的,所以服务时间是固定的。可减少的时间有:路程消耗、惩罚时间、等待时间和回程时间。
从实际意义出发,网点与对应配送点间的距离应最小化(不会傻到将目标配送点的货物放在最远的网点吧),所以可认为:
每一个电商订单中,有网点a->配送点b,满足离配送点a最近的网点是网点b(事实上,数据基本满足此条件)。
并且网点数量少于快递员数量(少很多),所以电商配送问题可以转化为单个取货点CVRP问题。即快递员在配送完成后,回出发网点重新取货。
对于单个取货点CVRP问题,采用C-W节约法(三角形中,两边之和大于第三边,比较简单的方法,临时学起来容易)先建立路径。(就是路径已经固定,较不灵活)
先解决电商订单(网点快递员分配):
初始化每个网点site消耗时间为0xffff(大数)
1.遍历每个网点site;
2.计算向site增加一个快递员可节省的时间;
a.按回程时间增序遍历网点site的路径path(让快递员最后停留在远离网点的配送点,减少回程消耗),选出属于该网点的,目前使用时间最短的快递员,配送该路径上的包裹。计算出总消耗时间cost,节省时间为(当前site消耗时间 - cost)
b.如果节省时间大于最大节省时间,更新最大节省时间,并记录最优选择网点best_site
3.向网点best_site 增加快递员,按2的过程更新快递员路径。
解决O2O订单:
1.按取货时间遍历O2O订单oid;
2.选出处理订单oid消耗最少的快递员;
a.遍历每个快递员man
b.计算当前快递员所在位置与oid商家位置距离(cost1)
c.计算是否将取货超时,若超时则增加惩罚(cost2=超出时间*5(官方处罚)*W)。W为自己设置的参数,加大惩罚,防止部分快递员长时处于等待时间(闲着没事做),部分快递员一直处理忙碌(累死了),另外可以让更多的快递员集中在商家集中的地方。(加上W减少了10W消耗)
d.计算是否将送货超时,若超时则增加惩罚(cost3=超出时间*5(官方处罚)*W2)。W2类似过程c,复赛时发现W2设为0更高分(即去掉d)
e. 如果消耗小于最小消耗时间,更新最小消耗时间,并记录最优选择快递员best_man
3.让best_man处理订单oid,并分析是否取多个订单(这里只分析同一个商点到同一个配送点的订单)
取订单的条件:
a.满足两订单间取货时间间隔小于t,或者t满足设定的数值
b.快递员当前工作时间大于(下一个订单取货时间- T)
最后根据快递员所走路径生成结果
具体还是得看源码:
https://github.com/3ZY/Tian_chi/tree/master/Last_mile
未计算时间复杂度:运行时间 < 3min(i5,8GB)
赛题描述:
https://tianchi.shuju.aliyun.com/competition/information.htm?spm=5176.100067.5678.2.t7Bjn1&raceId=231581
较简单的解题思路:
由于不同订单同时到达同一配送点,订单服务时间依旧是分开算的,所以服务时间是固定的。可减少的时间有:路程消耗、惩罚时间、等待时间和回程时间。
从实际意义出发,网点与对应配送点间的距离应最小化(不会傻到将目标配送点的货物放在最远的网点吧),所以可认为:
每一个电商订单中,有网点a->配送点b,满足离配送点a最近的网点是网点b(事实上,数据基本满足此条件)。
并且网点数量少于快递员数量(少很多),所以电商配送问题可以转化为单个取货点CVRP问题。即快递员在配送完成后,回出发网点重新取货。
对于单个取货点CVRP问题,采用C-W节约法(三角形中,两边之和大于第三边,比较简单的方法,临时学起来容易)先建立路径。(就是路径已经固定,较不灵活)
先解决电商订单(网点快递员分配):
初始化每个网点site消耗时间为0xffff(大数)
1.遍历每个网点site;
2.计算向site增加一个快递员可节省的时间;
a.按回程时间增序遍历网点site的路径path(让快递员最后停留在远离网点的配送点,减少回程消耗),选出属于该网点的,目前使用时间最短的快递员,配送该路径上的包裹。计算出总消耗时间cost,节省时间为(当前site消耗时间 - cost)
b.如果节省时间大于最大节省时间,更新最大节省时间,并记录最优选择网点best_site
3.向网点best_site 增加快递员,按2的过程更新快递员路径。
解决O2O订单:
1.按取货时间遍历O2O订单oid;
2.选出处理订单oid消耗最少的快递员;
a.遍历每个快递员man
b.计算当前快递员所在位置与oid商家位置距离(cost1)
c.计算是否将取货超时,若超时则增加惩罚(cost2=超出时间*5(官方处罚)*W)。W为自己设置的参数,加大惩罚,防止部分快递员长时处于等待时间(闲着没事做),部分快递员一直处理忙碌(累死了),另外可以让更多的快递员集中在商家集中的地方。(加上W减少了10W消耗)
d.计算是否将送货超时,若超时则增加惩罚(cost3=超出时间*5(官方处罚)*W2)。W2类似过程c,复赛时发现W2设为0更高分(即去掉d)
e. 如果消耗小于最小消耗时间,更新最小消耗时间,并记录最优选择快递员best_man
3.让best_man处理订单oid,并分析是否取多个订单(这里只分析同一个商点到同一个配送点的订单)
取订单的条件:
a.满足两订单间取货时间间隔小于t,或者t满足设定的数值
b.快递员当前工作时间大于(下一个订单取货时间- T)
最后根据快递员所走路径生成结果
具体还是得看源码:
https://github.com/3ZY/Tian_chi/tree/master/Last_mile
相关文章推荐
- 最后一公里极速配送(三)
- 最后一公里极速配送
- 最后一公里极速配送 - 阿里云算法大赛总结
- 最后一公里极速配送(二)
- “饿了么”创始人张旭豪:打造专注外卖的短物流平台,解决好“最后一公里”的配送,让餐厅的地点不再是关键
- 快递配送最后一公里的痛:利益失衡后开始崩塌
- [VB.NET]如何在程序启动后让视图正好显示datagridview的最后一行?
- 程序是从main开始执行,最后main返回就结束了吗?
- unicode邮件发送程序最后发送quit失败
- VB程序编到最后,基本都是用API了,整个就是SDK编程了
- 程序人生之六:写在 2010 年最后一晚,我这两年的工作总结
- AMT:管理咨询冲击“最后一公里”
- 2009年最后三天写的程序
- 工信部两《意见》解读 网络布局意在最后一公里?
- 宽带,最后一公里激战正酣
- 通信术语“最后一公里”
- 友情提示:今天是6月份的最后一天,你的重要数据和程序备份了吗?
- 从“最后一公里”问题谈起
- 极速动车网络采集器5.2发布(最后更新11-1-16)
- 写在2008年最后的3分钟和2009年的开始