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();
}

明らかに、これではギャップを埋めることはできません。これは、たどる道がなくても円を描いて回転し続けるためです。この問題に対処する方法はたくさんあります。私の頭に浮かぶ最初の2つは次のとおりです。

  1. カウンターを保存し、トレイルスペースを探しても表示されないたびにカウンターを増やします。カウンターが特定の数(たとえば4)を超えた場合は、そこに何があるかに関係なく、まっすぐ進みます(それが可能であると仮定します)。先に進むたびに、カウンターを0にリセットします。

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

    もちろん、この場合、turnCounterという名前のインスタンス変数が必要であり、moveAhead()およびturn()関数は、必要に応じてこのカウンターをインクリメントまたはリセットする必要があります。

  2. 上記のpseudo-else-clause(軌跡が表示されない場合)で、0から10までの乱数を生成します。それが所定の数よりも大きい場合は、可能であれば先に進みます。

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

基本的に、必要なのはループから抜け出す方法だけです。これらのいずれかがあなたのためにトリックを行うはずです。

于 2013-03-06T16:26:33.667 に答える