Как генерировать случайные направления (N, S, E, W, ни одного) с каким-то импульсом?

Я пытаюсь исследовать сетку случайным образом.
Пять возможных направлений, в которых я могу идти, — это север, восток, юг, запад и останься, все они равновероятны, по крайней мере, изначально.

Проблема с простым выбором случайного направления из вышеперечисленных заключается в том, что в конечном итоге мой агент оказывается слишком близко к центру (два случайных направления могут очень легко компенсировать друг друга), что полностью противоречит цели случайного блуждания.

Что бы я хотел сделать, так это генерировать случайные направления случайным образом, который в целом непредвзят, но который с большей вероятностью выберет направление, близкое к ранее выбранному направлению.

Иными словами, мне нужно, чтобы у моего 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!)

Итак, мой вопрос: как мне расширить этот (или какой-либо другой алгоритм) для выбора одного из пяти направлений, а не просто положительного или отрицательного числа?


person user541686    schedule 22.11.2012    source источник


Ответы (3)


Вы можете использовать turn right, turn left, move forward в качестве возможных ходов.

Итак, теперь вам нужно дважды попасть в одно направление, чтобы вернуться назад.

person Kabie    schedule 22.11.2012
comment
Ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо за забегу за за задом я не хочу полностью исключать возможность движения назад, я мог бы также добавить остановку и разворот на 180 градусов, а затем просто положить на них меньший вес! Мне это нравится, я думаю, это сработает. +1 - person user541686; 22.11.2012

Можно ли сохранять импульс (скорость) между шагами?

Если это так, то, возможно, лучше всего выбрать скорость, т. е. скорость и направление, на каждом временном шаге, которые складываются как вектор с предыдущей скоростью. Во всяком случае, это более реалистичная физика, поскольку сила изменяет импульс.

(Но учитывая, что вы живете в сетке, существует сложность в том, как вы квантифицируете вещи, так что в конечном итоге вы перемещаетесь только в NESW.)

person Andrew Jaffe    schedule 22.11.2012
comment
Звучит как хорошая идея, но как мне это сделать в 2D? Я делаю X и Y отдельно и смотрю, к какому из NESW вектор ближе всего? Если да, то как мне узнать, следует ли мне «остановиться» или двигаться? - person user541686; 22.11.2012
comment
Используйте два вектора направления (базы) (x и y) и установите максимальный и минимальный радиус. Радиус равен sqrt(xx+yy). Если длина вашего вектора направления становится больше, усеките его до максимальной длины, но сохраните направление. Если ваше направление не соответствует минимальной длине, значит, не двигайтесь, иначе двигайтесь в общем направлении. - person cxxl; 22.11.2012

Почему бы просто не создать случайное число 0 ‹= r ‹= 4 и сопоставить его с направлением (скажем, направление 0 означает «не двигаться»)?

Я вижу, что ваша проблема со случайным блужданием слишком случайна, и я, вероятно, попытаюсь какое-то время придерживаться вашего направления (вы также можете использовать случайное число, чтобы определить, как долго), а затем повторно решить. Мне кажется, это хотя бы немного основано на реальности: обычно если вы решаете идти в определенном направлении, вы делаете это какое-то время и не думаете о том, чтобы передумать каждые x секунд .

http://docs.python.org/2/library/random.html показывает, как использовать функции случайных чисел. random.uniform() дает вам равномерное распределение как float. используйте random.randint() для целочисленных результатов (я полагаю, также однородных).

person cxxl    schedule 22.11.2012
comment
Я не уверен, что действительно хочу придерживаться текущего направления... бывают случаи, когда я действительно не хочу полностью исключать движение назад. Скорее, я хочу, чтобы направления были подобны предыдущим направлениям... так что для меня менее вероятно, что я пойду на юг сразу после того, как пойду на север, чем для меня, чтобы сначала пойти на восток. И проблема с выбором случайного целого числа на [0, 4] заключается в том, что я не могу найти хороший способ, чтобы он удовлетворил это требование сходства. - person user541686; 22.11.2012