В настоящее время я работаю над кодом, который использует 2D клеточный автомат в качестве симулятора эпидемии в MATLAB.Основное основное правило, которое я пытаюсь реализовать, заключается в том, что если какой-либо сосед в районе Мура с радиусом в 1 ячейку заражен, эта ячейка станет зараженной.Но я не могу заставить хороший код работать на него.
По сути, я пытаюсь сказать, для ячейки с одним радиусом ячейки соседство Мура, если какие-либо значения в этой окрестности =2, тогда начальная ячейка станет 2.
Я пытался использовать код лесного пожара в коде розетты в качестве основы для своего поведения кода, но он работает не очень хорошо.Правила не очень хорошо работают, когда применяются к моему.Я попытался использовать функцию мода и серию циклов if для присоединения.Я добавлю код каждого из них, чтобы дать контекст.
Этот пример на самом деле не работает как симулятор эпидемии, если честно.
matlab
clear; clc;
n = 200;
N = n/2;
E = 0.001; % Creating an arbitrary number for population exposed to
the disease but not infected
p = 1 + (rand(n,n)<E);
%p = ceil(rand(n,n)*2.12) - 1;
% ratio0 = sum(p(:)==0)/n^2;
% ratio1 = sum(p(:)==1)/n^2;
% ratio2 = sum(p(:)==2)/n^2;
% ratio3 = sum(p(:)==3)/n^2;
S = ones(3); S(2,2) = 0;
ff = 0.00000000002;
p(N,N) = 3;
%% Running the simulation for a set number of loops
colormap([1,1,1;1,0,1;1,0,0]); %Setting colourmap to Green, red and
grey
count = 0;
while(count<365) % Running the simulation with limited number of runs
count = count + 1;
image(p); pause(0.1); % Creating an image of the model
P = (p==1); % Adding empty cells to new array
P = P + (p==2).*((filter2(S,p==3)>0) + (rand(n,n)<ff) + 2); % Setting
2 as a tree, ignites based on proximity of trees and random
chance ff
P = P + (p==3); % Setting 3 as a burning tree, that becomes 1,
p = P;
end
Вторая идея.это в основном ничего не возвращает
matlab
clear;clf;clc;
n = 200;
pos = mod((1:n),n) + 1; neg = mod((1:n)-2,n) + 1;
p = (ceil(rand(n,n)*1.0005));
for t = 1:365
if p(neg,neg) ==2
p(:,:) = 2;
end
if p(:,neg)==2
p(:,:) = 2;
end
if p(pos,neg)==2
p(:,:) = 2;
end
if p(neg,:)==2
p(:,:) = 2;
end
if p(pos,:)==2
p(:,:) = 2;
end
if p(neg,pos)==2
p(:,:) = 2;
end
if p(:,pos)==2
p(:,:) = 2;
end
if p(pos,pos)== 2
p(:,:) = 2;
end
image(p)
colormap([1,1,1;1,0,1])
end
в-третьих, я попытался использовать логические элементы, чтобы посмотреть, сработает ли это.Я не знаю, будут ли работать запятые вместо этого.
matlab
clear;clf;clc;
n = 200;
pos = mod((1:n),n) + 1; neg = mod((1:n)-2,n) + 1;
p = (ceil(rand(n,n)*1.0005));
%P = p(neg,neg) + p(:,neg) + p(pos,neg) + p(neg,:) + p(:,:) + p(pos,:)
+ p(neg,pos) + p(:,pos) + p(pos,pos)
for t=1:365
if p(neg,neg)|| p(:,neg) || p(pos,neg) || p(neg,:) || p(pos,:) ||
p(neg,pos) || p(:,pos) || p(pos,pos) == 2
p(:,:) = 2;
end
image(p)
colormap([1,1,1;1,0,1])
end
Я ожидал, что матрица постепенно станет более пурпурной, но во втором ничего не происходит.Я получаю эту ошибку для третьего.
«Операнды операторов || и && должны быть преобразованы в логические скалярные значения.»
Я просто не знаю, что делать!