1.安装环境gym是一个开发比较强化学习算法的工具包。在python中安装gym库及其子场景相对容易。安装gym:pipinstallgym安装autopilot模块,这里使用EdouardLeurent在github上发布的包highway-env:pipinstall--usergit+https://github.com/eleurent/highway-env包含6个场景:高速公路-“highway-v0”合并-“merge-v0”环岛-“roundabout-v0”停车-“parking-v0”路口-“intersection-v0”赛道-“racetrack-v0”2.配置后环境安装完成后,可以在代码中进行实验(以高速公路场景为例):importgymimporthighway_env%matplotlibinlineenv=gym.make('highway-v0')env.reset()for_inrange(3):action=env.action_type.actions_indexes["IDLE"]obs,reward,done,info=env.step(action)env.render()运行后会在模拟器中生成如下场景:绿色为ego车辆env类.有许多参数可以配置。详情请参考原文档。3.训练模型1.数据处理(1)statehighway-env包中没有定义传感器,车辆的所有状态(观测值)都是从底层代码读取的,这样可以省去很多前期的工作。根据文档,状态(ovservations)有三种输出方式:Kinematics、GrayscaleImage和Occupancygrid。Kinematics输出一个V*F的矩阵,V代表需要观察的车辆数量(包括ego车辆本身),F代表需要统计的特征数量。示例:生成数据时,默认进行归一化处理,取值范围:[100,100,20,20]。也可以设置非本车的车辆属性是地图的绝对坐标还是本车的相对坐标。定义环境时,需要设置feature的参数:config=\{"observation":{"type":"Kinematics",#选择5辆车进行观察(包括egovehicle)"vehicles_count":5,#共有7个特征"features":["presence","x","y","vx","vy","cos_h","sin_h"],"features_range":{"x":[-100,100],"y":[-100,100],"vx":[-20,20],"vy":[-20,20]},sderort"absolute":False,"},"simulation_frequency":8,#[Hz]"policy_frequency":2,#[Hz]}GrayscaleImage生成一个W*H的灰度图,W代表图像宽度,H代表图像高度Occupancygrid生成一个WHF的三维矩阵W*H表表示ego车辆周围的车辆情况,每个格子包含F个特征(2)actionhighway-env包中的动作分为连续型和离散型两种。连续型动作可以直接定义油门和转向角的值,离散型包含5个元动作:ACTIONS_ALL={0:'LANE_LEFT',1:'IDLE',2:'LANE_RIGHT',3:'FASTER',4'SLOWER'}(3)rewardhighway-env包除了停车场景外,使用了相同的reward函数:这个函数只能在它的源代码中改变,在外层只能调整权重.(停车场景的rewardfunction在原文档里,我懒得敲公式了。。。)2.模型DQN网络的结构和构建过程在我的另一篇文章中已经讲过了,就不赘述了在这里详细解释。我使用第一个状态表示-运动学进行演示。由于状态数据量较小(5车*7特征),可以忽略CNN的使用,直接将二维数据的大小[5,7]转化为[1,35]。模型的输入是35,输出是离散动作的个数,一共5个。import?torchimport?torch.nn?as?nnfrom?torch.autograd?import?Variableimport?torch.nn.functional?as?Fimport?torch.optim?as?optimimport?torchvision.transforms?as?Tfrom?torch?import?FloatTensor,?LongTensor,?ByteTensorfrom?collections?import?namedtupleimport?random?Tensor?=?FloatTensorEPSILON?=?0????#?epsilon?used?for?epsilon贪婪的方法Gamma=0.9Target_network_replace_freq=40#目标netOwrkupdatesMemory_capacity=100batch_size=80lr=0.01#学习rateclassdqnnet(nn.module):.Linear(35,35)self.linear2=nn.Linear(35,5)defforward(self,s):s=torch.FloatTensor(s)s=s.view(s.size(0),1,35)s=self.linear1(s)s=self.linear2(s)返回s类DQN(对象):def__init__(self):.lf.target_net=dqnnet(),dqnnet()self.learn_step_counter=0self.memory=[]self.position=0self.capacity=memory_capacity=memory_capacity=embory_capacityself.optimizer=torch.optim.adam(self.net.parameters(self.net.parameters),,,),,,lr=LR)self.loss_func=nn.MSELoss()defchoose_action(self,s,e):x=np.expand_dims(s,axis=0)ifnp.random.uniform()<1-e:actions_value=self.net.forward(x)action=torch.max(actions_value,-1)[1].data.numpy()action=action.max()其他:动作=np.random,5动作defpush_memory(self,s,a,r,s_):iflen(self.memory)
