2

ランダムな方法でグリッドを探索しようとしています。
私が進むことができる 5 つの可能な方向は、北、東、南、西、および滞在であり、少なくとも最初のうちは、すべて同じ可能性があります。

上記からランダムな方向を選択するだけの問題は、エージェントが中心に近づきすぎてしまうことです (2 つのランダムな方向が互いに非常に簡単に打ち消し合う可能性があります)。これは、ランダム ウォークの目的を完全に無効にします。

私がやりたいことは、全体として偏りのないランダムな方法でランダムな方向を生成することですが、以前に選択した方向に近い方向を選択する可能性が高くなります

別の言い方をすれば、RNG にはある種の「勢い」が必要です。

私はこのアルゴリズムを思いつきました:

def RandomWithMomentum(n, momentum=0.5):
    from random import uniform
    v = uniform(-1, 1)
    for i in range(n):
        yield v
        v = v * momentum + uniform(-1, 1) * (1 - momentum)

これは優れた結果をもたらすようです:

-0.04367186243339227
-0.1798381656787107
-0.07608795741137708
-0.0728742899528114
-0.06215075604982321
 0.17952360050689026
 0.016352984710556573
 0.16954506853320414
 0.3947467183848671
 0.12785652121165636

...ただし、このアルゴリズムは正の数と負の数の可能性が等しいことを保証しますが、-1 から +1 までの間隔で一様な分布を保証するわけではありません!

(数字が必ずしも -1 と +1 で区切られているわけではないことを理解していれば、これは明らかです!)

だから私の質問は、これ(または他のアルゴリズム)を、正または負の数だけでなく、5つの方向のいずれかを選択するように拡張するにはどうすればよいですか?

4

3 に答える 3

1

ステップ間に運動量 (速度) を保存することはできますか?

もしそうなら、おそらく最善の方法は、各時間ステップで速度を選択することです。つまり、速度と方向です。これは、前の速度にベクトルのように追加されます。とにかく、力は運動量を変えるので、これはより現実的な物理学です。

(しかし、グリッド上に住んでいることを考えると、ものを量子化する方法が複雑になり、最終的に NESW だけを動かすことになります。)

于 2012-11-22T09:30:08.010 に答える
1

乱数 0 <= r <= 4 を作成し、それを方向にマップしないのはなぜですか (方向 0 は「移動しない」としましょう)。

ランダムウォークがあまりにもランダムであるというあなたの問題を見て、おそらくしばらくの間あなたの方向に固執しようとします(乱数を使用してどれくらいの長さかを決定することもできます)、その後再決定します. それは少なくとも少しは現実に基づいているように私には思えます: 通常、ある方向に進むと決めたら、しばらくそれを行い、x 秒ごとに考えを変えることを考えません。

http://docs.python.org/2/library/random.htmlは、乱数関数の使用方法を示しています。random.uniform() は、フロートとして均一な分布を提供します。整数の結果には random.randint() を使用します(これも一様だと思います)。

于 2012-11-22T09:46:58.780 に答える