Ищу советы по попытке прочитать окрестности Мура для 2D клеточных автоматов в MATLAB для эпидемического симулятора - PullRequest
1 голос
/ 13 июня 2019

В настоящее время я работаю над кодом, который использует 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

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

«Операнды операторов || и && должны быть преобразованы в логические скалярные значения.»

Я просто не знаю, что делать!

1 Ответ

1 голос
/ 13 июня 2019

Клетки не заживают

Я предполагаю, что

  • Заражено 2, незаражено 1;
  • Зараженная клетка остается зараженной;
  • Неинфицированная клетка становится зараженной, если есть сосед.

Простой способ добиться этого - использовать двумерную свертку:

n = 200;
p = (ceil(rand(n,n)*1.0005));
neighbourhood = [1 1 1; 1 1 1; 1 1 1]; % Moore plus own cell
for t = 1:356
    p = (conv2(p-1, neighbourhood, 'same')>0) + 1; % update
    image(p), axis equal, axis tight, colormap([.4 .4 .5; .8 0 0]), pause(.1) % plot
end

enter image description here

Клетки заживают через определенное время

  • Для моделирования лучше использовать 0 для неинфицированной клетки иположительное целое число для зараженной клетки, которое указывает, как долго она была заражена.
  • Клетка заживает после заражения в течение определенного количества итераций (но может сразу же стать зараженной ...)

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

n = 200;
p = (ceil(rand(n,n)*1.0005))-1; % 0: non-infected. 1: just infected
T = 20; % time to heal
neighbourhood = [1 1 1; 1 0 1; 1 1 1]; % Moore
for t = 1:356    
    already_infected = p>0; % logical index
    p(already_infected) = p(already_infected)+1; % increase time count for infected
    newly_infected = conv2(p>0, neighbourhood, 'same')>0; % logical index
    p(newly_infected & ~already_infected) = 1; % these just became infected
    newly_healed = p==T; % logical index
    p(newly_healed) = 0; % these are just healed
    image(p>0), axis equal, axis tight, colormap([.4 .4 .5; .8 0 0]), pause(.1) % plot
    % infected / non-infected state
end

enter image description here

...