话不多说,直接进入主题,项目中需要用到算法,之前略微了解(只知道基本排序算法。。)
1.简介
需求:物流项目:后期运力的估算,可以给出配送员的预估送达时间,即配送时效。
思路:这里面提到预估时间,结合数学知识,考虑使用线性回归方程来预测。
注:一元线性回归是一个主要影响因素作为自变量来解释因变量的变化,在现实问题研究中,因变量的变化往往受几个重要因素的影响,此时就需要用两个或两个以上的影响因素作为自变量来解释因变量的变化,这就是多元回归亦称多重回归。当多个自变量与因变量之间是线性关系时,所进行的回归分析就是多元性回归。
影响配送员送货时间的因素:
1.距离,距离送货地点的远近是最主要的,也就是送货地点的座标是最主要的。(货物通常是在各个仓发出)
2.时间段,上午10点和下午6点路上的交通状况肯定不一样,甚至是周一的上午10点和周五的上午10点路况都不一样
3.配送员一次配送手里接到的单量,如果一次接到的单量很多,甚至是这些订单又比较分散,那么从一个送货地点到另一个送货地点的时间也肯定和直接从仓出发到送货地点的时间不一致
误差:
但凡是预估,都要有大数据来支持最终的准确率,所以思路是先跑一段时间的数据,同路历史数据的整合和分析,来逐步减少误差率。
事先准备:
从运单主表中拿出每单的数据,那么可以从中拿到该订单配送地址的经纬度,想法是把经纬度四舍五入精确到小数点后两位,在分别加减0.05,这样就可以构成一个由四个座标点的四边形(实际面积大约一公里左右),由于是精确到两位小数的,那么再结合座标点的数据格式可以得出,全上海地区的所有的座标格子,他们不会重复,因为在加减0.05之后都会是以0.1为单位的,那么最终会是0.1,0.2,0.3,0.4…..但是这样看起来很不舒服,想法是把座标都扩大100倍,举例:由(31.21,121.40)变为(3121,12140),这样的话座标之间不会重复,在座标足够密集的时候甚至可以覆蓋全部地区,这是一个长期跑数据的过程。
做法:
启动定时器每10分钟去数据库中取出拿出每单的数据,根据数据中的座标字段和配送完成时间,来整理数据,放入缓存,
key:_$trans:H008:3103-12125:11:1,其中:H008表示站点,就是配送中心,会覆蓋一定的范围,各个站点组成了上海的全部板块,3103-12125就是H008站点曾经配送过的一个座标,多个这样的座标组成了H008的全部区域,11表示11点,表示这个区域11点的时候曾经配送过,那么每个小时配送效率都会不一样,1表示周几,一周七天的配送时效不同,用以区别,这样把一组多维的影响因素作为key来保存,可以最大化的细化影响因素,以达到配送时效的准确性。 计算数据: key:_$trans:H008:3113-12135:10~data
这里的key没有周的概念,想法是估算出一周内平均时效,这里用到一元回归算法。
x座标+1,套入公式计算方程系数 y=ax+b 中的a,反代入a0 + a1 * (x+1)就可以求得y座标。即估算的时效值