前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MATLAB调用pygame实现强化学习环境

MATLAB调用pygame实现强化学习环境

作者头像
万木逢春
发布2020-07-16 15:47:29
1.1K0
发布2020-07-16 15:47:29
举报
文章被收录于专栏:帮你学MatLab帮你学MatLab

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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帮你学MatLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档