2024华为软件精英挑战赛-智慧港口

做2024华为软件精英挑战赛智慧港口的经历,用时一周,时间用来钻牛角尖了,同时捡起c++又练习了一下,最高分40万,很遗憾最终没有获奖,仅记录别参考!

背景概述

智慧港口是港口建设趋势和发展的方向。 以信息物理系统为框架,通过高新技术的创新应用,使物流供给方和需求方沟通融入集疏运一体化系统;极大提升港口及其相关物流园区对信息的综合处理能力和对相关资源的优化配置能力;智能监管、智能服务、自动装卸成为其主要呈现形式,并能为现代物流业提供高安全、高效率和高品质服务的一类新型港口。在智慧港口领域,如何规划多机器人的任务执行,以实现最优调度;如何控制泊位和机器人的配合,达到最高价值等都是非常有价值的算法难题。

题目简介

目标

赚取更多的资金

任务描述

选手作为运输公司来运输货物赚取资金,每个选手有 5 艘轮船、10 个机器人。选手需要使用机器人来执行移动、搬运等动作来完成货物递送任务,同时赚取利
润。在运行结束时,选手拥有的资金数即为最终分数,所获得的资金越高越好。任务终点如下:

  • 进行多机器人取货、送货、卸货、移动的路径规划,不仅需要防止机器人在狭窄路段碰撞,也需要考虑货物的分配问题。
  • 制定轮船的运输策略,难度略低于机器人策略规划。

难点

由于是模拟智慧港口的真实场景,故选手程序需要在 15ms 内做出每一帧的决策,如果超过 15ms 未做出决策,则系统将直接忽略这一帧的控制进入下一帧,并且在选手程序返回控制指令前,不会再发送状态数据给程序。故需要进行算法优化,提高决策效率。

核心思路

1.初始化

初始化读入地图、轮船、货物的状态信息,进行记录

2.第一帧关键帧

所有机器人的位置和初始状态在第一帧给出,鉴于决策的15ms时间限制,需要在第一帧做好同步和决策准备。需要计算每一个机器人可以使用的泊位,避免后续重复计算。

3.后续帧

根据当前帧机器人和货物的状态进行实时决策,对于每一帧,运行逻辑均如下:

  • 判断货物的消失时间,如果过期则删除该货物。
  • 根据决策,输出控制指令。
  • 输出ok,开始下一帧。

对于机器人,核心决策方案为:

  • 货物优先级:根据货物的价值和距离,优先分配高价值和近距离的货物给机器人。
  • 泊位选择:选择距离最近的泊位
  • 路径规划:使用A*算法规划最短路径,确保机器人能快速到达目标。
  • 避让机制:提前一帧预判机器人的下一位置,设计避让策略,及时更新路线。

对于轮船,核心决策方案为:

  • 目标港口:根据各港口的货物价值,分配目标港口。
  • 港口等待:根据港口的货物装载速度和存量,分配等待时间。
  • 驶离策略:当检测到当前港口货物装载速度接近于0时离开当前港口,若自身容量充足,前往货物积压多的港口,否则前往交易地点卖出货物。

以下是最终决策函数的伪代码,这个决策将在每一帧都会使用一次:

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
函数 makeDestination()
初始化 positionsMap1 记录目标相同的机器人
初始化 positionsMap2 记录下一步目标相同的机器人
初始化 positionsMap3 记录下一步互为对方的机器人

遍历所有机器人 i
如果机器人 i 的路径为空,跳过
记录机器人 i 的目标和下一步目标到 positionsMap1 和 positionsMap2
遍历所有机器人 j (j > i)
如果机器人 j 的路径为空,跳过
如果机器人 j 的路径末尾与机器人 i 的路径末尾互为对方
记录机器人 i 和 j 到 positionsMap3

遍历 positionsMap2 (下一步目标相同)
如果有两个机器人
随机选择一个机器人,重复其当前位置到路径中

遍历 positionsMap3 (下一步互为对方)
对于每对机器人 (robot1, robot2)
如果两个机器人在同一列
尝试调整位置以绕开
如果无法绕开,重新规划路径
否则,如果两个机器人在同一行
尝试调整位置以绕开
如果无法绕开,重新规划路径

遍历所有机器人 i
如果机器人 i 状态为 0,重置机器人 i
否则
如果机器人 i 未携带货物
如果路径为空且没有目标货物
查找最近货物,规划路径
否则如果路径不为空且有目标货物
如果目标货物将消失,重新规划路径
否则如果路径为空且目标货物已到达
取货,规划送货路径
否则如果目标泊位异常状态
重新规划路径
否则(机器人已携带货物)
如果路径不为空且有目标泊位
继续前进
否则如果路径为空且目标泊位
卸货,重置机器人,规划取货路径
否则如果目标泊位异常状态
卸货或重新规划路径

遍历所有船只 i
如果船只 i 状态为 0 且没有目标
如果运输时间不足,发出出发指令
否则如果船只 i 状态为 1 且没有位置
查找货物最多的泊位,发出装船指令
否则如果船只 i 状态为 1 且有位置
装船,处理装船时间和容量
如果满足出发条件,发出出发指令
否则如果装船时间超限且当前位置无货物
查找货物最多的泊位,发出装船指令

运行效果

alt text

部署

代码结构如图:
alt text
代码采用c++编写,编译器使用g++,代码解压即可运行。
编译源代码:

1
g++ sdk/C++/main.cpp -o Demo/main.exe -O3

运行程序:

1
.\PreliminaryJudge.exe -f 0 -d .\output.txt -m maps\map-3.9.txt .\Demo\main.exe

其中,-f 0 表示随机数种子,-d 表示输出文件名,-m 表示地图文件名,.\Demo\main1.exe 表示程序名。
可视化结果:
右键运行replayer\CodeCraft_2024_Replayer.exe,选择replay里的.res文件即可看到运行效果。

git地址

https://github.com/FrWalkerCn/SMART_PORT