Adding Bias To Random Walk
9 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Kelly McGuire
am 14 Jan. 2019
Kommentiert: TADA
am 14 Jan. 2019
How would add a bias or probability of 34%, 22%, 22%, and 22% for each of the four directions in the attached random walk code?
3 Kommentare
Akzeptierte Antwort
TADA
am 14 Jan. 2019
Bearbeitet: TADA
am 14 Jan. 2019
you can make a step & bias vector:
stepCoordinates = [1,0;0,1;-1,0;0,-1];
% this creates the bias to the north
bias = [ones(1, 34), repmat([2 3 4], 1, (100-34)/3)];
then when you generate the actual steps in your loop use this instead of what you had:
stepBiasIndex = randi(100, 1, numberOfSteps);
stepCoordIndex = bias(stepBiasIndex);
delta = stepCoordinates(stepCoordIndex,:);
if continuousSteps
signOfStep = sign(delta);
plusminusRandSign = [-1 1];
indicesWithSignZero = signOfStep == 0;
signOfStep(indicesWithSignZero) = plusminusRandSign(randi(2, size(signOfStep(indicesWithSignZero))));
delta = delta - signOfStep.*rand(numberOfSteps, 2);
end
deltax = delta(:,2)';
deltay = delta(:,1)';
You can vectorize the rest of it but you said it does what you want so i didn't touch anything else
In this specific solution the bias is only in percentage because the bias vector is a 1x100 vector
so if you want to be more specific about it you can make it a 1x1000 for promils or 1x10000 for higher precision...
I attached the edited file
5 Kommentare
Weitere Antworten (1)
Walter Roberson
am 14 Jan. 2019
There was a recent question in which someone asked for going immediately back to be prohibitted and for the probability of going forward to be doubled. My suggestion then was:
dd = randi(4)
for ss = 1:500
rr = rand;
if rr < 1/4
dd = 1+mod(dd,4) %next higher direction
elseif rr < 1/2
dd = 1+mod(dd-2,4) %next lower direction
end % 50 percent stays same direction
if dd==1
yy=yy+1; %north
elseif dd==2
xx=xx+1; %east
elseif dd==3
yy=yy-1; %south
else
xx=xx-1; %west
end
plot here probably
end
The initial dd is about picking some initial direction. The directions are numbered 1 (north), 2 (east), 3 (south), 4 (west), and the new direction is computed as a change of 0, -1 or +1 to the current direction (-2 was ruled out by not being permitted to go backwards.) You can modify the rr tests for whatever probabilities you want.
It is not clear to me in your question whether the 34% should be for a particular fixed direction (e.g., prefer to head east), or for a relative direction (e.g., prefer to go straight) ?
2 Kommentare
Walter Roberson
am 14 Jan. 2019
randsample() the direction numbers with a weights matrix.
Or construct
dv = [1*ones(1,34), 2*ones(1,22), 3*ones(1,22), 4*ones(1,22)]; %direction 1 is overrepresented
dx = [-1 0 1 0]; dy = [0 1 0 -1];
rand_direction = randi(length(dv), 1, num_steps_needed);
rand_dx = dx(rand_direction);
rand_dy = dy(rand_direction);
x_positions = [initial_x, cumsum(rand_dx)];
y_positions = [initial_y, cumsum(rand_dy)];
Siehe auch
Kategorien
Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!