Мой код сотового автомата не работает так, как я хотел, чтобы он работал

   clear all;
  clc;
%% Creating a grid with random value
n = 64;
Gpop = rand(n,n);
temp=Gpop;
Gpop(temp(:,:)<0.99) = 1; %Healthy percentage 99%
Gpop(temp(:,:)>0.99 & temp(:,:)<0.994) = 2; %Healthy percentage .04%
Gpop(temp(:,:)>0.994 & temp(:,:)<0.998) = 3; %Healthy percentage .04%
Gpop(temp(:,:)>0.998) = 4; %Healthy percentage .02%
%% Our Rules of cellular automata
x = 2:n-1;          % Intializing x and y values to access the cells of CA
y = 2:n-1;
rule = Gpop;
figure
count=0;
time = 0;
while(count<25)
     rule((rule(x-1,y-1)==2)|(rule(x,y-1)==2)|(rule(x+1,y-1)==2)|(rule(x-1,y)==2)|(rule(x+1,y)==2)...
         |(rule(x-1,y+1)==2)|(rule(x,y+1)==2)|(rule(x+1,y+1)==2) & time==1)=2 ; %1st Rule a
      if((rule(x,y-1)==3)| (rule(x-1,y)==3)|(rule(x+1,y)==3)|(rule(x,y+1)==3) & time ==2);
          rule(x,y)==2;
      else((rule(x-1,y-1)==3)|(rule(x+1,y-1)==3)|(rule(x-1,y+1)==3)|(rule(x+1,y+1)==3) & time ==3);
          rule(x,y)==2;
      end
      rule((rule(x-1,y-1)==3)|(rule(x,y-1)==3)|(rule(x+1,y-1)==3)|(rule(x-1,y)==3)|(rule(x+1,y)==3)...
          |(rule(x-1,y+1)==3)|(rule(x,y+1)==3)|(rule(x+1,y+1)==3) & time==4)=3; %2nd rule
      rule((rule(x-1,y-1)==4)|(rule(x,y-1)==4)|(rule(x+1,y-1)==4)|(rule(x-1,y)==4)|(rule(x+1,y)==4)...
          |(rule(x-1,y+1)==4)|(rule(x,y+1)==4)|(rule(x+1,y+1)==4&time==6))=4; %3rd rule
      newMatrix=rand(n,n);
      newtemp=newMatrix;
      newMatrix(newtemp(:,:)<=.1)=1;
      newMatrix(newtemp(:,:)>.1)=0;
      rule(((rule(x-1,y-1)==4)|(rule(x,y-1)==4)|(rule(x+1,y-1)==4)|(rule(x-1,y)==4)|(rule(x+1,y)==4)...
          |(rule(x-1,y+1)==4)|(rule(x,y+1)==4)|(rule(x+1,y+1)==4)) & newMatrix(x,y)==1 & time == 8)=1; %1st part 4th rule
      rule(((rule(x-1,y-1)==4)|(rule(x,y-1)==4)|(rule(x+1,y-1)==4)|(rule(x-1,y)==4)|(rule(x+1,y)==4)...
          |(rule(x-1,y+1)==4)|(rule(x,y+1)==4)|(rule(x+1,y+1)==4)) & newMatrix(x,y)==0 & time == 10)=2; %1st part 4th rule
    imagesc(rule)
      axis off;
      cmap = jet(4);                                          % assign colormap
      colormap(cmap)
      hold on
      L = line(ones(4), ones(4), 'LineWidth',2);               % generate line
      set(L,{'color'},mat2cell(cmap,ones(1,4),3));            % set the colors according to cmap
      legend('H','I1','I2','D')                            %Addings Legends at the top right corner of image
      count=count+1;
      time = time+1;
      pause(3.0)
  end

Выше приведен код клеточного автомата для имитации вируса ВИЧ 4 стадии. Когда я запускаю приведенный выше код, правые боковые ячейки остаются такими, какие они есть, без каких-либо изменений, я очень старался найти, что не так, но тоже не смог.

Ниже приведены правила моих автоматов,

Правило 1: Если ячейка H удовлетворяет хотя бы одному из перечисленных ниже правил, она становится ячейкой I1 на следующем шаге: (i) по крайней мере одна ячейка I1 в ближайшем соседе или во втором ближайшем соседе; (ii) Не менее x I2 ячеек в ближайшем соседе, y I2 ячеек во втором ближайшем соседе.

Правило 2: Ячейка I1 становится ячейкой I2 на следующем шаге.

Правило 3: Клетка I2 становится клеткой D после τ шагов из-за иммунного распознавания и очистки.

Правило 4: Ячейка D может быть заменена ячейкой I1 с вероятностью Pinf или заменена ячейкой H с вероятностью (Prep - Pinf) на следующем шаге.

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


person Hari    schedule 28.10.2014    source источник
comment
Что вы подразумеваете под правыми ячейками без изменений?   -  person Benoit_11    schedule 29.10.2014
comment
Я имею в виду, что ячейки из 60-го столбца остаются неизменными после симуляции. Это похоже на то, что после запуска кода появляется изображение с происходящими в нем изменениями. Если вы правильно наблюдаете за изображением, правая сторона изображения остается такой же, как и без каких-либо изменений, но этого не должно происходить, я просто хочу знать недостатки в моем коде и изменения, которые я должен внести для имитации этого клеточного автомата. Пожалуйста, помогите, я застрял между ними, и я не знаю.   -  person Hari    schedule 29.10.2014


Ответы (1)


Ваша проблема в том, что когда вы проверяете правила на 8-соседях каждого узла, матрица решений 0-1 равна 62*62 (потому что вы устанавливаете x/y = 2:n-1), тогда 0/1 устанавливается в матрицу правил, поэтому последние два столбца остаются одно и то же все время, потому что вы никогда не «трогаете» их!

Чтобы понять, что я имею в виду, просто установите точку останова на любом правиле, например.

(rule(x-1,y-1)==2)|(rule(x,y-1)==2)|(rule(x+1,y-1)==2)|(rule(x-1,y)==2)|(rule(x+1,y)==2)...
         |(rule(x-1,y+1)==2)|(rule(x,y+1)==2)|(rule(x+1,y+1)==2)

распечатав приведенный выше результат, вы обнаружите, что это матрица 62*62.

Я знаю, что вы хотите использовать матричные вычисления, чтобы упростить код и в то же время избежать проблем с границами. Но на данный момент я не могу придумать лучшего решения, кроме как установить цикл через x и y, и если точка находится на границе, просто используйте 3 или 5 соседей.

Другой способ — создать «провисшие» строки и столбцы, например rule.size()=66*66, и установить границу равной нулю, а затем при рисовании просто отбросить провисшие строки и столбцы.

Надеюсь это поможет.

person luochenhuan    schedule 29.10.2014
comment
Спасибо за ваши решения, но не могли бы вы предоставить мне код для того, что вы сказали. заранее спасибо - person Hari; 29.10.2014
comment
Я попробовал все, что вы сказали, с граничными ячейками, проверив 3 или 5 соседей, но никаких изменений не произошло. Если вы можете правильно наблюдать за изображением, не только последние два столбца, но и около 5-10 столбцов остаются неизменными, пожалуйста, помогите. Заранее спасибо. - person Hari; 29.10.2014