算法描述
目前在物流,企业用工等领域,都有着大量的通过算法对接到的订单进行智能分配的需求。本文模拟的是用户下订单,然后商家接到订单,由配送人员进行派送的场景。在实际的应用中类似于百度外卖等有着非常多的实际应用。这种问题因为算法的复杂度太高,很难在短的时间周期内求解成功,所以有了像遗传算法,退火算法等启发式算法,以便在短的时间内能够求出近似的最优解。
本文模拟8个骑士,40个订单和40个商家进行计算。
算法描述
目前在物流,企业用工等领域,都有着大量的通过算法对接到的订单进行智能分配的需求。首先设计bean,商家接到订单的bean,这里需要商家和订单的坐标信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
模拟40个商家接到40个订单,其中商家和订单都可以是同一坐标位置,后续会考虑将坐标相近的位置进行聚类计算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
然后将商家和订单加入到集合中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
baoList.add(bao1);
baoList.add(bao2);
baoList.add(bao3);
baoList.add(bao4);
baoList.add(bao5);
baoList.add(bao6);
baoList.add(bao7);
baoList.add(bao8);
baoList.add(bao9);
baoList.add(bao10);
baoList.add(bao11);
baoList.add(bao12);
baoList.add(bao13);
baoList.add(bao14);
baoList.add(bao15);
baoList.add(bao16);
baoList.add(bao17);
baoList.add(bao18);
baoList.add(bao19);
baoList.add(bao20);
baoList.add(bao21);
baoList.add(bao22);
baoList.add(bao23);
baoList.add(bao24);
baoList.add(bao25);
baoList.add(bao26);
baoList.add(bao27);
baoList.add(bao28);
baoList.add(bao29);
baoList.add(bao30);
baoList.add(bao31);
baoList.add(bao32);
baoList.add(bao33);
baoList.add(bao34);
baoList.add(bao35);
baoList.add(bao36);
baoList.add(bao37);
baoList.add(bao38);
baoList.add(bao39);
baoList.add(bao40);
然后将商家和订单加入到集合中。
接着模拟骑士,假设骑士位置散落在不同的坐标点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
模拟8个骑士
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
将模拟数据代入算法
1 2 3 4 5 6 7 8 9 |
|
结果查看
查看运行结果,可知,迭代了1024次,耗时10秒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
分配的结果及cost计算结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
|
这样就可以得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
|
配送人员的配送顺序。
总结
目前算法中使用的是欧式距离来进行两个点之间距离的计算,运算的时间随着单子数量的增加会加长,并且在某些情况下还会有很多的约束条件,这些都是下一步算法需要改进的重点。