在《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代码实现的更多相关文章

  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. jmeter聚合报告导出时乱码的解决

    在使用jmeter性能测试时,聚合报告导出后使用excel打开时是乱码,查看相关文件后是编码的问题,解决方法如下: 1.现象: 用excel打开变成这种乱码无法看清 2.解决: 先使用记事本打开后,选 ...

  2. 【转】UTF16和UTF8什么区别?

    这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为 ...

  3. Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别

    总结起来一句话:在Thread中调用this其实就是调用Thread私有Runnable类型的target,target是Thread类的一个属性,而Thread.currentThread()是指新 ...

  4. MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述): SELECT table_name name,TABLE_COMMENT value FROM INFORMATION_SCHEMA.TABLES WHERE table ...

  5. opengl学习笔记(一)

    ubuntu下opengl的安装及配置 OpenGL 是一套由SGI公司发展出来的绘图函数库,它是一组 C 语言的函数,用于 2D 与 3D 图形应用程序的开发上.OpenGL 让程序开发人员不需要考 ...

  6. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  7. Java不定参数

    先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: public class VariArgs { public static void main(String[] args) { t ...

  8. Oracle数据迁移之rman活动数据库复制

    1.设置主库为归档模式 SQL> shutdown immediate SQL> startup mount SQL> alter database archivelog; SQL& ...

  9. 【Python算法】遍历(Traversal)、深度优先(DFS)、广度优先(BFS)

    图结构: 非常强大的结构化思维(或数学)模型.如果您能用图的处理方式来规范化某个问题,即使这个问题本身看上去并不像个图问题,也能使您离解决问题更进一步. 在众多图算法中,我们常会用到一种非常实用的思维 ...

  10. LoadRunner中获取当前系统时间方法

    LoadRunner中获取当前系统时间方法 发表于:2017-6-02 11:41  作者:人生_0809   来源:51Testing软件测试网采编 字体:大 中 小 | 上一篇 | 下一篇 | 打 ...