关于此前发现的问题:Connecting a maze/grid's walls so all are interconnected
目前我的机器人正在读取前面左侧的网格位置,直接在前面和右前方,如下所示:
[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]
我遇到的问题是,当它在试验中达到一个间隙时,它无法处理它并最终无意义地旋转直到它耗尽了生命。
我知道我需要添加某种形式的记忆或学习,但我不确定是什么或如何实现这个!
有什么建议吗?
答案 0 :(得分:0)
如果没有您的代码,很难确定,但听起来您的机器人只是缺少一种移动到非踪迹空间的方法。假设你有一些基本上像这样的东西(伪代码):
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();
}
}
基本上,你需要的只是一种摆脱循环的方法。其中任何一个都可以帮到你。