01
环境准备
前面我们已经能够通过MATLAB调用Python操作键鼠,也在MATLAB环境中建立简单的环境来训练强化学习模型,比如matlab倒立摆环境建模,现在我们需要稍稍复杂的环境,如果在MATLAB中从零开始搭建游戏环境耗时费力,一顿搜索之后也没发现可以利用的游戏m程序,试图通过调用python的gym库时遇到很大难题解决不了,底层pyglet库更是相当底层,想要扩展或者模仿也很有难度,所以我们选用pygame库来实现游戏环境,网上有很多开源的小游戏实现,还有个将pygame游戏包装成为强化学习环境的PLE库
下面就来准备环境
首先安装python(推荐使用Anaconda)
新建虚拟python环境(不建也行)
切换国内pip安装源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
安装numpy
pip install numpy
安装pygame
pip install pygame
安装pillow
pip install pillow
这里有已经打包好的PLE库
链接:https://pan.baidu.com/s/1S2wqde4K5IxCFXwMteUzxA
提取码:255q
下载解压后在ple-0.0.1.tar.gz所在的文件夹下打开命令行执行
pip install ple-0.0.1.tar.gz
然后把assets.zip解压复制到python.exe所在路径上一级文件夹下面的Lib\site-packages\ple\games\flappybird里面
这样几步我们就可以开始训练这只小鸟了
02
继承MATLAB的ENV
按照前面的在MATLAB中建立环境方法,引入python对象实现各个函数
classdef FlappyBirdEnv < rl.env.MATLABEnvironment
%FlappyBirdEnv: matlab的FlappyBird环境.
%% 属性设置
properties
show=true;
% pygame环境对象
p
% 初始状态
State
% python的actions对象list
actions
end
properties(Access = protected)
% 结束标记
IsDone = false
end
%% 必须的方法
methods
% 构造方法
function this = FlappyBirdEnv()
ple=py.importlib.import_module("ple");
PLE=ple.PLE;
FlappyBird=ple.games.flappybird.FlappyBird;
rewards = py.dict(pyargs('tick',0.01,'positive',1,'negative',-5));
game = FlappyBird(pyargs('width',uint8(200), 'height',uint8(400)));
p = PLE(game, pyargs('fps',uint8(30),'force_fps',false, ...
'display_screen',true,'reward_values',rewards));
p.init()
% 初始设置观察状态
observations = p.getGameState();
ObservationInfo = rlNumericSpec([int64(py.len(observations)) 1]);
% 设置动作
actions = p.getActionSet();
ActionInfo = rlFiniteSetSpec(double(1:int64(py.len(actions))));
% 继承系统环境
this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo);
% 初始化、设置
this.State=zeros(int64(py.len(actions)),1);
this.actions=actions;
this.p=p;
notifyEnvUpdated(this);
end
% 一次动作的效果
function [Observation,Reward,IsDone,LoggedSignals] = step(this,Action)
LoggedSignals = [];
action = getAction(this,Action);
Observation = cellfun(@double,struct2cell(struct(this.p.getGameState())));
this.State = Observation;
IsDone = this.p.game_over();
this.IsDone = IsDone;
% 计算reward
Reward = this.p.act(action);
notifyEnvUpdated(this);
end
% 环境重置
function InitialObservation = reset(this)
this.p.reset_game()
InitialObservation = cellfun(@int64,struct2cell(struct(this.p.getGameState())));
this.State = InitialObservation;
notifyEnvUpdated(this);
end
end
%% 可选函数、为了方便自行添加的
methods
% 动作转换
function force = getAction(this,action)
force=this.actions(py.int(action-1));
end
end
methods (Access = protected)
% 收到绘图通知开始绘图的方法
function envUpdatedCallback(this)
% 设置是否需要绘图
this.p.display_screen=int8(this.show);
end
end
end
03
测试环境
建立环境之后需要测试一下
% 获取环境
env = FlappyBirdEnv;
% 获取可观察的状态
obsInfo = getObservationInfo(env);
% 获取可观察的状态维度
numObservations = obsInfo.Dimension(1);
% 获取可执行的动作
actInfo = getActionInfo(env);
% 获取可执行的动作维度
numActions = length(actInfo.Elements);
rng(0)
% env.show=false;
for i=1:100
if env.p.game_over()
env.reset();
end
env.step(randi(numActions));
end
由于是随机执行动作,小鸟很快就撞墙了
接下来要做的就是建立强化学习模型,训练小鸟更多的穿越障碍水管了
PLE库在这里https://github.com/ntasfi/PyGame-Learning-Environment
pygame文档在这里https://www.pygame.org/docs/