开发时注意参考参数格式说明:params.md
kernal
的核心函数是:one_epoch
,表示运行一个周期,一个周期里会调用:move_car
,move_bullet
,同时会更新视野信息,比赛信息等,并更新游戏画面(如果显示画面)
可以调用one_epoch
的有两个函数:step
和play
。step
做的是获取用户传入的指令orders
,把orders
转换为acts
,然后运行10个周期;play
的唯一区别在于:它会一直运行,然后每十个周期会从键盘获得一次orders
。注意:kernal
里的acts
与rmaics
里的actions
不同,而kernal
里的orders
与rmaics
里的actions
相同
以下为当前不开启可视化的测试结果:
车数量 | 动作指令 | 模拟时间 | 程序运行时间 |
---|---|---|---|
1 | full | 3min | 8.2s |
2 | full | 3min | 17.1s |
3 | full | 3min | 25.5s |
4 | full | 3min | 51.2s |
测试环境为:Windows 10,八核i5-8250U CPU 1.60GHz;CPU占用:~20%,注意,无论运行什么程序,CPU占用均在20%左右,在这里只是表明测试时实际使用的CPU算力
测试代码:
from rmaics import rmaics
import numpy as np
import time
game = rmaics(agent_num=2, render=True)
game.reset()
actions = np.array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]])
t1 = time.time()
for _ in range(3600): # 3600epoch = 180s
obs = game.step(actions)
t2 = time.time()
print(t2-t1)
使用numba或Cython
在kernal
层面同时进行多场比赛,这样可以不用专门开多个进程,可以提高学习速度
一个电脑同时操作四个车不太方便,所以如果人与人想进行对抗,需要联机操作,而实现人与人对抗的目的在于可以进行模仿学习,模仿学习的想法来源于DeepMind的AlphaStar
其他的部分基本不用动,改变获取指令的方法,改为联网获取,另外还可以在get_order
函数里将云台的控制方式改为用鼠标控制
模拟器毕竟不是真实世界,增加一些随机性有助于提高模拟到实际迁移能力,想法来源于OpenAI的研究Generalizing from Simulation
在函数move_car
的开头,对self.acts
增加一些误差,关于acts
的具体细节,可参见params.md,注意是kernal
里的acts
激光雷达和摄像头的视野用来表示能检测到车,当某个车在摄像头视野内时,可以自动瞄准这个车。现在使用的视野算法为:首先检测角度是不是符合,再检查两车中心联线上是否有阻碍(障碍物或车)。这样做的问题是:在有些刁钻的角度,会出现不合理的视野