当前位置: 首页 > 后端技术 > Java

提高时效性和准确性的运营商路由网络挖掘|得物科技

时间:2023-04-01 20:18:47 Java

1简介合同履行时间是电商的生命线,直接关系到用户的消费体验。新华网[5]2022年双十一报道称,37.4%的受访者希望次日送达,29.91%的受访者希望当天送达。相较于其他物品,受访者对手机、电脑、数码产品的发货时效要求更高,希望当天或1-2天内收到货品。在合同履行场景中,主要阶段包括入库生产和第三方承运人发货。用户付款时,得物会根据仓库的生产情况和配送资源给用户一个承诺时限。1.1为什么要预测承运人专线时效?在履行合同的过程中,得物需要监控订单流向,及时发现可能逾期的订单(与用户承诺的时效相比)。这包括对仓库生产和第三方配送的监控。.在实际过程中,我们发现当配送节点发生变化时,运营商给出的预测是保守的。在下面的示例中,销售部门的承运人会给出更准确的预计交货时间,因此分拣中心承运人的预计交货时间容易出现误报。下图是承运人接口返回的预估配送时间的松散指标。可见,距离目的地越近,承诺的时限越准确。2运营商网络是如何工作的在建设运营商网络之前,有必要了解一下运营商网络是如何工作的。下面是A站点到E站点的配送示意图,分为以下内容:(1)节点,包括集散站点和分拣中心。(2)线路,包括干线和支线。例如出口到分拣中心的支线属于支线,分拣中心到分拣中心的主线。(3)班次:为了平衡成本和时效,承运人会设置生产班次。到达分拣中心后,需要根据目的地进行分拣。当一定数量的货物到达时,将从分拣中心出发,前往下一个节点。承运商在设置班次时,会考虑订单数量,同时考虑到运输的成本和时效性。上图:以紫色为例,在A网点,早上8:00截单,即8:00前交给承运人的货物,8:20左右封箱,然后从出口出发到B分拣中心,到达分??拣中心B的时间是11:40。此时赶上分拣中心B的班次,截止时间为12:00。分拣中心B会在12:30完成分拣并前往下一个分拣中心,以此类推完成整个配送流程。在构建运营商网络时,需要建模。除了节点、线路和班次外,核心还包括以下两个模型:(5)成品线,即从A网点到E网点经过所有节点。上图中:A出口-B分拣中心-C分拣中心-D分拣中心-E出口构成一条成品线。(6)成品线波浪:因为节点有波浪,所以也有成品线波浪。事实上,成品线的波数与第一个节点的波数相同。3如何搭建运营商网络在了解了运营商网络的工作原理之后,您需要开始搭建运营商网络。承运人会将航迹信息推送给得物,内容类似以下文字。对于每个运单,它的轨迹会经过很多节点,每个节点的数据类型如下:1.waybill_no表示运单号,同一个运单号会有多个节点记录2.station_index表示当前节点下标3.station_enum表示节点的类型,是分拣中心还是蓝牌奥特莱斯4.station_name表示节点的名称,如上例中的xxx销售部5.station_status表示节点的状态,如如进入或离开6.operate_time表示当前节点的运行时间。3.2track中是否真的有shift信息?载体网络的工作原理中提到,载体会轮班生产。你能从跟踪结果中找到轮班生产的证据吗?通过分析,我们猜测同一流向(比如从A分拣中心到B分拣中心)离开某个分拣中心(比如离开A分拣中心)的时间应该比较集中。实时地,通过一些简单的聚类方法,我们的猜想得到了证实。下图中,横轴代表从分拣中心出发的时间,每个点代表历史上的某个运单。纵轴没有商业意义,只是为了展示方便。上图使用kmeans聚类算法绘制,kmeans聚类算法需要指定簇数。因此,需要使用Knee/Elbow等算法进行簇数检测,对异常值敏感,所以最终在实现中使用了DBSCAN。3.3如何选择聚类参数DBSCAN不需要指定聚类的个数,但需要指定点与点之间的距离和点的密度。经过反复调整,最终确定的两个核心参数如下:0.25,也就是15分钟。点密度最多为总数的5%和2%。3.4如何解决跨天问题从上面的聚类图可以看出,同一波的点可能会出现跨天,即有些点从分布中心出发的时间可能是23:50,而有些分布的时间中心可能是00:10。这两点之间的欧式距离比较大,所以需要重写距离的度量函数。ret=abs(x[0]-y[0])ifret>12:ret=abs(24-ret)returnret3.5线路是如何串联的分析节点的生产转移是不够的和线的转变。它们需要串联起来得到成品线班次,以便在销售前或销售中应用。这里的处理做了一些简化。一方面,无法识别分拣中心的分拣浪潮。另一方面,不必关注分拣中心的分拣浪潮。其实串接成品线班次的过程如下:核心代码如下:Listnext=tmp.getResourceList().get(i).getWaveList();next.sort(Comparator.比较(NetworkResourceWaveDTO::getOffTime));布尔匹配=假;对于(NetworkResourceWaveDTOnextWave:next){if(nextWave.getOffTime()>p.getEndTime()){match=true;duration+=nextWave.getDurationDay();p=nextWave;中断;}}if(!match){duration+=next.get(0).getDurationDay()+1;p=next.get(0);}productLineWave.add(p);}3.6Level4addressanddispatch网点之间的关系是如何建立的从应用的角度来说,输入条件是买家的四级地址,但是运营商网络的终点是收货地址,因此需要建立承运人收货地址与四级地址的映射关系。映射关系的建立比较简单。在过去一段时间负责派送该四级地址的站点中,选择该地址派送订单最多的站点。4工程实施的挑战Part3更像是理论家的口才,那么如何在工程上实施呢?这包括ODPSSQL的开发、UDF开发和DDD,简而言之,需要十八种技能。4.1如何在ODPS中进行简单的机器学习在位移分析的过程中,使用了DBSCAN的聚类算法。如果这些算法用在odps上呢?其实DBSCAN算法已经用python实现了,odps支持用python写UDF。只是目前的odps运行环境没有安装DBSCAN相关的包,需要手动安装。安装教程参考阿里云官方文档4.2在线服务问题。上述清洗过程需要每天运行一次或至少每周运行一次。选择过去一个时间窗口内的数据进行训练,得到运营商的网络,从而及时感知运营商网络的变化。这意味着成品线、成品线波次、节点波次信息会定期更新。在线上服务的过程中,我们直接将数据存储在redis中。为了不占用太多内存,使用hash数据结构对内存进行了优化。当然hash的一个缺点就是不能给字段设置超时时间,也就是说某个key的某个字段的数据实际上是过期数据,但不会被删除,造成泄漏,但这种泄漏可以通过其他技术手段解决。5进展与规划目前,我们已经搭建了第三方运营商网络。第一次分支点预测的准确率约为65%,最后一次排序预测的准确率约为85%。未来的持续优化点包括:shiftaggregation(对于一些数据比较稀疏的行,需要做shiftaggregation),timedecay(清洗数据需要选择过去一段时间的数据,对于太旧的数据,它应该被衰减,这样它在result中的贡献就更小了)等,相信准确率还能进一步提高。6参考文献[1]。膝/肘点检测[2]。arvkevi/膝盖[3]。https://datascience.stackexchange.com/questions/46106/kmeans-...[4]。https://redis.io/docs/management/optimization/memory-optimiza...[5]。用户调查:今年11月11日消费者最关心“确定性”80%用户首选京东-新华每日电讯