| | | | | | | | | | | | | | | | | | | | | | | | | | | | | К | л | е | т | о | ч | н | а | я | | в | с | е | л | е | н | н | а | я | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
А.К. Дьюдни "Клеточная вселенная и ее развитие во времени и пространстве" В | |
Мире науки, Октябрь 1989 | |
| |
"Клеточные автоматы - это |
стилизованные, синтетические |
вселенные... У них свой вид материи, |
кажущейся в своем пространстве и |
времени." |
Г.Тоффоли и Н.Марголас |
"Машины на клеточных автоматах" |
|
Ну а лучший пример такой |
миниатюрной вселенной дает нам новый |
тип клеточного автомата, открытый |
Дейвидом Гриффитом из Висконсинского |
университета в Мэдисоне. Стартуя из |
произвольно выбранного исходного |
состояния, автомат демонстрирует |
четыре различные фазы, завершающиеся причудливыми кристаллическими |
образованиями, сильно напоминающими примитивные формы жизни. |
Клеточный автомат состоит из бесконечной решетки клеток, каждая из которых |
находится в одном из нескольких возможных состояний. Каждая клетка меняет свое |
состояние синхронно с очередным тактом воображаемого часового механизма и в |
соответствии с набором несложных правил. Реализованные на компьютере клетки |
представляют собой пикселы (точечные элементы изображения) на экране; |
различным состояниям клеток соответствуют различные по окраске пикселы. При |
правильно выбранном наборе правил и исходных состояний компьютерный клеточный |
автомат может порождать чрезвычайно интересные цветные фигуры, изменяющиеся во |
времени. |
Изобретение Гриффита основано на чрезвычайно простом правиле. Оно |
заключается в том, чтобы пронумеровать возможные состояния от 0 до n - 1 и |
считать, что если клетка находится на данном такте в состоянии k, то на |
следующем такте она должна "съесть" любые соседние клетки, находящиеся в |
состоянии k - 1. Съедение проявляется в том, что съеденная соседняя клетка |
переходит из состояния k - 1 в состояние k; клетка в состоянии 0 может поедать |
соседние клетки в состоянии n - 1. |
|
На рисунке представлена эволюция поля 80x80 клеточного автомата для n = 17. | |
Каждый фрагмент разделяют 12 итераций. | |
|
#include <graphics.h> |
#include <bios.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <alloc.h> |
|
#define N_X (640UL) |
#define N_Y (350UL) |
#define NT (N_X*N_Y) |
char far *old, far *nw; |
|
main() { |
int i,j,k,l, c, dr = EGA, md = EGAHI, x, y ; |
|
if((old = farcalloc(1,NT)) == NULL) { |
printf(":(.\n"); |
exit(1); |
} |
if((nw = farcalloc(1,NT)) == NULL) { |
printf(":((.\n"); |
exit(1); |
} |
randomize(); |
for(j = 0; j < N_Y; j++) for(i=0;i<N_X;i++) |
old[N_X*i+j]=random(16); |
initgraph(&dr, &md, ""); |
do { |
for(j = 0; j < N_Y; j++) for(i=0;i<N_X;i++) { |
for(k = -1; k < 2; k+=2) for(l = -1; l < 2; l+=2) { |
x = i + k; |
if (x < 0) x = N_X - 1; |
if (x >= N_X) x = 0; |
y = j + l; |
if (y < 0) y = N_Y - 1; |
if (y >= N_Y) y = 0; |
if (old[N_X * x + y] == (old[N_X*i+j] + 1)&15 ) |
nw[N_X*i+j] = old[N_X * x + y]; |
} |
} |
for(j = 0; j < N_Y; j++) for(i = 0; i < N_X; i++) { |
c = old[N_X*i+j] = nw[N_X*i+j]; |
putpixel(i,j, c); |
} |
} while (bioskey(1) == 0); |
bioskey(0); |
return 0; |
} |
|