博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java GUI实战:Swing 实现可视化马尔可夫决策(一)
阅读量:4170 次
发布时间:2019-05-26

本文共 3086 字,大约阅读时间需要 10 分钟。

Java GUI实战:Swing 实现可视化马尔可夫迭代(一)

问题

有一个Agent走迷宫。它在每个格子有四种选择:向上,向下,向左,向右。向上移动,有60%的概率移动到正上方的格子里,20%的概率移动到左上方的格子里,20%的概率移动到

右上方的格子里。其余方向同理。Agent需要找到一条从起点到终点的路。通过这个问题可视化演示马尔可夫迭代过程。

核心算法

马尔可夫迭代算法。细节见下一篇。

目标

设计一个5*5的迷宫,迷宫包括陷阱,障碍,起点,终点,以及干扰点,不同节点用不同的颜色标明。Agent从起点出发,找到一条到达终点的路径。

Agent走到终点,则找到一条路径;走到陷阱,则返回起点;走到干扰点,会获得一个较小的回报值(也就是干扰);走到障碍或边界,会返回之前所在的节点。
陷阱的回报值设置为-1,终点的回报值设置为1,干扰节点的回报值设为0.25,障碍的回报值设置为2(仅仅是为了之后在算法中识别障碍)。初始状态,所有节点状态值均为0.
GUI界面将包括一张地图,实时显示每次迭代的状态值。一个按钮next,点击即可进行一次马尔可夫迭代,旁边应能显示迭代的次数。一个按钮apply,旁边有输入框可以输入横坐标,
纵坐标,节点属性三元组,用以绘制地图。一个按钮play,用来锁定地图状态,并激活next按钮。一个按钮replay,用于将所有状态清零。一个按钮show route,用来显示在
某一状态下的寻路情况。同一迭代状态下,可以多次点击该按钮,以显示由于不确定性导致的寻路的多种可能。

实现效果

如图一,默认地图

在这里插入图片描述
如图二,迭代十次后状态
在这里插入图片描述
如图三,迭代十次后寻路
在这里插入图片描述
如图四,继续迭代至二十次寻路
在这里插入图片描述
如图五,迭代二十次再次寻路
在这里插入图片描述

Java Swing实现GUI

JFrame mainWindow = new JFrame("Markov Show");mainWindow.setSize(500,700);//窗口大小,单位为像素mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);mainWindow.setLocationRelativeTo(null);GridLayout layout = new GridLayout(8,5);//采用网格模式JPanel panel = new JPanel(layout);ArrayList
grids = new ArrayList<>();for(int i=0;i<25;i++){
JLabel label = new JLabel(i+"",SwingConstants.CENTER); label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); label.setBackground(Color.white); label.setOpaque(true); grids.add(label);}int[] startIndex = {
0};grids.get(0).setBackground(Color.BLUE);//startgrids.get(8).setBackground(Color.YELLOW);//Trump!grids.get(15).setBackground(Color.GRAY);grids.get(17).setBackground(Color.GRAY);grids.get(22).setBackground(Color.GRAY);grids.get(24).setBackground(Color.RED);//endfor(int i=0;i<25;i++){
panel.add(grids.get(i));}JButton next = new JButton("NEXT");//NEXT按钮JLabel blank = new JLabel("");JLabel nnn = new JLabel("N");JLabel equals = new JLabel("=");next.setEnabled(false);//没有点击PLAY时,NEXT不激活//countersint[] count={
0};JLabel showN = new JLabel(count[0]+"");panel.add(next);panel.add(blank);panel.add(nnn);panel.add(equals);panel.add(showN);int[] stepCount = {
0};//显示迭代次数//gammadouble[] gammaa = {
0.25};//马尔可夫算法中的伽马值//maze editorJButton edit = new JButton("APPLY");JLabel blank1 = new JLabel("");JTextField editX = new JTextField("enter x");JTextField editY = new JTextField("enter y");JTextField editAttr = new JTextField("enter attribute");//自定义地图JButton start = new JButton("PLAY");JButton restart = new JButton("REPLAY");JButton showRoute = new JButton("SHOW ROUTE");//寻路JLabel totalStep = new JLabel("Total steps:");//从起点到终点多少步JLabel stepCountShow =new JLabel(stepCount[0]+"");panel.add(edit);panel.add(blank1);panel.add(editX);panel.add(editY);panel.add(editAttr);panel.add(start);panel.add(restart);panel.add(showRoute);panel.add(totalStep);panel.add(stepCountShow);double[] values = new double[25];double[] rewards = new double[25];//奖励值for(int i=0;i<25;i++) values[i] = 0;rewards[8]=0.25;//goldrewards[15]=-1;rewards[17]=-1;rewards[22]=-1;rewards[24]=1;//endfor(int i=0;i<25;i++){
//可视化各节点状态值 if(rewards[i]==1||rewards[i]==-1){
grids.get(i).setText(rewards[i]+""); }else {
grids.get(i).setText(values[i] + ""); }}

转载地址:http://qywai.baihongyu.com/

你可能感兴趣的文章
python lambda函数基础
查看>>
python2 filter() map() reduce()函数基础
查看>>
python 汉诺塔 Fibonacci数列
查看>>
python global语句 变量作用域
查看>>
python 寻找前5个默尼森数
查看>>
python2 type()函数 isinstance()函数
查看>>
python is 同一性运算符
查看>>
python basestring( )
查看>>
python 本地数据获取
查看>>
python write( )函数
查看>>
python read( )函数
查看>>
python readline()函数
查看>>
python readlines()函数
查看>>
python writelines()函数
查看>>
python 文件读写5个实例
查看>>
python 文件读写项目实践
查看>>
python的 os 和 shutil 模块
查看>>
python 如何反转序列
查看>>
python str.join()
查看>>
python 内置函数 reversed()
查看>>