MatLab Почему мой случайный ходок не сломается в зоне захвата?

Привет, я запрограммировал 1-го случайного ходока и пытаюсь реализовать зону захвата, где программа остановится, если ходок останется в определенном диапазоне значений в течение определенного периода времени. Код у меня выглядит так:

steps = 1000; %sets the number of steps to 1000
rw = cumsum(-1 + 2 * round(rand(steps,1)),1); %Set up our random walk with cumsum

%Now we will set up our capture zone between 13-18 for fun
if rw >= 13 & rw <= 18
    dwc = dwc + 1 %Dwelling counted ticks up every time walker is in 13-18
else dwc = 0;     %Once it leaves, it returns to 0
end

while dwc >= 5
    fprintf('5 steps or more within range after %d steps, so so breaking out.\n', rw);
break
end

figure(7)
comet(rw); %This will plot our random walk
grid on;   %Just to see the capture zone better
hold on;
line(xlim, [13, 13], 'Color', 'r');
line(xlim, [18, 18], 'Color', 'r');
hold off;
title('1d Random Walk with Capture Zone');
xlabel('Steps');
ylabel('Position');

Он пробежит по прогулке, но никогда не сломается в зоне захвата. Я уверен, что он несколько раз находился в зоне захвата более 5 шагов, но все равно продолжает работать. Любая помощь приветствуется.


person Garrett Penna    schedule 01.12.2017    source источник
comment
Я так понимаю код не полный? Код, проверяющий зону захвата, не зацикливается. Он проверяет это только один раз!   -  person Cris Luengo    schedule 01.12.2017
comment
Кроме того, ваш break вырывается из цикла while, в котором он находится, но в этом цикле ничего не происходит. Протестируйте dwc с помощью if.   -  person Cris Luengo    schedule 01.12.2017
comment
Честно говоря, я думал, что код был завершен. Это мой первый случайный ходок, и я никогда раньше не использовал перерыв. Не могли бы вы сообщить мне, как будет выглядеть возможное решение для этого кода?   -  person Garrett Penna    schedule 01.12.2017


Ответы (1)


Ваш код не делает то, что вы думаете. Нет цикла для подсчета шагов и проверки захвата (... вам все равно не нужен цикл для этого)

Сначала эта проблема: rw - это массив 1000x1. Таким образом, вы, если условие оператора rw >= 13 & rw <= 18, также вернет логическое значение 1000x1. Который не сделает много с тех пор.

Вторая проблема заключается в том, что вы никогда не изменяете условие while внутри цикла, поэтому оно либо пропустит его, либо застрянет в бесконечном цикле.

while dwc >= 5
...
break
end

Отредактируйте линейную версию с циклами Now:

steps = 1000; %sets the number of steps to 1000
rw = cumsum(-1 + 2 * round(rand(steps,1)),1); %Set up our random walk with cumsum

%Now we will set up our capture zone between 13-18 for fun
captureCheck      = rw >= 13 & rw <= 18;

%Counts the number of consecutive steps within the capture zone.
consecStepsInZone = diff([0 (find( ~(captureCheck(:).' > 0))) numel(captureCheck) + 1])- 1;  

fprintf('The max number of consecutive steps in the zone is: %d\n',max(consecStepsInZone));
person Aero Engy    schedule 01.12.2017
comment
спасибо, с нетерпением жду, что нужно улучшить. Очень часто мне трудно укладывать в голове эти вещи. - person Garrett Penna; 01.12.2017
comment
См. редактирование для проверки количества шагов в зоне при случайном блуждании. - person Aero Engy; 01.12.2017
comment
Это прекрасно работает, спасибо. Но как мне заставить ходока остановиться, если он достигает, скажем, 10 последовательных шагов в зоне захвата? - person Garrett Penna; 01.12.2017
comment
@GarrettPenna Нет ничего, что могло бы остановить, поэтому я не понимаю, что вы имеете в виду. Поскольку этот код линеаризован (без циклов), ничего не выполняется, что нужно останавливать. Вторая строка кода уже определила все 1000 шагов ходьбы. Однако вы можете найти в rw, когда вы достигнете порога в 10 шагов, а затем обрезать прогулку rw до этой точки. Это то, что вы имели ввиду? - person Aero Engy; 01.12.2017