需求背景:
我这边是澳洲代购的网站。澳洲这边又物流规则,我们需要根据物流给的物流规则进行分包,物流规则里有什么种类的商品,和什么种类商品混装的时候,数量,价值,种类不能超过多少一个包裹。
物流规则:
不同物流公司物流规则会不一样,总结了一下,大概是除了奶粉以外,剩下的东西可以被打包一起,但是会有物流规则限制,物流规则对不混装包,和混装包裹限制不同。
一个订单里的不同商品, 会被物流规则分为不同包裹,快递单会根据系统分好的不同包裹生成不同包裹的快递面单(面单里含商品内容)。
物流规则大致分为奶粉和非奶粉,奶粉的物流规则写好了,且不和非奶粉混为一个包裹。
非奶粉的不混装包裹写好了,非奶粉里的H类商品不会受商品单品数量限制
以下为设置面板
不混装包裹:除奶粉以外,同一种类的商品在一个包裹里视为不混装包裹。例子:swisse钙片150粒 在商品设置为了F类商品,Swisse鱼油400粒设置为了F类,当同一个包裹里有swisse鱼油400粒,swisse钙片150粒时,包裹里只有F种类的商品,被视为不混装包裹。不混装包裹会被物流规则里的,包裹总价值,包裹总重量,包裹商品总数量,单品数量限制。
单品数量:同一个条形码的商品。例子:包裹单品数量上限为5,那么包裹里最多只能放下swisse钙片150粒5个
混装包裹:除奶粉以外,不通种类商品在一个包裹里,视为混装。例子:Swisse钙片150粒,在商品被设置为F类商品,Swisse蜂蜜面膜,被设置为H类商品,当他们在一个包裹里的时候,被视为混装。
现况:商品无法均分,原来写好的物流规则会产生最后一个包裹1件2件商品,从而导致未满足1kg。原来的物流规则只能判断整个订单里时候是否混装,如果是的话整个订单都会按照混装的要求打包导致包裹数量过多。
均分:
因为首重为1kg,原来写好的物流规则会产生最后一个包裹1件2件商品,从而导致未满足1kg。
需求:
当订单里出现不同种类的商品时,奶粉走回原来的物流规则,剩下的商品需要满足物流规则的同时尽可能减少包裹数量的同时,商品得到均分,并运用原来的运费结算方式生成运费。
算法:以下是我想出来的算法可以让包裹进行均分和分包的,如果你们有更好的方法也可以直接用你们的
例子1:
假设一个订单里,F为30件,G为30件,H为30件,总价值为600,总重量为6kg
系统混装设置如下:
通过总数量计算包裹数量:90/8=12
通过总价值计算包裹数量:600/130=5
通过总重量计算包裹数量:6/4=2
通过混装时F类计算包裹数量:30/8=4
通过混装时G类计算包裹数量:30/8=4
通过混装时H类计算包裹数量:30/3=10
取以上包裹数量最大值: 12
So:该订单会被分为12个包裹
例子2: 假设一个订单里,同时出现F10件, G12件,I商品6件,J,J商品6件,总价值为200,总重量为6kg。
此时混合包裹数量只计算F类
通过总数量计算包裹数量:22/8=3 (这里排除了I类和J类,因为混装设置了0)
通过总价值计算包裹数量:200/130=2 (这里价值排除了I类和J类)
通过总重量计算包裹数量:6/4=2 (这里价值排除了I类和J类)
通过混装时F类计算包裹数量:10/8=2
通过混装时G类计算包裹数量:12/8=2
得出混装包裹数量为3,另外I类和J类不混装按单独类型直接均分打包。
我们这里可以在订单一开始先排除混装数量为0的商品,让他们单独一个包裹。
然后再进行判断剩下东西是否混装。
例子3:
假设一个订单里,F为10件,G为:10件,H为30件,总价值为600,总重量为6kg
系统混装设置如下:
通过总数量计算包裹数量:50/8=7
通过总价值计算包裹数量:600/130=5
通过总重量计算包裹数量:6/4=2
通过混装时F类计算包裹数量:10/8=2
通过混装时G类计算包裹数量:10/8=2
通过混装时H类计算包裹数量:30/3=10
这个时候,物流种类FGH里最大为10,但是只有一个,我们取第二大值,2为最少混装的包裹数量。
计算所有F类,G类,和最重和最高价值的6个H类(这里的6是2*3得来的)所有加起来的总重量,重价值/混合包裹包裹重量上限,总价值/混合包裹的价值上限,得出来的值对比上面的2,取最大值
得出最少单一不混装的包裹数量数量为(30-2*3)/5 (这里的5是单一物流时的数量上限)=5 最少5个不混装包裹*单一不混装数量上限是5=25,
这里的25意味着至少有25件将被分为单一不混装的包裹。
计算 最重和最高价值的25 件H类重量,价值的总和/H类的上限3.6Kg和$120。和5对比取最大值,例子如下:
已知H类至少有5个不混装包裹----------------A
通过前25个H类总价值计算包裹数量:600/130=5--------B
通过总重量计算包裹数量:6/4=2----------------------C
对比ABC取最大值,这个最大值就是最终的不混装包裹数量。
那么此时我们先填充单一不混装商品。
已知每个包裹最多可以放5件H,那么我们统计H类最重的前25个
最贵到最便宜分别为H1, H2, H3, H4, H5.......H25
单一包裹1放H1, H(5+(5-0)), H(5*2+(5-1)),H(5*3+(5-2)),H(5*4+(5-3))
单一包裹2放H2, H(5+(5-1)), H(5*2+(5-2)),H(5*3+(5-3)),H(5*4+(5-4))
单一包裹3放H3, H(5+(5-2)), H(5*2+(5-3)),H(5*3+(5-4)),H(5*4+(5-0))
单一包裹4放H4, H(5+(5-3)), H(5*2+(5-4)),H(5*3+(5-0)),H(5*4+(5-1))
单一包裹5放H5, H(5+(5-4)), H(5*2+(5-0)),H(5*3+(5-1)),H(5*4+(5-2))
然后判定这些分好包裹的价值是否超重量了,如果超重量了,把最接近重量的那个商品排除,放到混装待分类列表里
例如单一包裹总重量为4.3kg,可以得知4.3-4,.超过了,0.3kg,那么就在包裹单一包裹里找最接近0.3kg且大于0.3kg的,将它排除,把它放大到混装待分类列表里
然后上面判断完再判断这些分好包裹的价值是否超价值上限了,如果超过了价值,把最接近超过部分的价值排除,放到混装列表里
H(5+(5-1)) 这里的5是因为单一包裹数量为5
假设 H(5*2+(5-4)),H(5*3+(5-1))是被排除放到混装里的 即为H11,H19
,商品剩下
H11,H19 H26,27,28,29,30
F1,2,3,4,5,6,7,8,9,10
G1,2,3,4,5,6,7,8,9,10
F为10件,G为10件,H为7件,一共27件,剩下总价值300,重重量2kg
通过总数量计算包裹数量:27/8=4
通过总价值计算包裹数量:300/130=3
通过总重量计算包裹数量:2/4=1
通过混装时F类计算包裹数量:10/8=2
通过混装时G类计算包裹数量:10/8=2
通过混装时H类计算包裹数量:7/3=3
那么在这里取最大值4为混装包裹数量
1最贵,10最便宜
那么按照价格,把F分为F(0*4+(4-3)),F(0*4+(4-2),F(0*4+(4-1),F(0*4+(4-0),,(1*4+(4-3)),F(1*4+(4-2),F(1*4+(4-1),F(1*4+(4-0),
G分为(0*4+(4-3)),G(0*4+(4-2),G(0*4+(4-1),G(0*4+(4-0),,G(1*4+(4-3)),G(1*4+(4-2),G(1*4+(4-1),G(1*4+(4-0),
剩下的H 重新从贵到便宜排序H (0*4+(4-3)),H(0*4+(4-2),H(0*4+(4-1),H(0*4+(4-0),H(1*4+(4-3)),H(1*4+(4-2),H(1*4+(4-1)
混装包裹1 F(0*4+(4-3)),(1*4+(4-0)) G(0*4+(4-3)),(1*4+(4-0))
H(0*4+(4-3)),(1*4+(4-0))
混装包裹2 F(0*4+(4-2)),(1*4+(4-1)), G(0*4+(4-2)),(1*4+(4-1))
H(0*4+(4-2))
混装包裹3 F(0*4+(4-1)), (1*4+(4-2)), G 0*4+(4-1)), (1*4+(4-2))
H(0*4+(4-1))
混装包裹4 F(0*4+(4-0)),(1*4+(4-3)),G(0*4+(4-0)),(1*4+(4-3))
H(0*4+(4-0)),(1*4+(4-3))
上面的规律是以每四个为一个单位,四个里的最贵,搭配下一轮四个里的倒数第一贵,第二贵搭配倒数第二贵,以此类推
分配完后判断每个总重量,价值是否符合,如不符合,混合包裹数量+1,并重新按照上面流程重新分配。