第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第一赛季优化题--无人机配送

前言

"全球校园人工智能算法精英大赛"是江苏省人工智能学会举办的面向全球具有正式学籍的全日制高等院校及以上在校学生举办的算法竞赛。其中的算法巅峰赛属于产业命题赛道,这是第一赛季,对最后一道优化题进行浅浅地解读。

无人机配送

问题描述

低空经济的应用场景不断上新,无人机在快件配送、医疗物资转运等方面发挥了重要作用。每个城市都建有一条竖直的无人机航站楼,航站楼上分布着若干起降点。

作为"巅峰航空"的航司调度员,你接到了一个任务,在每个城市的无人机航站楼上都选取一个起降点,并把这些点连接成一条运输路径,路径顺序由你决定。

路径可以自任意一个城市开始,并最终返回这个起始城市。

无人机飞行时有两种主要消耗:

(1)时间消耗:用两点之间的直线距离(欧氏距离)来表示,距离越短,时间消耗越少,时效性越好

(2)动能消耗:如果后一个点比前一个点的高度更高,就需要额外的能量爬升。用两点间的"斜率"(高度差÷水平差)来表示,如果下降或水平则不计。

不同的无人机航空公司有着不同的经营策略,廉价航空更注重成本控制,精品航空则更注重时效性。"巅峰航空"为你配置了一个权衡系数k,用来平衡"时效"与"能耗"的重要性,

k越大,越重视降低能耗,应尽可能选择平缓路线;k越小,越重视提升时效,应尽可能缩短总距离。

你的目标是通过合理的航线调度,实现更少的综合消耗。综合消耗=(1-k)x 总距离之和÷D+kx 总爬升斜率之和÷S.

你的k值为0.6。

输入格式

第1行:城市数量 M。

接下来每个城市:

1行:城市的起降点数量n和该城市的横坐标x;

下1行:n 个纵坐标y,表示该城市所有起降点的位置。

最后1行:D和S,用于将综合能耗的计算调至相同量级(归一化基准)。

其中,M、n、x、y、D、S均为整数,2≤M≤200,1≤n≤20,0x≤10000,0≤y≤10000。

输出格式

输出1行:以"@"相隔的M个数据对(城市序号,航站楼起降点席号)

其中,城市序号指该城市在输入中的出现次序,航站楼起隆点席号指该起隆点在该城市航站楼的出现次序。无人机在到达最后-个城市后将自动返回起始城市,故无需在未尾再次输出起始城市。

输入样例

3

3 2

1 3 8

4 6

4 8 9 10

4 10

1 3 7 10

7 1

输出样例

(1,3)@(3,3)@(2,2)

该示例仅作为输出的格式示例,并不代表该示例的综合消耗最少。


思路分析

这题是 TSP 的变体。

  1. 重新定义了距离,引入了斜距(不利于可视化),

  2. 重新定义了边,点与点之间变成了特殊的有向边

    如何理解这个"特殊的有向",简单来说:

    dist(a, b) != dist(b, a)


历来TSP 问题核心操作因子是

交换 交换 交换

点交换,边交换,区间交换等等

但这个 tsp 有向边的特殊性,导致只有点交换依旧有效(可以思考下为什么)

另一方面,其数据规模达到百级别,但只有10 秒时限,根本没有给成熟元启发式算法时间去进化。

因此这题最核心的解法

近似算法为主,元启发算法为辅助 ( 可忽略) 近似算法为主,元启发算法为辅助(可忽略) 近似算法为主,元启发算法为辅助(可忽略)


高分思路

高分思路,大概分两种策略

  • 先确定好序列(航站点),然后再确定具体序列里的参与点(起降点)
  • 动态调整构造(航站点+起降点)

这题高分思路非常多,挑几个讲讲。


以先确定序列,再确定参与点为列

按x轴排序(航站楼)+环状层序 DP(起降点)

这个思路,比赛的时候,很多人采用了

复制代码
# 按 x 轴排序
sort(stations, key=lambda s: s.x)

# 这边的 dp 有些复杂,大概这个架构(忽略边界,路径跟踪)
# dp[i][j], path[i][j]
for z in range(len(stations[0].ys):
	# 确定从第一个站点的第i 起降点出发
	dp[0][z] = 0
	for i in range(m - 1):
		for j in range(len(stations[i].ys)):
			for k in range(len(stations[i+1].ys)):
				dp[i+1][k] = min(dp[i+1][k], dp[i][j] + dist(stations[i].ys[j], stations[i+1].ys[k]))
	
	#处理最后的环,即m-1 到 0 节点
	for j in range(len(stations[m - 1].ys)):
		#取最小的
		min dp[m - 1][j] + dist(stations[m - 1].ys[j], stations[0].ys[z]);

不过大概只有 169 分,因为这是确定性算法,所以导致当时比赛的时候,很多人在这个分数点聚集成了一个小区间。

后面几个赛季感觉组委会引入时间耗时,内存消耗作为波动小分,打散了这种确定算法相同分数的情况。


多策略排序(航站楼)+环状层序 DP(起降点)

基于第一种思路,稍微做一些改进

根据多种策略,进行排序

  • 按 x 坐标排序
  • 按 y 坐标中位数,1/3 位数,2/3 位数,随机点排序
  • 按 x 坐标+y 坐标加权排序

注意:这里的排序,可以升序,也可以降序

后续采用同样的 DP 算法。

虽然看起来有些玄学,但是效果真不错,实测接近 400 分。


按x轴排序(航站楼)+爬山法(交换)+环状层序 DP(起降点)

按 x 轴排序后

不断地尝试交换领域节点,如果其对应的环状层序 DP解变得更好,则接受交换

复制代码
# 环状层序 DP 解
def dp_solve(stations):
	return score;

# 按 x 轴排序
sort(stations, lambda s: s.x)

# T为迭代次数
for i in range(T):
	for j in range(m):
		# 交换 j 和 j+1节点
		swap(j, j+1)
		tmp_socre = dp_solve(stations)
		if tmp_score > ans:
			# accept
			ans = tmp_score
		else:
			# reject,rollback
			swap(j, j + 1)	
	
	# 这里领域交换,也可以间距为 w(w>1), 甚至随机挑选 2 点

因为环状 层序 dp 解相对耗时 O ( M ∗ n 2 ) O(M*n^2) O(M∗n2),整体迭代次数有限。

这个解法,赛时前三

不过这里需要提到几点

  1. 爬山可以替换为模拟退火框架
  2. 第一步的排序特别重要,有就是前三,没有就是稀烂 T_T.

怎么解释这个反常点呢?

本身的数据量太大,导致其收敛进化太慢了,如果随机从一个初始解出发,其成长就太慢了,如果从一个高质量的近似解出发(按 x 轴排序也算一个好的近似解),那就属于站在巨人肩膀上,或者说更容易锦上添花。

这个算法,也扣合前文提到的观点

近似算法为主,元启发算法为辅助 ( 可忽略) 近似算法为主,元启发算法为辅助(可忽略) 近似算法为主,元启发算法为辅助(可忽略)


未完待续


基准测试

未完待续


写在最后

这篇文章是晚于 第二赛季和第三赛季,补上是因为想补齐整个赛季(单纯的完美主义作祟)。

那为啥之前一开始不写呢?

完败于 A I 大模型的深深无奈和绝望 完败于 AI 大模型的深深无奈和绝望 完败于AI大模型的深深无奈和绝望

犹记得 2024 年3D 打印机 那道优化题,其实做了很长时间的算法调研对比,还特意构建一整套测试框架,可视化调试工具,最后优化到满分。

有兴趣可以参看下文:

第六届全球校园人工智能算法精英大赛-算法巅峰专项赛

但是短短的一年内,AI 大模型的进化速度之快,令人骇人,它彻底改变了比赛的底层逻辑。

相关推荐
有为少年2 小时前
带噪学习 | Ambient Diffusion (NeurIPS 2023)下篇
人工智能·深度学习·神经网络·学习·机器学习·计算机视觉
upper20202 小时前
数据挖掘12
人工智能·数据挖掘
yohalaser2 小时前
追光者的“速度游戏“:光伏测试设备的技术迭代之路
人工智能·功能测试·可用性测试
翼龙云_cloud2 小时前
阿里云云渠道商:如何选择阿里云 GPU 配置方案?
服务器·人工智能·阿里云·云计算
1+2单片机电子设计2 小时前
基于 STM32 的人脸识别系统
网络·人工智能
2401_841495642 小时前
【自然语言处理】深度拆解自然语言处理(NLP)的知识体系:从理论根基到工程落地的全维度探索
人工智能·自然语言处理·语言学基础·数学与统计学·计算机科学与人工智能·领域特定知识·工程实践知识
知了一笑2 小时前
一文读懂RAG架构如何助力AI
人工智能·rag架构
xiaoxue..2 小时前
列表转树结构:从扁平列表到层级森林
前端·javascript·算法·面试
娱乐我有2 小时前
北京深梵科技公益捐赠二十万 赋能流浪动物温暖过冬
人工智能·科技·json