迷宫/网格续 - 寻找最佳解决方案 - 记忆/学习问题(JAVA)

问题描述 投票:0回答:1

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

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

[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]

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

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

有什么建议吗?

java game-physics maze
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();
        }
    }
    

基本上,您所需要的只是一种打破循环的方法。其中任何一个都应该适合您。

© www.soinside.com 2019 - 2024. All rights reserved.