Неправильный сосед считает игру жизни Конвея
Я возился с инициализацией игры жизни Конвея и столкнулся с некоторыми проблемами. Я не могу понять, почему число "живых соседних частиц" (я называю это "positionSum") не учитывается правильно. У меня есть следующий код MATLAB.
Я начинаю с простой сетки 3х3, чтобы заставить мой код работать.
R = 3; C = 3; % row and column numbers
X = rand(R, C); % generates random grid
Y = X < 0.5; % creates array of logicals
A = Y;
imshow(Y, 'InitialMagnification', 'fit') % shows initial cell configuration
north = [R, 1:R-1]; % north neighbour
east = [2:C, 1]; % east neighbour
south = [2:R, 1]; % south neighbour
west = [C, 1:C-1]; % west neighbour
% gives the total number of live neighbours
positionSum = A(north, :) + A(south, :) + A(:, east) + A(:, west) ...
+ A(north, east) + A(north, west) + A(south, east) + A(south, west)
Используя этот процесс, я считаю, что я получаю неправильные итоги.
Для шахматной доски 3x3 с белым цветом в верхнем левом углу (как показано здесь) я получаю следующие значения:
4 5 4
5 4 5
4 5 4
1 ответ
Решение
Я не уверен, почему вы выбрали эти массивы для north
,east
,south
, или жеwest
, Более простым способом было бы обнулить границу вашей матрицы, а затем добавить смещенные версии.
A = randi([0,1], 3, 3); % Initialise random 0/1 matrix
% Timestep loop for Game of Life
numsteps = 10;
for ii = 1:numsteps
% Create total matrix which has a border of 0s compared to A
% Meaning it's 2 bigger in each dimension
temp = zeros(size(A)+2);
% Add in 4 directions. Middle A-sized region of temp is temp(2:end-1,2:end-1)
temp(1:end-2, 2:end-1) = temp(1:end-2, 2:end-1) + A; % Shift A up
temp(3:end, 2:end-1) = temp(3:end, 2:end-1) + A; % Shift A down
temp(2:end-1, 1:end-2) = temp(2:end-1, 1:end-2) + A; % Shift A left
temp(2:end-1, 3:end) = temp(2:end-1, 3:end) + A; % Shift A right
% Continue for diagonal neighbours
% temp(...
% Extract number of neighbours from middle region of temp
neighbs = temp(2:end-1, 2:end-1);
% Continue with chosen GoL rules now we have neighbours
% ...
% A = ...
end