Q-learning简明实例Java代码实现
在《Q-learning简明实例》中我们介绍了Q-learning算法的简单例子,从中我们可以总结出Q-learning算法的基本思想
本次选择的经验得分 = 本次选择的反馈得分 + 本次选择后场景的历史最佳经验得分
其中反馈得分是单个步骤的价值分值(固定的分值),经验得分是完成目标的学习分值(动态的分值)。
简明实例的Java实现如下
- package com.coshaho.learn.qlearning;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.Random;
- /**
- *
- * QLearning.java Create on 2017年9月4日 下午10:08:49
- *
- * 类功能说明: QLearning简明例子实现
- *
- * Copyright: Copyright(c) 2013
- * Company: COSHAHO
- * @Version 1.0
- * @Author coshaho
- */
- public class QLearning
- {
- FeedbackMatrix R = new FeedbackMatrix();
- ExperienceMatrix Q = new ExperienceMatrix();
- public static void main(String[] args)
- {
- QLearning ql = new QLearning();
- for(int i = 0; i < 500; i++)
- {
- Random random = new Random();
- int x = random.nextInt(100) % 6;
- System.out.println("第" + i + "次学习, 初始房间是" + x);
- ql.learn(x);
- System.out.println();
- }
- }
- public void learn(int x)
- {
- do
- {
- // 随机选择一个联通的房间进入
- int y = chooseRandomRY(x);
- // 获取以进入的房间为起始点的历史最佳得分
- int qy = getMaxQY(y);
- // 计算此次移动的得分
- int value = calculateNewQ(x, y, qy);
- Q.set(x, y, value);
- x = y;
- }
- // 走出房间则学习结束
- while(5 != x);
- Q.print();
- }
- public int chooseRandomRY(int x)
- {
- int[] qRow = R.getRow(x);
- List<Integer> yValues = new ArrayList<Integer>();
- for(int i = 0; i < qRow.length; i++)
- {
- if(qRow[i] >= 0)
- {
- yValues.add(i);
- }
- }
- Random random = new Random();
- int i = random.nextInt(yValues.size()) % yValues.size();
- return yValues.get(i);
- }
- public int getMaxQY(int x)
- {
- int[] qRow = Q.getRow(x);
- int length = qRow.length;
- List<YAndValue> yValues = new ArrayList<YAndValue>();
- for(int i = 0; i < length; i++)
- {
- YAndValue yv = new YAndValue(i, qRow[i]);
- yValues.add(yv);
- }
- Collections.sort(yValues);
- int num = 1;
- int value = yValues.get(0).getValue();
- for(int i = 1; i < length; i++)
- {
- if(yValues.get(i).getValue() == value)
- {
- num = i + 1;
- }
- else
- {
- break;
- }
- }
- Random random = new Random();
- int i = random.nextInt(num) % num;
- return yValues.get(i).getY();
- }
- // Q(x,y) = R(x,y) + 0.8 * max(Q(y,i))
- public int calculateNewQ(int x, int y, int qy)
- {
- return (int) (R.get(x, y) + 0.8 * Q.get(y, qy));
- }
- public static class YAndValue implements Comparable<YAndValue>
- {
- int y;
- int value;
- public int getY() {
- return y;
- }
- public void setY(int y) {
- this.y = y;
- }
- public int getValue() {
- return value;
- }
- public void setValue(int value) {
- this.value = value;
- }
- public YAndValue(int y, int value)
- {
- this.y = y;
- this.value = value;
- }
- public int compareTo(YAndValue o)
- {
- return o.getValue() - this.value;
- }
- }
- }
- package com.coshaho.learn.qlearning;
- /**
- *
- * FeedbackMatrix.java Create on 2017年9月4日 下午9:52:41
- *
- * 类功能说明: 反馈矩阵
- *
- * Copyright: Copyright(c) 2013
- * Company: COSHAHO
- * @Version 1.0
- * @Author coshaho
- */
- public class FeedbackMatrix
- {
- public int get(int x, int y)
- {
- return R[x][y];
- }
- public int[] getRow(int x)
- {
- return R[x];
- }
- private static int[][] R = new int[6][6];
- static
- {
- R[0][0] = -1;
- R[0][1] = -1;
- R[0][2] = -1;
- R[0][3] = -1;
- R[0][4] = 0;
- R[0][5] = -1;
- R[1][0] = -1;
- R[1][1] = -1;
- R[1][2] = -1;
- R[1][3] = 0;
- R[1][4] = -1;
- R[1][5] = 100;
- R[2][0] = -1;
- R[2][1] = -1;
- R[2][2] = -1;
- R[2][3] = 0;
- R[2][4] = -1;
- R[2][5] = -1;
- R[3][0] = -1;
- R[3][1] = 0;
- R[3][2] = 0;
- R[3][3] = -1;
- R[3][4] = 0;
- R[3][5] = -1;
- R[4][0] = 0;
- R[4][1] = -1;
- R[4][2] = -1;
- R[4][3] = 0;
- R[4][4] = -1;
- R[4][5] = 100;
- R[5][0] = -1;
- R[5][1] = 0;
- R[5][2] = -1;
- R[5][3] = -1;
- R[5][4] = 0;
- R[5][5] = 100;
- }
- }
- package com.coshaho.learn.qlearning;
- /**
- *
- * ExperienceMatrix.java Create on 2017年9月4日 下午10:03:08
- *
- * 类功能说明: 经验矩阵
- *
- * Copyright: Copyright(c) 2013
- * Company: COSHAHO
- * @Version 1.0
- * @Author coshaho
- */
- public class ExperienceMatrix
- {
- public int get(int x, int y)
- {
- return Q[x][y];
- }
- public int[] getRow(int x)
- {
- return Q[x];
- }
- public void set(int x, int y, int value)
- {
- Q[x][y] = value;
- }
- public void print()
- {
- for(int i = 0; i < 6; i++)
- {
- for(int j = 0; j < 6; j++)
- {
- String s = Q[i][j] + " ";
- if(Q[i][j] < 10)
- {
- s = s + " ";
- }
- else if(Q[i][j] < 100)
- {
- s = s + " ";
- }
- System.out.print(s);
- }
- System.out.println();
- }
- }
- private static int[][] Q = new int[6][6];
- static
- {
- Q[0][0] = 0;
- Q[0][1] = 0;
- Q[0][2] = 0;
- Q[0][3] = 0;
- Q[0][4] = 0;
- Q[0][5] = 0;
- Q[1][0] = 0;
- Q[1][1] = 0;
- Q[1][2] = 0;
- Q[1][3] = 0;
- Q[1][4] = 0;
- Q[1][5] = 0;
- Q[2][0] = 0;
- Q[2][1] = 0;
- Q[2][2] = 0;
- Q[2][3] = 0;
- Q[2][4] = 0;
- Q[2][5] = 0;
- Q[3][0] = 0;
- Q[3][1] = 0;
- Q[3][2] = 0;
- Q[3][3] = 0;
- Q[3][4] = 0;
- Q[3][5] = 0;
- Q[4][0] = 0;
- Q[4][1] = 0;
- Q[4][2] = 0;
- Q[4][3] = 0;
- Q[4][4] = 0;
- Q[4][5] = 0;
- Q[5][0] = 0;
- Q[5][1] = 0;
- Q[5][2] = 0;
- Q[5][3] = 0;
- Q[5][4] = 0;
- Q[5][5] = 0;
- }
- }
经过500次计算得到如下结果
- 第499次学习, 初始房间是1
- 0 0 0 0 396 0
- 0 0 0 316 0 496
- 0 0 0 316 0 0
- 0 396 252 0 396 0
- 316 0 0 316 0 496
- 0 396 0 0 396 496
此时,我们从任意一个房间进入,每次选取最高分值步骤移动,总可以找到最短的逃离路径。
Q-learning简明实例Java代码实现的更多相关文章
- 实例: Java代码操作oracle数据库(JDBC+sevrlet+jsp+html)
1, 注册页面 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.or ...
- Kettle变量和自己定义java代码的实例应用
1 kettle.properties參数配置数据源连接和FTP连接 因为測试环境和生产环境中数据库连接FTP等配置会在部署过程中变更,所以预先定义成配置项,在配置文件里改动.这样測试和公布将会变得 ...
- 强化学习_Deep Q Learning(DQN)_代码解析
Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...
- ActiveMQ——activemq的使用java代码实例(精选)
ActiveMQ 在java中的使用,通过单例模式.工厂实现 Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表(): Topic Queue 概要 Publish ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
- 使用Java代码实现对宽带的连接
对于多个类似的用户名相同的密码,运行java代码实现对宽带的自动连接 这是源代码: import java.io.BufferedReader; import java.io.IOException; ...
- JavaBean 基础概念、使用实例及代码分析
JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...
- Java代码规范
Java代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改.本文档中没有说明的地方,请参看SUN Java标准代码规范.如果两边有冲突,以SU ...
- Java代码实现excel数据导入到Oracle
1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码 import java.io.File; import java.io.Fi ...
随机推荐
- 生存分析(survival analysis)
一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- 关于webpy模板自动HTML转义的问题
注意: web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本.如果要关闭该选项,可以写成 $:name 来代替 $name. 如果我们想 ...
- Java中为什么需要反射?反射要解决什么问题?
一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...
- 2018C语言第三次作业
要求一 2.struct sk{int a; char *str)}*p; p->str++ 中的++ 加向? ++加向srt的地址. 要求二 题目1-计算平均成绩 1.设计思路 (1)主要 ...
- Ubuntu 下 kdevelop下 怎么向主函数传递参数
1.打开工程 2.点击窗口上的运行”--“配置启动器” 3.左栏选择要传递参数的工程名,在参数一栏中,输入参数“ubuntu.png”,再输入“工作目录”.点击OK,运行就可以了.
- ECNU 3260 - 袋鼠妈妈找孩子
题目链接:http://acm.ecnu.edu.cn/problem/3260/ Time limit per test: 1.5 seconds Time limit all tests: 10. ...
- hue安装及基本测试-笔记
#################################################################################################### ...
- oracle(四) 常用语句
1.分页 select t2.* from (select rownum row, t1.* from your_table where rownum < ?) t2 where t2.row ...
- Python3学习之路~2.1 列表、元组操作
列表 列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 定义列表(list) names=['Amy','Bob','Cindy','David'] 通过下标访问列 ...