0

关于此处发现的先前问题:连接迷宫/网格的墙壁,使所有墙壁相互连接

目前,我的机器人读取左前、右前和右前的网格位置,如下所示:

[00][01][02]
[10][11][12]
[20][^^][22]

面向北的 [21] 将显示为 [10][11][12],其中可能包含其正在寻找的对象/踪迹。

在我的网格中有一条轨迹,我使我的机器人能够跟踪将传感器输入映射到如下操作:

Sensor Actions:
000 =
001 = 
010 =
011 =
100 =
101 =
110 =
111 =

这些可以等于 turnleft()、turnright()、goforward() 或什么都不做。

目前它可以找到 14/15 的轨迹片段,但找不到与轨迹有间隙的最后一个片段,如下所示:

#KEY: x = empty, R = robot start position, T = trail

[x][x][x][x][x][x][x][x]
[x][x][x][x][x][x][T][x]
[x][x][x][x][x][x][x][x] <- Here is the gap!
[R][T][T][T][T][x][T][x]
[x][x][x][x][T][x][T][x]
[x][x][x][x][T][x][T][x]
[x][x][x][x][T][x][T][x]
[x][x][x][x][T][T][T][x]

我遇到的问题是,当它在试验中达到一个空白时,它无法处理它并最终毫无意义地旋转,直到它耗尽生命。

我知道我需要添加某种形式的记忆或学习,但我不确定什么或如何实现它!

有什么建议么?

4

1 回答 1

0

没有你的代码很难确定,但听起来你的机器人只是缺乏进入非轨迹空间的方法。假设你基本上有这样的东西(伪代码):

if (isTrailAhead) {
    moveAhead();
} else {
    turn();
}

显然,这不会让您弥合差距,因为您将继续在没有踪迹的情况下旋转。有很多方法可以解决这个问题;我想到的前两个是:

  1. 存储一个计数器并在您每次寻找轨迹空间但没有看到时递增它。如果计数器超过某个数字(比如 4),无论那里有什么(假设这是可能的),都直接向前移动。每次前进时将计数器重置为 0。

    if (isTrailAhead) {
        moveAhead();
    } else {
        if (turnCounter > 4) {
            moveAhead();
        else {
            turn();
        }
    }
    

    当然,在这种情况下,您需要一个名为 turnCounter 的实例变量,并且您的 moveAhead() 和 turn() 函数应酌情增加或重置此计数器。

  2. 在上面的伪 else 子句中(当您看不到踪迹时),生成一个介于 0 和 10 之间的随机数。如果它大于某个预定数,请尽可能继续。

    if (isTrailAhead) {
        moveAhead();
    } else {
        if (new Random().nextInt(10) >= 8) {
            moveAhead();
        else {
            turn();
        }
    }
    

基本上,您所需要的只是一种打破循环的方法。这些中的任何一个都应该为您解决问题。

于 2013-03-06T16:26:33.667 回答