Q-Learning的学习及简单应用
强化学习(Reinforcement Learning)是一种机器学习算法,强调如何基于环境而行动,以取得最大化的预期利益,在机器人领域应用较为广泛。Q-Learning属于强化学习的经典算法,用于解决马尔可夫决策问题。
马尔可夫决策过程(Markov Decision Processes,MDP)
一个例子:k-armed bandit
马尔可夫问题求解
使用Q-Learning挑战robocode
package robot;import java.awt.*;
import java.awt.geom.*;
import robocode.*;
import robocode.AdvancedRobot;public class QLRobot extends AdvancedRobot {//Q值存储表private QLTable table;//在状态state下采取action行为获得的回报private double reward = 0.0;//火力值(0,3]private double firePower;//方向private int direction = 1;//是否撞墙private int isHitWall = 0;//是否被击中private int isHitByBullet = 0;//存取数据private Data data = new Data();//敌方状态private double distance = 100000;private long ctime;private double targetX;private double targetY;private double bearing;private double turnDegree = 20.0;private double moveDistance = 100.0;public void run() {table = data.readData();setAdjustGunForRobotTurn(true);setAdjustRadarForGunTurn(true);turnRadarRightRadians(2 * Math.PI);while (true) {robotMovement();firePower = 50 / distance;if (firePower > 3)firePower = 3;//radarMovement();if (getGunHeat() == 0) {setFire(firePower);}execute();}}void doMovement() {if (getTime() % 20 == 0) {direction *= -1;setAhead(direction * 300);}setTurnRightRadians(bearing + (Math.PI / 2));}private void robotMovement() {int state = getState();int action = table.selectAction(state);table.learn(state, action, reward);reward = 0.0;isHitWall = 0;isHitByBullet = 0;switch (action) {case 0:setAhead(moveDistance);break;case 1:setBack(moveDistance);break;case 2:setAhead(moveDistance);setTurnLeft(turnDegree);break;case 3:setAhead(moveDistance);setTurnRight(turnDegree);break;case 4:setAhead(moveDistance);setTurnLeft(turnDegree);break;case 5:setBack(moveDistance);setTurnLeft(turnDegree);break;case 6:setBack(moveDistance);setTurnRight(turnDegree);break;}}private int getState() {int heading = State.getHeading(getHeading());int targetDistance = State.getTargetDistance(distance);int targetBearing = State.getTargetBearing(bearing);int state = State.Mapping[heading][targetDistance][targetBearing][isHitWall][isHitByBullet];return state;}private void radarMovement() {double radarOffset;if (getTime() - ctime > 4) {radarOffset = 4 * Math.PI;} else {radarOffset = getRadarHeadingRadians() - (Math.PI / 2 - Math.atan2(targetY - getY(), targetX - getX()));radarOffset = NormaliseBearing(radarOffset);if (radarOffset < 0)radarOffset -= Math.PI / 10;elseradarOffset += Math.PI / 10;}setTurnRadarLeftRadians(radarOffset);}double NormaliseBearing(double ang) {if (ang > Math.PI)ang -= 2 * Math.PI;if (ang < -Math.PI)ang += 2 * Math.PI;return ang;}double NormaliseHeading(double ang) {if (ang > 2 * Math.PI)ang -= 2 * Math.PI;if (ang < 0)ang += 2 * Math.PI;return ang;}public void onBulletHit(BulletHitEvent e) {double change = e.getBullet().getPower() * 9;reward += change;}public void onBulletMissed(BulletMissedEvent e) {double change = -e.getBullet().getPower();reward += change;}public void onHitByBullet(HitByBulletEvent e) {double power = e.getBullet().getPower();double change = -(4 * power + 2 * (power - 1));reward += change;isHitByBullet = 1;}public void onHitRobot(HitRobotEvent e) {reward += -6.0;}public void onHitWall(HitWallEvent e) {double change = -(Math.abs(getVelocity()) * 0.5 - 1);reward += change;isHitWall = 1;}public void onScannedRobot(ScannedRobotEvent e) {if (e.getDistance() < distance) {//找到敌人方位double absbearing = (getHeadingRadians() + e.getBearingRadians()) % (2 * Math.PI);//旋转到该方位setTurnLeft(absbearing);targetX = getX() + Math.sin(absbearing) * e.getDistance();targetY = getY() + Math.cos(absbearing) * e.getDistance();bearing = e.getBearingRadians();ctime = getTime();distance = e.getDistance();}}public void onWin(WinEvent event) {data.saveData(table);}public void onDeath(DeathEvent event) {data.saveData(table);}
}
package robot;import java.io.Serializable;public class QLTable implements Serializable{private double[][] table;//状态数private final int states = 4 * 20 * 16 * 2 * 2;//行为数private final int actions = 7;//是否是第一次行动private boolean first = true;//保存上一次状态private int lastState;//保存上一次行为private int lastAction;//衰减变量private double gamma = 0.8;//学习率private double e = 0.1;//探索值private double exploration = 0.2;public QLTable() {table = new double[states][actions];for (int i = 0; i < states; i++)for (int j = 0; j < actions; j++)table[i][j] = 0;}//对上个状态采取的action进行反馈public void learn(int state, int action, double reward) {if (first)first = false;else {double oldValue = table[lastState][lastAction];double newValue = (1 - e) * oldValue + e * (reward + gamma * getMaxValue(state));//更新Q值table[lastState][lastAction] = newValue;}lastState = state;lastAction = action;}//获得某个state的最大Q值private double getMaxValue(int state) {double max = table[state][0];for (int i = 0; i < actions; i++) {if (table[state][i] > max)max = table[state][i];}return max;}//根据目前的state,选择最合适的actionpublic int selectAction(int state) {double qValue;double sum = 0.0;double[] value = new double[actions];for (int i = 0; i < value.length; i++) {qValue = table[state][i];//保证为正数,且不改变函数增减性value[i] = Math.exp(qValue);sum += value[i];}//计算P(a|s)if (sum != 0) {for (int i = 0; i < value.length; i++) {value[i] /= sum;}} elsereturn getBestAction(state);int action = 0;double cumProb = 0.0;double randomNum = Math.random();//大于探索值进行探索if (randomNum < exploration) {//保证每一种action都探索到while (randomNum > cumProb && action < value.length) {cumProb += value[action];action++;}return action - 1;} else {//greedyreturn getBestAction(state);}}//获得最优actionprivate int getBestAction(int state) {double max = table[state][0];int action = 0;for (int i = 0; i < actions; i++) {if (table[state][i] > max) {max = table[state][i];action = i;}}return action;}
}
Q-Learning的学习及简单应用相关推荐
- Q learning--强化学习系列文章3
Q learning 强化学习例子----穿越冰湖的游戏 FrozenLake environment是OpenAI公司(特斯拉公司的老板的另外一个公司,主要研究AI技术)开发的一个环境,这个环境可以 ...
- RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(简单迷宫)的宝藏位置
RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(简单迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...
- q learning matlab,用Matlab实现简单的Q-learning算法(学习走出房间)
看到一个简单有趣的Q learning例子,写了段matlab代码实现一下.有兴趣的请先阅读原文 链接 dbstop if error%stop at the error if it happens ...
- Q学习(Q learning) 强化学习
Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化_Morty 的挖坑记录-CSDN博客 强化学习(MATLAB) - 叮叮当当sunny - 博客园
- [PARL强化学习]Sarsa和Q—learning的实现
[PARL强化学习]Sarsa和Q-learning的实现 Sarsa和Q-learning都是利用表格法再根据MDP四元组<S,A,P,R>:S: state状态,a: action动作 ...
- 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)
最近博主在看强化学习的资料,找到这两个觉得特别适合入门,一个是"一文入门深度学习",一个是"莫烦PYTHON". 建议:看资料的时候可以多种资料一起参考,一边调 ...
- RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置
RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(复杂迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...
- [强化学习实战]出租车调度-Q learning SARSA
出租车调度-Q learning & SARSA 案例分析 实验环境使用 同策时序差分学习调度 异策时序差分调度 资格迹学习调度 结论 代码链接 案例分析 本节考虑Gym库里出租车调度问题(T ...
- 强化学习(二):Q learning 算法
强化学习(一):基础知识 强化学习(二):Q learning算法 Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action ...
- 【强化学习笔记】从 “酒鬼回家” 认识Q Learning算法
1.背景 现在笔者来讲一个利用Q-learning 方法帮助酒鬼回家的一个小例子, 例子的环境是一个一维世界, 在世界的右边是酒鬼的家.这个酒鬼因为喝多了,根本不记得回家的路,只是根据自己的直觉一会向 ...
最新文章
- DllMain使用的注意事项
- 伏威谈淘宝网的高并发处理与压力测试(转)
- P01:01背包问题(转)
- “浴霸”三摄出镜率真高!中兴Blade 20工信部入网
- Struts2相关面试题
- 如何使用Dojo的DatePicker控件制作联动日期选择器
- 如何找到最快的DNS服务器!!
- 人工智能被拒绝,语音识别做不到给电视直播加字幕?
- linux 编译c q64,Ubuntu 12.04 LTS 64位搭建Qt4终端编译环境
- win10安装、卸载、升级tensorflow命令
- 使用VS2017和Qt编译OpenCV
- 我用Anylogic写了一个遗传算法
- vue src动态加载请求获取的图片
- Easy2game使用
- 【ML】从特征分解,奇异值分解到主成分分析
- 轻松学python(一)
- Leetcode13. 罗马数字转整数Leetcode14. 最长公共前缀Leetcode15. 三数之和Leetcode16. 最接近的三数之和Leetcode17. 电话号码的字母组合
- 缓存、缓存算法和缓存框架简介
- qt for android程序保活 程序后台一直运行不被清理掉(未完)
- Oracle11g RAC 启动流程梳理(二)OHASD简析和启停实验
热门文章
- Xcode warning: code will never be executed.
- matlab输出数据为excel文件
- TcaplusDB君 · 行业新闻汇编(11月22号)
- simple-uploader.js 文档
- 很好的例子理解区别 Maximum Likelihood (ML) Maximum a posteriori (MAP)
- 统计学习方法 | 概论
- 一些恶搞小程序,整蛊必备
- 【大道至简】机器学习算法之EM算法(Expectation Maximization Algorithm)详解(附代码)---通俗理解EM算法。
- 程序员2011精华本
- (转)ANDROID强制锁定竖屏_APP固定设置竖屏或横屏