
简 介: 本文给出了第十七届全国大学生智能车竞赛信标比赛路径设计。路径参数: 亮灯个数为18盏灯; 路径难易程度定位 5975 ~ 5990;待选的路径总共6888条,本文给出了其中50条路径的。
关键词: 智能车竞赛,信标组,路径
01 信标路径
在 第十七届全国大学生智能车竞赛[1] 中的信标组比赛中,要求每次发车都使用不同的路径。下面给出了 十七届智能车竞赛线上赛道设计[2] 中关于信标组赛道规格,在此基础上,设计出八条信标比赛路径。

一、比赛路径设计
下图给出了信标组中四个信标以及发车区的位置坐标。

1、搜索所有可能路径
设计一条合理的比赛路径,遵循以下几条原则:
从给定的区域出发,到指定的信标灯结束,比如从发车区出发,到 4号灯结束; 给定亮灯的个数,比如12个; 去除路径中相连比较近的灯序,比如 1-2, 2-3;
下面是通过程序获得的从发车区出发,到 4号灯结束,点亮5个信标灯的所有的25条灯序。
[-1, 1, 3, 1, 3, 4]
[-1, 1, 3, 4, 1, 4]
[-1, 1, 3, 4, 2, 4]
[-1, 1, 3, 4, 3, 4]
[-1, 1, 4, 1, 3, 4]
[-1, 1, 4, 3, 1, 4]
[-1, 2, 4, 1, 3, 4]
[-1, 2, 4, 3, 1, 4]
[-1, 3, 1, 3, 1, 4]
[-1, 3, 1, 4, 1, 4]
[-1, 3, 1, 4, 2, 4]
[-1, 3, 1, 4, 3, 4]
[-1, 3, 4, 1, 3, 4]
[-1, 3, 4, 3, 1, 4]
[-1, 4, 1, 3, 1, 4]
[-1, 4, 1, 4, 1, 4]
[-1, 4, 1, 4, 2, 4]
[-1, 4, 1, 4, 3, 4]
[-1, 4, 2, 4, 1, 4]
[-1, 4, 2, 4, 2, 4]
[-1, 4, 2, 4, 3, 4]
[-1, 4, 3, 1, 3, 4]
[-1, 4, 3, 4, 1, 4]
[-1, 4, 3, 4, 2, 4]
[-1, 4, 3, 4, 3, 4]
随着点亮灯的个数增加,灯序的总数呈现指数增加趋势。下面表格给出了灯序长度与个数的关系。
| 亮灯个数 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 灯序总数 | 25 | 59 | 121 | 273 | 577 | 1275 | 2733 | 5981 | 12905 | 28115 | 60849 | 132289 | 286721 | 622739 | 1350613 | 2932109 |
2、度量路径难易程度
在所有可能路径中,车模运行的难易程度主要由两个因素决定:
路径的长度(L):它决定了车模运行时间和信标定位的难易程度; 车模转向角度(A):它影响了车模转向时间以及对信标搜索的难易程度;
综合以上因素,将路径中的长度(单位:厘米)和角度(单位 度)以 4:1 的比例加权在一起,即路径的难易程度(H)表示为:
下图是对 622739 个 18盏灯的难易程度进行统计的直方图。可以看到其中存在着大量的低分值的路径,还有一些路径的难易程度在 5000 以上。

下图是将所有难度超过5000分的路径进行直方图统计。得分平均值为5903, 标准方差为:231。

对于路径难易得分为5991分的路径,总共有105条。这些路径的前两个都是 2号灯 与 4号灯。
[2 4 1 3 1 4 1 4 1 4 2 4 2 4 2 4 2 4]
[2 4 1 3 1 4 1 4 2 4 1 4 2 4 2 4 2 4]
[2 4 1 3 1 4 1 4 2 4 2 4 1 4 2 4 2 4]
[2 4 1 3 1 4 1 4 2 4 2 4 2 4 1 4 2 4]
[2 4 1 3 1 4 1 4 2 4 2 4 2 4 2 4 1 4]
[2 4 1 3 1 4 2 4 1 4 1 4 2 4 2 4 2 4]
[2 4 1 3 1 4 2 4 1 4 2 4 1 4 2 4 2 4]
[2 4 1 3 1 4 2 4 2 4 2 4 1 4 2 4 1 4]
[2 4 1 3 1 4 2 4 2 4 2 4 2 4 1 4 1 4]
[2 4 1 4 1 3 1 4 1 4 2 4 2 4 2 4 2 4]
[2 4 1 4 1 3 1 4 2 4 1 4 2 4 2 4 2 4]
.....................
.....................
[2 4 2 4 2 4 1 4 2 4 1 3 1 4 1 4 2 4]
[2 4 2 4 2 4 1 4 2 4 1 3 1 4 2 4 1 4]
[2 4 2 4 2 4 1 4 2 4 1 4 1 3 1 4 2 4]
[2 4 2 4 2 4 1 4 2 4 1 4 2 4 1 3 1 4]
[2 4 2 4 2 4 1 4 2 4 2 4 1 3 1 4 1 4]
[2 4 2 4 2 4 1 4 2 4 2 4 1 4 1 3 1 4]
[2 4 2 4 2 4 2 4 1 3 1 4 1 4 1 4 2 4]
[2 4 2 4 2 4 2 4 1 4 2 4 1 4 1 3 1 4]
[2 4 2 4 2 4 2 4 2 4 1 3 1 4 1 4 1 4]
[2 4 2 4 2 4 2 4 2 4 1 4 1 3 1 4 1 4]
[2 4 2 4 2 4 2 4 2 4 1 4 1 4 1 3 1 4]
为了增加路径的随机性,将路径得分在5975 至 5990 之间的 6888 条路径挑选出来作为比赛路径候选者。这些路径中前 50 个路径如下图所示:
[1 3 1 3 1 4 2 4 2 4 2 4 2 4 3 4 3 4]
[1 3 1 3 4 2 4 3 1 4 2 4 3 4 2 4 2 4]
[1 3 1 4 3 4 2 4 2 4 2 4 2 4 3 1 3 4]
[1 3 4 2 4 2 4 2 4 3 4 2 4 1 3 1 3 4]
[1 3 4 3 1 3 4 1 3 4 2 4 2 4 2 4 2 4]
[1 4 2 4 3 1 3 4 3 1 3 4 2 4 2 4 2 4]
[2 4 1 3 1 4 2 4 1 4 1 4 2 4 1 4 1 4]
[2 4 1 4 1 4 1 3 1 4 2 4 2 4 1 4 1 4]
[2 4 1 4 1 4 2 4 1 4 2 4 1 3 1 4 1 4]
[2 4 1 4 2 4 1 4 2 4 2 4 1 3 1 4 1 4]
[2 4 2 4 1 4 1 4 1 3 1 4 2 4 1 4 2 4]
[2 4 2 4 2 4 1 4 1 4 1 3 1 4 2 4 1 4]
[2 4 2 4 3 4 3 1 3 4 2 4 3 4 3 1 3 4]
[2 4 3 1 3 4 3 4 3 1 3 4 3 4 2 4 2 4]
[2 4 3 4 3 4 2 4 3 1 3 1 3 4 3 4 2 4]
[3 1 3 4 1 4 1 4 1 4 3 4 2 4 2 4 1 4]
[3 1 3 4 1 4 2 4 1 4 1 4 2 4 2 4 3 4]
[3 1 3 4 1 4 3 4 1 4 1 4 1 4 1 4 1 4]
[3 1 3 4 2 4 1 4 1 4 3 4 1 4 2 4 2 4]
[3 1 3 4 2 4 2 4 2 4 3 4 1 4 1 4 1 4]
[3 1 3 4 3 4 1 4 2 4 1 4 1 4 2 4 2 4]
[3 1 4 1 3 4 1 4 1 4 1 4 2 4 3 4 1 4]
[3 1 4 1 3 4 1 4 2 4 3 4 1 4 2 4 2 4]
[3 1 4 1 3 4 2 4 2 4 1 4 1 4 3 4 2 4]
[3 1 4 1 4 1 3 4 1 4 1 4 1 4 1 4 3 4]
[3 1 4 1 4 1 3 4 2 4 2 4 3 4 1 4 1 4]
[3 1 4 1 4 1 4 1 3 4 3 4 1 4 1 4 2 4]
[3 1 4 1 4 1 4 1 4 2 4 1 4 3 4 3 1 4]
[3 1 4 1 4 1 4 1 4 3 4 3 1 4 1 4 2 4]
[3 1 4 1 4 1 4 2 4 2 4 2 4 3 4 3 1 4]
[3 1 4 1 4 1 4 3 1 4 1 4 1 4 2 4 3 4]
[3 1 4 1 4 1 4 3 4 1 4 1 4 3 1 4 2 4]
[3 1 4 1 4 2 4 1 3 4 1 4 2 4 2 4 3 4]
[3 1 4 1 4 2 4 1 4 1 4 3 1 4 3 4 2 4]
[3 1 4 1 4 2 4 1 4 3 4 1 4 1 3 4 2 4]
[3 1 4 1 4 2 4 2 4 1 4 3 4 3 1 4 1 4]
[3 1 4 1 4 2 4 3 1 4 1 4 3 4 1 4 2 4]
[3 1 4 1 4 2 4 3 4 2 4 1 3 4 1 4 1 4]
[3 1 4 1 4 3 1 4 1 4 3 4 1 4 1 4 2 4]
[3 1 4 1 4 3 4 1 3 4 1 4 1 4 1 4 1 4]
[3 1 4 1 4 3 4 1 4 2 4 1 3 4 2 4 2 4]
[3 1 4 1 4 3 4 2 4 1 4 2 4 1 4 1 3 4]
[3 1 4 2 4 1 3 4 1 4 1 4 1 4 1 4 3 4]
[3 1 4 2 4 1 3 4 3 4 1 4 2 4 2 4 1 4]
[3 1 4 2 4 1 4 1 4 1 4 1 4 3 1 4 3 4]
[3 1 4 2 4 1 4 1 4 3 1 4 2 4 3 4 2 4]
[3 1 4 2 4 1 4 2 4 1 4 3 1 4 1 4 3 4]
[3 1 4 2 4 1 4 2 4 3 4 3 1 4 2 4 1 4]
[3 1 4 2 4 1 4 3 4 1 4 2 4 1 4 1 3 4]
[3 1 4 2 4 2 4 1 3 4 3 4 2 4 1 4 1 4]

※ 总 结 ※
本文给出了第十七届全国大学生智能车竞赛信标比赛路径设计。路径参数:
亮灯个数为18盏灯; 路径难易程度定位 5975 ~ 5990;
待选的路径总共6888条,本文给出了其中50条路径的。
一、处理程序
1、路径生成与得分计算
#!/usr/local/bin/python
# -*- coding: gbk -*-
#******************************
# TEST1.PY -- by Dr. ZhuoQing 2022-07-19
#
# Note:
#******************************
from headm import *
import math
#------------------------------------------------------------
posdim = [(100,325), (75, 200), (75,75), (425,200)]
start1 = (250, 22.5)
def routearg(r, s):
global posdim
lenall = 0
angleall = 0
lastangle = 0
lastr = s
for id,rr in enumerate(r):
rrr = posdim[rr-1]
deltax = rrr[0] - lastr[0]
deltay = rrr[1] - lastr[1]
lenall += sqrt(deltax**2 + deltay**2)
angle = math.atan2(deltay, deltax)
lastr = rrr
if id > 0:
deltaangle = angle - lastangle
while deltaangle < -pi:
deltaangle += pi
while deltaangle > pi:
deltaangle -= pi
angleall += abs(deltaangle)
lastangle = angle
return lenall, angleall
#------------------------------------------------------------
'''
r = tspload('route18', 'r')
rscore = []
for id,rr in enumerate(r):
rscore.append(routearg(rr[1:], start1))
if id % 10000 * 0:
printf(id)
tspsave('score', rscore=rscore)
'''
#------------------------------------------------------------
rscore = tspload('score', 'rscore')
plt.hist(rscore, 50)
plt.xlabel("路径难易")
plt.ylabel("出现频次")
plt.grid(True)
plt.tight_layout()
plt.show()
exit()
#------------------------------------------------------------
def routerandall(r, endp, num):
global routeall
# printff(r, endp, num)
if len(r) >= num - 1:
rc = r.copy()
rc.append(endp)
routeall.append(rc)
return
rr = list(range(1,5))
if r[-1] in rr:
rr.remove(r[-1])
if r[-1] * 1:
if 2 in rr: rr.remove(2)
if r[-1] * 2:
if 1 in rr: rr.remove(1)
if 3 in rr: rr.remove(3)
if r[-1] * 3:
if 2 in rr: rr.remove(2)
if len(r) >= num - 2:
if endp in rr:
rr.remove(endp)
for rrr in rr:
rc = r.copy()
rc.append(rrr)
routerandall(rc, endp, num)
#------------------------------------------------------------
routeall = []
r = [-1]
routerandall(r, 4, 19)
tspsave('route18', r = routeall)
#------------------------------------------------------------
printf(len(routeall))
#for r in routeall:
# printf(r)
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#******************************
2、路径统计
#!/usr/local/bin/python
# -*- coding: gbk -*-
#******************************
# TEST2.PY -- by Dr. ZhuoQing 2022-07-19
#
# Note:
#******************************
from headm import *
r = tspload('route18', 'r')
rscore = tspload('score', 'rscore')
printf(shape(r))
c = where((rscore >= 5975) & (rscore < 5990))
rhigh = rscore[c]
route = r[c[0],1:]
printf(len(route), len(route))
printf(shape(route))
rsel = route[::50][:50]
for rr in rsel:
printf(rr)
#------------------------------------------------------------
#for r in route:
# printf(r)
#------------------------------------------------------------
printf(mean(rhigh), std(rhigh))
plt.hist(rhigh, 500)
plt.xlabel("路径难易")
plt.ylabel("出现频次")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#******************************
参考资料
第十七届全国大学生智能车竞赛: https://blog.csdn.net/zhuoqingjoking97298/article/details/121187014
[2]十七届智能车竞赛线上赛道设计: https://zhuoqing.blog.csdn.net/article/details/125355706
