Java 停止代理离开网格(网格世界的RL示例)

Java 停止代理离开网格(网格世界的RL示例),java,agent,gridworld,Java,Agent,Gridworld,我的问题是,当我的代理达到0,0,0,9等时,我试图阻止它达到9,0或9,9等 就像这个例子中的一样 (0,0) N -1.0 (9,0) (9,0) N -1.0 (8,0) (8,0) W -1.0 (8,9) 我希望它在网格之间移动,而不是通过返回网格来缩短。例如,代替从(0,0)到(9,0)到(0,1)0r(1,0)等等 我尝试了一些简单的代码,检查x和y值是否大于行数和列数的x和y值,或者x和y是否小于0 public boolean Notvalid(int

我的问题是,当我的代理达到0,0,0,9等时,我试图阻止它达到9,0或9,9等 就像这个例子中的一样

   (0,0) N -1.0 (9,0)
   (9,0) N -1.0 (8,0)
   (8,0) W -1.0 (8,9)
我希望它在网格之间移动,而不是通过返回网格来缩短。例如,代替从(0,0)到(9,0)到(0,1)0r(1,0)等等

我尝试了一些简单的代码,检查x和y值是否大于行数和列数的x和y值,或者x和y是否小于0

  public boolean Notvalid(int x, int y) {

    return (x > cr.NUM_ROWS || y > cr.NUM_COLUMNS || x < 0 || y < 0);

     }

有人知道更简单的方法来处理这样的规则吗?

您的代码似乎有三个问题:

  • 假设行索引是
    0
    9
    cr.NUM\u行
    10
    ,您应该使用
    x>=cr.NUM\u行
    x>cr.NUM\u行-1
    而不是
    x>cr.NUM\u行
    。(同列)
  • 您正在检查当前x/y位置是否有效(
    x
    y
    ),而不是代理将要去的位置(
    xpos
    YPO
  • 通过设置
    x=cr.START\u ROW
    ,您似乎正在做您不想做的事情,即当代理转到
    10
    时,将代理设置为
    0
试试这个:

public boolean notValid(int x, int y) {
    return x >= cr.NUM_ROWS || y >= cr.NUM_COLUMNS || x < 0 || y < 0;
}

public gridState(int xpos, int ypos) {
    if (! notvalid(xpos, ypos)) {
        x = xpos;
        y = ypos;
    } else {
        // new position not valid -> just stay where you are
    }
}
公共布尔值无效(int x,int y){
返回x>=cr.NUM|u行| y>=cr.NUM|u列| x<0 | y<0;
}
公共网格状态(int XPO、int YPO){
如果(!无效(XPO、YPO)){
x=xpo;
y=YPO;
}否则{
//新职位无效->待在原地不动
}
}

cr.NUM\u行
9行还是10行?列索引似乎是从0到9,因此
cr.NUM_行
应该是10,但是您应该使用
x>=cr.NUM_行
x>cr.NUM_行-1
此外,您似乎在检查当前x/y位置是否有效(
x
y
),而不是代理要去的位置(
xpos
ypos
)。另外,通过设置
x=cr.START_ROW
,您不正是在做您不想做的事情吗,即当代理转到
10
时,将代理设置为
0
?然而,所有这些都只是猜测,没有看到更多的代码。您好@tobias_k谢谢您指出我传递了错误的变量,您是对的,我是d与我想做的相反。我没有注意到。它现在按预期工作。谢谢,
public boolean notValid(int x, int y) {
    return x >= cr.NUM_ROWS || y >= cr.NUM_COLUMNS || x < 0 || y < 0;
}

public gridState(int xpos, int ypos) {
    if (! notvalid(xpos, ypos)) {
        x = xpos;
        y = ypos;
    } else {
        // new position not valid -> just stay where you are
    }
}