一、构建机器人寻找金币的环境
构建机器人寻找金币的环境需要编写四个主要函数:- reset():利用均匀随机分布初始化智能体的状态;
- render():扮演图像引擎的角色,渲染,显示环境中物体的图像;
- step():扮演物理引擎的角色,模拟环境中物体的运动规律;
- transform():状态转换,获得下一个状态,立即汇报,是否终止和调试项
在编写render()时,我们可以通过gym库中的classic_control目录下的redering模块绘制环境,主要利用rendering模块中的make_circle()、Line()、Transfrom()等函数或类绘制环境,代码如下:
import logging
import random
import numpy as np
import gym
import ptvsd
ptvsd.enable_attach(address = ('0.0.0.0', 5678))
ptvsd.wait_for_attach()
logger=logging.getLogger(__name__)
class GridEnv(gym.Env):
metadata={
'render.modes':['human','rgb_array'],
'video.frames_per_second':2
}
def __init__(self):
#机器人初始化状态
self.x=[140,220,300,380,460,140,300,460]
self.y=[250,250,250,250,250,150,150,150]
#终止状态
self.terminate_states=dict()
self.terminate_states[6]=1
self.terminate_states[7]=1
self.terminate_states[8]=1
#状态空间
self.states=[1,2,3,4,5,6,7,8]
#动作空间
self.actions=['n','e','w','s']
#回报函数
self.rewards=dict()
self.rewards['1_s']=-1.0
self.rewards['3_s']=1.0
self.rewards['5_s']=-1.0
#状态转移概率
self.t=dict()
self.t['1_e']=2
self.t['1_s']=6
self.t['2_w']=1
self.t['2_e']=3
self.t['3_w']=2
self.t['3_e']=4
self.t['3_s']=7
self.t['4_w']=3
self.t['4_e']=5
self.t['5_w']=4
self.t['5_s']=8
#折扣因子
self.gamma=0.8
#显示器
self.viewer=None
#状态
self.state=None
#在类对象内部访问实例属性
#获取终止状态
#返回下一步状态、立即回报和状态转移概率
def transform(self,state,action):
#遍历动作空间,当不在状态转移概率中时,该状态设为-1
s=-1
r=0
key='%i_%s'%(state,action)
if key in self.rewards:
r=self.rewards[key]
if key in self.t:
s=self.t[key]
return self.t,s,r
def getTerminal(self):
return self.terminate_states
#获取状态空间
def