Реализовать сотовый автомат?«Правило 110» - PullRequest
2 голосов
/ 04 марта 2011

Мне было интересно, как использовать Правило 110 с 55 строками и 14 ячейками. Затем я должен отобразить это на матричном светодиодном дисплее.

В любом случае, мой вопрос, как я могу реализовать такой автомат?

Я действительно не знаю, с чего начать, кто-нибудь может пролить свет на то, как я могу подойти к этой проблеме?

Есть ли особый МЕТОД, которому я должен следовать?

Спасибо

- ИСПОЛЬЗОВАННАЯ ПРОГРАММА -> C

EDIT

char array[54][14];
for(v=0;v<55;v++){ 
  for(b=0;b<15;b++){ 
    if(org[v][b-1]==0 && org[v][b]==0 && org[v][b+1] == 0)                                                         
      {
        array[v][b]=0;
      }
      array[v][b]=org[v][b];
 }

}

Имеет ли это смысл ?? org обозначает оригинал

1 Ответ

5 голосов
/ 04 марта 2011

Хорошо, каждый клеточный автомат построен на «рекуррентном отношении», так что состояние во время t зависит от состояния во время t-1 .Таким образом, каждый клеточный автомат имеет базовую структуру, в которой у вас есть некоторая структура данных, например массив, который представляет состояние.Итак, абстрактно ваша программа будет выглядеть так:

State t
/* initialize t */
while(/* end condition isn't satisfied */){
    t = rule(t);
    /* display state somehow */
}

, где rule(t) - это функция, которая вычисляет это следующее состояние.

Следующим шагом является создание структуры данных для представленияштат.Это на самом деле просто - состояние элементарного 1-го клеточного автомата - это просто вектор 1 и 0.

Итак, вам нужен массив из 14 небольших чисел.Пробел не будет проблемой, поэтому используйте int:

 int t[14] ; /* state vector*/

Конечное условие легко - вы должны сделать 55 строк, поэтому вам нужно

 int count = 0;
 while(count++ < 55)

Обратите внимание, что это дает вам строки 0-54, то есть 55. Хороший базовый шаблон в C состоит в том, что вы начинаете с 0, после увеличения и тестируете меньше чем.Вероятно, 9 из 10 циклов, которые вы пишете в C, будут иметь этот шаблон.

Теперь, наконец, вопрос в том, как реализовать ваше правило.К сожалению, так как это C, вы не можете сделать это так же просто, как в моем описании;Правило должно обновлять вектор на месте.Это будет выглядеть примерно так:

void rule(int t[]){
     /* compute the update here */
}

Теперь я не собираюсь рассказывать вам, как именно рассчитать обновление, потому что тогда вы не получите никакого удовольствия.Но вы можете найти статью в Википедии о Правиле 110 интересной .

Когда вы читаете ее, задумайтесь над этим: Это простое правило «Тьюринга завершено» - что означает его способность, возможно, с большим количествомсуетиться, представлять любое вычисление.Это простое правило само по себе является «компьютером» в теоретическом смысле.

Обновление

Хорошо, еще немного о правилах.Взгляните на таблицу правил в статье Wiki.Это показывает, что вы берете три ячейки вашего массива и определяете следующее значение для средней из трех.

Итак, в вашем правиле вам нужен передаваемый массив, t и массив для следующего момента, назовите его t1 .

  void rule(int t[]){ // there's the original
       int t1[14];    // there's the new array
       int ix ;       // an index for the loop that's coming up

Вы хотите просмотреть каждую ячейку массива

       for(ix=0; ix < 14; ix++){

и проверитьячейка вместе с ячейками слева и справа

            if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 0)
               t1[ix] = 0;
            else if(t[ix-1] == 0 && t[ix] == 0 && t[ix+1] == 1)
               t1[ix] = 1;

и так далее.Вам нужно будет подумать о том, что происходит по краям, т. Е. Когда ix == 0 или ix == 13.

Наконец, вам понадобится еще один цикл for, чтобы скопировать t1 обратно в t.

...