关于此处找到的先前问题:连接迷宫/网格的墙壁,使所有内容相互连接
目前我的机器人读取左前方、正前方和右前方的网格位置,如下所示:
[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]
我遇到的问题是,当它在试验中达到一个间隙时,它无法处理它,最终会毫无意义地旋转,直到耗尽生命。
我知道我需要添加某种形式的记忆或学习,但我不确定要做什么或如何实现!
有什么建议吗?
如果没有您的代码,很难确定,但听起来您的机器人只是缺乏一种移动到非踪迹空间的方法。假设你有基本上像这样的东西(伪代码):
if (isTrailAhead) {
moveAhead();
} else {
turn();
}
显然这不会让你弥合差距,因为你会一直在原地打转,没有踪迹可循。有很多方法可以解决这个问题;我首先想到的两个是:
存储一个计数器,并在每次寻找踪迹空间但没有看到时增加它。如果计数器超过某个数字(例如 4),则无论那里有什么,都直接向前移动(假设这是可能的)。每次前进时将计数器重置为 0。
if (isTrailAhead) {
moveAhead();
} else {
if (turnCounter > 4) {
moveAhead();
else {
turn();
}
}
当然,在这种情况下,您需要一个名为turnCounter的实例变量,并且您的moveAhead()和turn()函数应适当增加或重置此计数器。
在上面的伪 else 子句中(当您没有看到踪迹时),生成一个 0 到 10 之间的随机数。如果它大于某个预定数字,则尽可能继续前进。
if (isTrailAhead) {
moveAhead();
} else {
if (new Random().nextInt(10) >= 8) {
moveAhead();
else {
turn();
}
}
基本上,您所需要的只是一种打破循环的方法。其中任何一个都应该适合您。