Хорошо, каждый клеточный автомат построен на «рекуррентном отношении», так что состояние во время 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
.