(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

本文详述了一种赛车模拟中的路径优化和策略制定过程。首先,通过获取waypoints和赛道信息,计算出最优线路,采用曲率平均值比较进行线路调整。然后,制定了基于进度/步骤比例的奖励策略,并使用PPO算法,调整不同速度和训练时间的超参数进行迭代。在分析log后不断优化策略,最终实现自动提交以刷新成绩。文中强调,奖励函数和策略需随迭代调整,无法直接复制使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依旧是过去的流程

1. 获取waypoints

这一步没什么特别,与以往一样在代码中加入

waypoints=params['waypoints']
track_width = params['track_width']
print(f'LOG_DATA:{waypoints}')
print(f'LOG_DATA:{track_width}')

提取log之后得到赛道的基本信息,通过编写分析脚本得到以下数据:
一共 119 个点, 其中第一个点和最后一个点重合

  1. 中线长度 : center_length=17.709159380569023m
    在这里插入图片描述

  2. 赛道宽度 : 0.76 m

  3. 内线长度: inner_length=15.699500827244645m

  4. 外线长度: outer_length=19.732614828772252m

  5. 各个点的曲率,曲率比较大的地方弯转的比较急,也是训练时难以通过的地方
    在这里插入图片描述

  6. 各个点的最大速度

### 部分代码入下
    npyfileList = [filefullpath for filefullpath in glob2.glob('../CalcWaypoint/NpyFolder/*.npy')]
    wayLineList = np.load(npyfileList[5])
    inner_line,race_line,center_line,outer_line = loadWayPoint(wayLineList)
    lineSelect = race_line
    modeNumber = len(lineSelect)-1
    cList=[] # curvature 曲率
    for j in range(1,10,1):
        cList.append([menger_curvature(lineSelect[i%modeNumber], lineSelect[(i+j)%modeNumber], lineSelect[(i+2*j)%modeNumber], atol=1e-3) for i in range(len(lineSelect))])
    mList = [(i,min(item),max(item)) for i,item in enumerate(cList,start=1)]
    speedList = []
    # [speedList.append([1.4**2*1.3/(i+0.2) for i in iCount])  for iCount in cList]
    [speedList.append([sqrt(3.6/(curvature+0.05)) for curvature in curvatureList])  for curvatureList in cList]
    sList = [(i,min(item),max(item)) for i,item in enumerate(speedList,start=1)]

这里曲率在基础点上增加了0.05 是为了使速度控制在一定范围,否则曲率接近0时,速度为无穷大
这里我理解的最大速度就是小车失控打滑的速度,即离心力小于等于摩擦力
fmg=mv^2/r, 而 曲率 k = 1/r, 得到 v <= sqrt(fg/k),根据实际获取的log数据,计算得到 fg = 1.6 ** 2 * 1.4 =3.6
在这里插入图片描述

2. 计算最优线路

最优线路的原理就是将一点的曲率与相邻两点曲率的平均值做对比,如果小于相邻两点,就要将该点进行调整使得该点曲率等于相邻两点平均值,每进行一圈循环算一个迭代。
  1. 宽度系数0.9,迭代250次
    在这里插入图片描述

  2. 宽度系数0.9,迭代500次
    在这里插入图片描述

  3. 宽度系数0.9,迭代750次
    在这里插入图片描述

  4. 宽度系数0.9,迭代1000次
    在这里插入图片描述

  5. 宽度系数0.9,迭代1250次
    在这里插入图片描述

  6. 宽度系数0.9,迭代1500次
    在这里插入图片描述

3. 制定策略

我的策略是在完成度相同的情况下使用的步数越小,奖励值越多,即 核心 奖励:` progress / step`

4. 编写函数

base on yourself

5. 选择超参

算法选择:PPO
batch size : 512
学习率: 初始第一可选大一点, 0.0008,clone时根据实际情况依次减小

6. 不同速度/训练时间迭代

初始化第一次的时候选择 512,0.0008,[0.8,1.6], 45min
clone : 512,0.0006,[0.9,1.9], 35min
clone : 512,0.0004,[1,2.1], 35min
clone : 512,0.0003,[1,2.3], 35min
clone : 512,0.0003,[1,2.5], 30min
clone : 512,0.0002,[1,2.7], 30min
clone : 512,0.0002,[1,2.9], 30min
clone : 512,0.0002,[1,3.2], 30min

6.1 分析log,根据Log结果回到第3步

上面的迭代参数仅供参考,一般规则就是bath size选择最大,learn rate逐步减小,速度逐步增加
在策略这一块,当速度提高到一定时候,上面的策略不够用了,后面我增加了瞬时奖励,即越靠近最优线路并且 速度越大奖励值越高,这种做法短时间内将速度提高起来,整体来看效果还不错,将单圈8.2s 提高到7.9s,不过到速度提高到3.4m/s时发现小车喜欢跑蛇形,不过目前的奖励函数 对于这次比赛已经够用了,后面再想提高的话只能从控制转角使车头沿着最佳线路跑,尽量少走蛇形

7. 达到赛道极限之后使用自动提交工具自动提交

这个我称之为黑科技,一般通过多次提交能刷新自己的成绩,当然需要自己编写自动化脚本提交勒。
这次比赛的前几名都是通过编写工具不断提交刷新成绩,好的成绩离不开不断的尝试,看,第二名提交了1400次
在这里插入图片描述

注意:

最近有不少人私信我,上来就要 reward function做参考,在这里我申明下: 看上面的过程就知道这个reward function在迭代中会做相应的修改,也就是说最后的reward function 并不是说你用它来从头开始训练就能达到相同的效果,就算我给你了你也达不到同样的效果,因为整个过程中需要不停的分析再做小幅度修改代码以及超参。实在要参考,默认的三个reward function 你可以试试,大家参加比赛就不要想白嫖。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rambo.Fan

码字不易,打赏有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值