物流公司在流通过程中,需要将打包完毕的箱子装入到一个货车的车厢中,为了提高物流效率,需要将车厢尽量填满,显然,车厢如果能被100%填满是最优的,但通常认为,车厢能够填满85%,可认为装箱是比较优化的。
设车厢为长方形,其长宽高分别为L,W,H;共有n个箱子,箱子也为长方形,第i个箱子的长宽高为li,wi,hi**(n个箱子的体积总和是要远远大于车厢的体积)**,做以下假设和要求:
-
长方形的车厢共有8个角,并设靠近驾驶室并位于下端的一个角的坐标为(0,0,0),车厢共6个面,其中长的4个面,以及靠近驾驶室的面是封闭的,只有一个面是开着的,用于工人搬运箱子;
-
需要计算出每个箱子在车厢中的坐标,即每个箱子摆放后,其和车厢坐标为(0,0,0)的角相对应的角在车厢中的坐标,并计算车厢的填充率。
问题分解为基础和高级部分。
基础部分:
- 所有的参数为整数;
- 静态装箱,即从n个箱子中选取m个箱子,并实现m个箱子在车厢中的摆放(无需考虑装箱的顺序,即不需要考虑箱子从内向外,从下向上这种在车厢中的装箱顺序);
- 所有的箱子全部平放,即箱子的最大面朝下摆放;
- 算法时间不做严格要求,只要1天内得出结果都可。
高级部分:
- 参数考虑小数点后两位;
- 实现在线算法,也就是箱子是按照随机顺序到达,先到达先摆放;
- 需要考虑箱子的摆放顺序,即箱子是从内到外,从下向上的摆放顺序;
- 因箱子共有3个不同的面,所有每个箱子有6种不同的摆放状态;
- 算法需要实时得出结果,即算法时间小于等于2秒。
C:(L, W, H) 分别表示车厢的长宽高
B:[(l1, w1, h1, n1), (l2, w2, h2, n2)....] 分别表示各个种类箱子的长宽高和个数
对于每次实验
利用染色体双倍体编码方案初始化种群
对于每次迭代
利用锦标赛选择算法选择父母个体,交叉产生子个体,再对子个体进行变异
计算原始种群和新种群的适应值,保留适应值较大的个体
对于B中的每个箱子bi
对于每种摆放方式
对于R中的每个剩余空间rj
if 剩余空间rj能容纳箱子bi
计算f(bi,rj)
对所有的f(bi,rj)进行排序并选f(bi,rj)最大的放置方式
放置箱子
更新剩余空间集合
python==3.9
numpy==1.21.5
matplotlib==3.5.1
遗传算法
# 运行
# 切换至项目文件目录下
python problem1.py
# 关闭所有画图窗口则程序执行结束,或Ctrl+C
# 参数
ITERATIONS = 1 # 实验次数
INDIVIDUALS = 36 # 种群个体数量
GENERATIONS = 400 # 一次实验种群要迭代几次,若要快速执行可以使用较小的数
PC = 0.8 # 交叉概率
PM1 = 0.2 # 变异概率,序列
PM2 = 0.02 # 变异概率,面
ROTATIONS = 2 # 2种摆放方式
# 保存结果路径,“当前项目文件夹/results/p1_时间”文件夹下
loca = time.strftime("%Y-%m-%d-%H-%M-%S")
new_dir_path = r'./results/p1_' + loca
# 若不想显示画图窗口注释掉problem1.py最后一行的plt.show()
最优剩余空间算法
# 运行
# 切换至项目文件目录下
python problem2.py
# 关闭所有画图窗口则程序执行结束,或Ctrl+C
# 参数
a = 0.1 # 评价函数中的权重大小
# 保存结果路径,“当前项目文件夹/results/p2_时间”文件夹下
loca = time.strftime("%Y-%m-%d-%H-%M-%S")
new_dir_path = r'./results/p2_' + loca
# 若不想显示画图窗口注释掉problem2.py最后一行的plt.show()
| 实例 | 箱子数/个 | 装箱数/个 | 填充率/% | 一次实验运行时间/s |
|---|---|---|---|---|
| 1 | 112 | 95 | 79.3579 | 1160.3924 |
| 2 | 86 | 68 | 81.7436 | 705.8007 |
| 3 | 86 | 68 | 81.7436 | 706.6164 |
| 4 | 168 | 138 | 86.6153 | 2377.1416 |
| 5 | 170 | 138 | 82.3183 | 2410.2772 |
| 6 | 81 | 55 | 83.4249 | 530.6383 |
| 7 | 114 | 83 | 80.3728 | 943.9763 |
| 8 | 117 | 97 | 86.0818 | 1150.8579 |
| 9 | 118 | 100 | 82.378 | 1171.4735 |
| 10 | 94 | 79 | 81.1889 | 751.1617 |
| 11 | 94 | 71 | 83.2185 | 728.3155 |
| 12 | 143 | 119 | 84.4573 | 1692.035 |
| 13 | 113 | 107 | 90.4239 | 1091.6599 |
| 14 | 115 | 101 | 82.0166 | 1018.6061 |
| 15 | 185 | 148 | 83.1975 | 2614.5615 |
| 16 | 123 | 99 | 81.4751 | 1117.9312 |
| 17 | 135 | 112 | 82.212 | 1604.4178 |
| 18 | 132 | 102 | 83.594 | 1392.4177 |
| 19 | 169 | 135 | 83.2612 | 2282.4529 |
| 20 | 138 | 117 | 86.2972 | 1637.4181 |
| 21 | 106 | 89 | 84.6151 | 885.6039 |
| 22 | 129 | 98 | 82.2218 | 1362.6445 |
| 23 | 149 | 118 | 83.646 | 1734.6266 |
| 24 | 138 | 113 | 79.6469 | 1495.146 |
| 25 | 144 | 110 | 83.2111 | 1595.5000 |
| 实例 | 箱子数 | 遗传算法 | 最优剩余空间算法 | ||||
|---|---|---|---|---|---|---|---|
| 装箱数 | 填充率 | 时间 | 装箱数 | 填充率 | 时间 | ||
| 1 | 112 | 99 | 84.381 | 856.6999 | 95 | 75.6698 | 0.0176 |
| 2 | 86 | 67 | 83.2415 | 509.1142 | 65 | 78.7947 | 0.01 |
| 3 | 86 | 70 | 83.9577 | 514.6427 | 65 | 78.7947 | 0.01 |
| 4 | 168 | 127 | 87.5499 | 1794.3564 | 126 | 80.1689 | 0.0369 |
| 5 | 170 | 128 | 83.3257 | 1681.1906 | 145 | 74.1348 | 0.0409 |
| 6 | 81 | 67 | 83.0663 | 397.3937 | 72 | 72.8851 | 0.01 |
| 7 | 114 | 76 | 80.9725 | 731.8815 | 94 | 72.5147 | 0.017 |
| 8 | 117 | 99 | 87.0289 | 860.0623 | 106 | 80.1779 | 0.0189 |
| 9 | 118 | 104 | 81.2353 | 854.4399 | 91 | 77.421 | 0.0189 |
| 10 | 94 | 78 | 80.6661 | 594.3835 | 70 | 79.3284 | 0.0156 |
| 11 | 94 | 78 | 82.7375 | 561.274 | 80 | 85.3818 | 0.0189 |
| 12 | 143 | 115 | 82.8305 | 1268.3255 | 124 | 77.1112 | 0.0289 |
| 13 | 113 | 104 | 90.4449 | 787.9814 | 91 | 80.443 | 0.018 |
| 14 | 115 | 77 | 82.9222 | 756.6434 | 98 | 74.2703 | 0.0239 |
| 15 | 185 | 141 | 81.0931 | 2012.8192 | 143 | 81.1764 | 0.0479 |
| 16 | 123 | 97 | 81.6357 | 855.1385 | 98 | 77.106 | 0.0229 |
| 17 | 135 | 103 | 80.2677 | 1118.3898 | 111 | 75.956 | 0.0269 |
| 18 | 132 | 108 | 82.8713 | 1070.6855 | 107 | 75.128 | 0.0249 |
| 19 | 169 | 128 | 81.7502 | 1706.851 | 143 | 77.1104 | 0.0389 |
| 20 | 138 | 121 | 83.5793 | 1165.8097 | 106 | 75.8864 | 0.0259 |
| 21 | 106 | 88 | 82.9114 | 674.5148 | 91 | 75.859 | 0.0259 |
| 22 | 129 | 96 | 81.53 | 998.4435 | 113 | 80.3366 | 0.0309 |
| 23 | 149 | 110 | 82.0138 | 1312.6288 | 118 | 76.0039 | 0.031 |
| 24 | 138 | 113 | 78.287 | 1205.3393 | 111 | 77.6242 | 0.0259 |
| 25 | 144 | 123 | 80.7588 | 1214.8495 | 128 | 78.3993 | 0.0329 |
[1] 李威,王士乾.三维装箱问题研究现状与展望[J].电脑知识与技术,2021,17(08):204-205+222.DOI:10.14004/j.cnki.ckt.2021.0694.
[2] 李孙寸,施心陵,张松海,董易,高莲.基于多元优化算法的三维装箱问题的研究[J].自动化学报,2018,44(01):106-115.DOI:10.16383/j.aas.2018.c160381.
[3] 朱向,雷定猷.带平衡约束三维装箱问题的双层混合遗传算法[J].交通运输系统工程与信息,2015,15(02):203-209.DOI:10.16097/j.cnki.1009-6744.2015.02.031.
[4] Andreas Bortfeldt, Hermann Gehring. A hybrid genetic algorithm for the container loading problem. European Journal of Operational Research. Vol. 131, Issue 1, pp. 143-161, 2001.
[5] 李昱蓉,侯波.集装箱单箱三维装载问题研究[J].物流科技,2013,36(12):71-74+77.
[6]尚正阳,顾寄南,唐仕喜,孙晓红.高效求解三维装箱问题的剩余空间最优化算法[J].计算机工程与应用,2019,55(05):44-50.