在《Q-learning简明实例》中我们介绍了Q-learning算法的简单例子,从中我们可以总结出Q-learning算法的基本思想

本次选择的经验得分 = 本次选择的反馈得分 + 本次选择后场景的历史最佳经验得分

其中反馈得分是单个步骤的价值分值(固定的分值),经验得分是完成目标的学习分值(动态的分值)。

简明实例的Java实现如下

  1. package com.coshaho.learn.qlearning;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. import java.util.Random;
  7.  
  8. /**
  9. *
  10. * QLearning.java Create on 2017年9月4日 下午10:08:49
  11. *
  12. * 类功能说明: QLearning简明例子实现
  13. *
  14. * Copyright: Copyright(c) 2013
  15. * Company: COSHAHO
  16. * @Version 1.0
  17. * @Author coshaho
  18. */
  19. public class QLearning
  20. {
  21. FeedbackMatrix R = new FeedbackMatrix();
  22.  
  23. ExperienceMatrix Q = new ExperienceMatrix();
  24.  
  25. public static void main(String[] args)
  26. {
  27. QLearning ql = new QLearning();
  28.  
  29. for(int i = 0; i < 500; i++)
  30. {
  31. Random random = new Random();
  32. int x = random.nextInt(100) % 6;
  33.  
  34. System.out.println("第" + i + "次学习, 初始房间是" + x);
  35. ql.learn(x);
  36. System.out.println();
  37. }
  38. }
  39.  
  40. public void learn(int x)
  41. {
  42. do
  43. {
  44. // 随机选择一个联通的房间进入
  45. int y = chooseRandomRY(x);
  46.  
  47. // 获取以进入的房间为起始点的历史最佳得分
  48. int qy = getMaxQY(y);
  49.  
  50. // 计算此次移动的得分
  51. int value = calculateNewQ(x, y, qy);
  52. Q.set(x, y, value);
  53. x = y;
  54. }
  55. // 走出房间则学习结束
  56. while(5 != x);
  57.  
  58. Q.print();
  59. }
  60.  
  61. public int chooseRandomRY(int x)
  62. {
  63. int[] qRow = R.getRow(x);
  64. List<Integer> yValues = new ArrayList<Integer>();
  65. for(int i = 0; i < qRow.length; i++)
  66. {
  67. if(qRow[i] >= 0)
  68. {
  69. yValues.add(i);
  70. }
  71. }
  72.  
  73. Random random = new Random();
  74. int i = random.nextInt(yValues.size()) % yValues.size();
  75. return yValues.get(i);
  76. }
  77.  
  78. public int getMaxQY(int x)
  79. {
  80. int[] qRow = Q.getRow(x);
  81. int length = qRow.length;
  82. List<YAndValue> yValues = new ArrayList<YAndValue>();
  83. for(int i = 0; i < length; i++)
  84. {
  85. YAndValue yv = new YAndValue(i, qRow[i]);
  86. yValues.add(yv);
  87. }
  88.  
  89. Collections.sort(yValues);
  90. int num = 1;
  91. int value = yValues.get(0).getValue();
  92. for(int i = 1; i < length; i++)
  93. {
  94. if(yValues.get(i).getValue() == value)
  95. {
  96. num = i + 1;
  97. }
  98. else
  99. {
  100. break;
  101. }
  102. }
  103.  
  104. Random random = new Random();
  105. int i = random.nextInt(num) % num;
  106. return yValues.get(i).getY();
  107. }
  108.  
  109. // Q(x,y) = R(x,y) + 0.8 * max(Q(y,i))
  110. public int calculateNewQ(int x, int y, int qy)
  111. {
  112. return (int) (R.get(x, y) + 0.8 * Q.get(y, qy));
  113. }
  114.  
  115. public static class YAndValue implements Comparable<YAndValue>
  116. {
  117. int y;
  118. int value;
  119.  
  120. public int getY() {
  121. return y;
  122. }
  123. public void setY(int y) {
  124. this.y = y;
  125. }
  126. public int getValue() {
  127. return value;
  128. }
  129. public void setValue(int value) {
  130. this.value = value;
  131. }
  132. public YAndValue(int y, int value)
  133. {
  134. this.y = y;
  135. this.value = value;
  136. }
  137. public int compareTo(YAndValue o)
  138. {
  139. return o.getValue() - this.value;
  140. }
  141. }
  142. }
  143.  
  144. package com.coshaho.learn.qlearning;
  145.  
  146. /**
  147. *
  148. * FeedbackMatrix.java Create on 2017年9月4日 下午9:52:41
  149. *
  150. * 类功能说明: 反馈矩阵
  151. *
  152. * Copyright: Copyright(c) 2013
  153. * Company: COSHAHO
  154. * @Version 1.0
  155. * @Author coshaho
  156. */
  157. public class FeedbackMatrix
  158. {
  159. public int get(int x, int y)
  160. {
  161. return R[x][y];
  162. }
  163.  
  164. public int[] getRow(int x)
  165. {
  166. return R[x];
  167. }
  168.  
  169. private static int[][] R = new int[6][6];
  170. static
  171. {
  172. R[0][0] = -1;
  173. R[0][1] = -1;
  174. R[0][2] = -1;
  175. R[0][3] = -1;
  176. R[0][4] = 0;
  177. R[0][5] = -1;
  178.  
  179. R[1][0] = -1;
  180. R[1][1] = -1;
  181. R[1][2] = -1;
  182. R[1][3] = 0;
  183. R[1][4] = -1;
  184. R[1][5] = 100;
  185.  
  186. R[2][0] = -1;
  187. R[2][1] = -1;
  188. R[2][2] = -1;
  189. R[2][3] = 0;
  190. R[2][4] = -1;
  191. R[2][5] = -1;
  192.  
  193. R[3][0] = -1;
  194. R[3][1] = 0;
  195. R[3][2] = 0;
  196. R[3][3] = -1;
  197. R[3][4] = 0;
  198. R[3][5] = -1;
  199.  
  200. R[4][0] = 0;
  201. R[4][1] = -1;
  202. R[4][2] = -1;
  203. R[4][3] = 0;
  204. R[4][4] = -1;
  205. R[4][5] = 100;
  206.  
  207. R[5][0] = -1;
  208. R[5][1] = 0;
  209. R[5][2] = -1;
  210. R[5][3] = -1;
  211. R[5][4] = 0;
  212. R[5][5] = 100;
  213. }
  214. }
  215.  
  216. package com.coshaho.learn.qlearning;
  217.  
  218. /**
  219. *
  220. * ExperienceMatrix.java Create on 2017年9月4日 下午10:03:08
  221. *
  222. * 类功能说明: 经验矩阵
  223. *
  224. * Copyright: Copyright(c) 2013
  225. * Company: COSHAHO
  226. * @Version 1.0
  227. * @Author coshaho
  228. */
  229. public class ExperienceMatrix
  230. {
  231. public int get(int x, int y)
  232. {
  233. return Q[x][y];
  234. }
  235.  
  236. public int[] getRow(int x)
  237. {
  238. return Q[x];
  239. }
  240.  
  241. public void set(int x, int y, int value)
  242. {
  243. Q[x][y] = value;
  244. }
  245.  
  246. public void print()
  247. {
  248. for(int i = 0; i < 6; i++)
  249. {
  250. for(int j = 0; j < 6; j++)
  251. {
  252. String s = Q[i][j] + " ";
  253. if(Q[i][j] < 10)
  254. {
  255. s = s + " ";
  256. }
  257. else if(Q[i][j] < 100)
  258. {
  259. s = s + " ";
  260. }
  261. System.out.print(s);
  262. }
  263. System.out.println();
  264. }
  265. }
  266.  
  267. private static int[][] Q = new int[6][6];
  268. static
  269. {
  270. Q[0][0] = 0;
  271. Q[0][1] = 0;
  272. Q[0][2] = 0;
  273. Q[0][3] = 0;
  274. Q[0][4] = 0;
  275. Q[0][5] = 0;
  276.  
  277. Q[1][0] = 0;
  278. Q[1][1] = 0;
  279. Q[1][2] = 0;
  280. Q[1][3] = 0;
  281. Q[1][4] = 0;
  282. Q[1][5] = 0;
  283.  
  284. Q[2][0] = 0;
  285. Q[2][1] = 0;
  286. Q[2][2] = 0;
  287. Q[2][3] = 0;
  288. Q[2][4] = 0;
  289. Q[2][5] = 0;
  290.  
  291. Q[3][0] = 0;
  292. Q[3][1] = 0;
  293. Q[3][2] = 0;
  294. Q[3][3] = 0;
  295. Q[3][4] = 0;
  296. Q[3][5] = 0;
  297.  
  298. Q[4][0] = 0;
  299. Q[4][1] = 0;
  300. Q[4][2] = 0;
  301. Q[4][3] = 0;
  302. Q[4][4] = 0;
  303. Q[4][5] = 0;
  304.  
  305. Q[5][0] = 0;
  306. Q[5][1] = 0;
  307. Q[5][2] = 0;
  308. Q[5][3] = 0;
  309. Q[5][4] = 0;
  310. Q[5][5] = 0;
  311. }
  312. }

经过500次计算得到如下结果

  1. 499次学习, 初始房间是1
  2. 0 0 0 0 396 0
  3. 0 0 0 316 0 496
  4. 0 0 0 316 0 0
  5. 0 396 252 0 396 0
  6. 316 0 0 316 0 496
  7. 0 396 0 0 396 496

此时,我们从任意一个房间进入,每次选取最高分值步骤移动,总可以找到最短的逃离路径。

Q-learning简明实例Java代码实现的更多相关文章

  1. 实例: Java代码操作oracle数据库(JDBC+sevrlet+jsp+html)

    1, 注册页面 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.or ...

  2. Kettle变量和自己定义java代码的实例应用

    1  kettle.properties參数配置数据源连接和FTP连接 因为測试环境和生产环境中数据库连接FTP等配置会在部署过程中变更,所以预先定义成配置项,在配置文件里改动.这样測试和公布将会变得 ...

  3. 强化学习_Deep Q Learning(DQN)_代码解析

    Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...

  4. ActiveMQ——activemq的使用java代码实例(精选)

    ActiveMQ 在java中的使用,通过单例模式.工厂实现 Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表():   Topic Queue 概要 Publish  ...

  5. java代码的初始化过程研究

        刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...

  6. 使用Java代码实现对宽带的连接

    对于多个类似的用户名相同的密码,运行java代码实现对宽带的自动连接 这是源代码: import java.io.BufferedReader; import java.io.IOException; ...

  7. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

  8. Java代码规范

    Java代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改.本文档中没有说明的地方,请参看SUN Java标准代码规范.如果两边有冲突,以SU ...

  9. Java代码实现excel数据导入到Oracle

    1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码   import java.io.File; import java.io.Fi ...

随机推荐

  1. 生存分析(survival analysis)

    一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...

  2. 算法学习之快速排序的C语言实现

    近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...

  3. 关于webpy模板自动HTML转义的问题

    注意: web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本.如果要关闭该选项,可以写成 $:name 来代替 $name. 如果我们想 ...

  4. Java中为什么需要反射?反射要解决什么问题?

    一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...

  5. 2018C语言第三次作业

    要求一 2.struct sk{int a; char *str)}*p;   p->str++ 中的++ 加向? ++加向srt的地址. 要求二 题目1-计算平均成绩 1.设计思路 (1)主要 ...

  6. Ubuntu 下 kdevelop下 怎么向主函数传递参数

    1.打开工程 2.点击窗口上的运行”--“配置启动器” 3.左栏选择要传递参数的工程名,在参数一栏中,输入参数“ubuntu.png”,再输入“工作目录”.点击OK,运行就可以了.

  7. ECNU 3260 - 袋鼠妈妈找孩子

    题目链接:http://acm.ecnu.edu.cn/problem/3260/ Time limit per test: 1.5 seconds Time limit all tests: 10. ...

  8. hue安装及基本测试-笔记

    #################################################################################################### ...

  9. oracle(四) 常用语句

    1.分页 select t2.* from (select rownum row, t1.*  from your_table where rownum < ?) t2 where t2.row ...

  10. Python3学习之路~2.1 列表、元组操作

    列表 列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 定义列表(list) names=['Amy','Bob','Cindy','David'] 通过下标访问列 ...