我正在尝试以随机的方式探索网格 我可以走的五个方向是北,东,南,西和停留,所有这些都是同样可能的,至少在最初阶段。
从上面简单地选择随机方向的麻烦在于它最终使我的代理人太靠近中心(两个随机方向可以非常容易地相互抵消),这完全违背了随机游走的目的。
我喜欢做的是以随机的方式生成随机方向,这种方向作为一个整体是无偏的,但更有可能选择接近之前选择的方向方向。
换句话说,我需要我的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为界,那么这应该是显而易见的。)
所以我的问题是,如何将此(或其他算法)扩展到选择五个方向中的一个,而不仅仅是正数或负数?
答案 0 :(得分:2)
您可以使用turn right
,turn left
,move forward
作为可能的动作。
所以现在你需要两次随机向一个方向返回。
答案 1 :(得分:1)
您是否可以在步骤之间存储动量(速度)?
如果是这样,那么最好的办法就是在每个时间步长选择一个速度 - 即速度和方向 - 这会将像向量一样加到前一个速度上。无论如何,这是更现实的物理,因为力量会改变动力。
(但是考虑到你生活在一个网格上,有一种复杂的方法是你量化事物,这样你最终只能移动NESW。)
答案 2 :(得分:1)
为什么不创建一个随机数0< = r< = 4并将其映射到一个方向(比方说0,方向0是“不要移动”)?
我发现随机游走的问题太随机了,我可能会试着坚持你的方向一段时间(你也可以用一个随机数确定多长时间),然后重新决定。在我看来,至少在某种程度上基于现实:通常如果你决定走向某个方向,你做了一段时间并且不考虑每隔x秒改变一下你的想法
http://docs.python.org/2/library/random.html显示了如何使用随机数函数。 random.uniform()给你统一分布为float。使用random.randint()表示整数结果(也是统一的,我推测)。