Эволюция колоний знаменитой игры "Жизнь" удивительно напоминает поведение настоящей живой материи. Однако эволюция колоний в игре Конвэя, поначалу бурная, постепенно замирает, останавливается или зацикливается на повторении одних и тех же простых фигур. Мне же всегда хотелось, чтобы биение искусственной жизни не утихало и не замирало со временем. Конечность бытия отдельной живой единицы должна компенсироваться вечностью круговорота жизни как явления. Поэтому я задумался над такими правилами, которые обеспечивали бы бесконечную во времени эволюцию клеточных колоний. Бесконечно эволюционирующая сложность возникает всегда между двумя диалектическими противоречиями. Основу жизни составляют питание и размножение. Два эти процесса тесно взаимообусловлены. С одной стороны, чем обильнее питание, тем интенсивнее размножение. С другой стороны, чем интенсивнее размножение, тем больше требуется ресурсов питания, а ресурсы, как правило, ограничены. Эта взаимосвязь носит универсальный характер в живой природе и проявляется на всех уровнях ее организации - от микроскопических колоний примитивных бактерий до популяций высших животных. Попробуем разобраться, что может получиться, если смоделировать взаимосвязь процессов питания и размножения в клеточной игре, напоминающей игру "Жизнь". Поступим следующим образом. Первоначально на клеточное поле, свернутое в тор, в случайном порядке разбросаем некоторое количество живых клеток. Затем предположим, что каждая живая клетка за время жизни своего поколения выедает весь ресурс в соседних восьми ячейках. В следующий момент времени в какой-либо клетке поля возникает живая "особь", если в ее окрестности (соседних с ней восьми клетках) в предыдущем поколении обитал хотя бы один живой организм-родитель, а также если в ее окрестности оставалась хотя бы одна клетка с нетронутым ресурсом питания. После того, как поколение клеточных организмов обновилось по описанным правилам, ресурс питания, съеденный предыдущим поколением, обновляется, и весь жизненный цикл повторяется вновь.
Private Sub Form_click()
Dim x(350,350) As Byte
Dim y(350,350) As Byte
Dim R(350,350) As Byte
Dim color As Long
Dim n As Integer
n=340
For i=1 To n Step 1
For j=1 To n Step 1
x(i,j)=0
If Rnd>0.4 Then x(i,j)=1
Next j
Next i
For i=1 To n
For j=1 To n
R(i,j)=1
color=RGB(255,255,255)
If x(i,j)=1 Then color=RGB(0,0,0)
PSet(i,j),color
Next j
Next i
For l=1 To 27
x(0,0)=x(n,n)
x(0,n+1)=x(n,1)
x(n+1,0)=x(1,n)
x(n+1,n+1)=x(1,1)
For k=1 To n
x(0,k)=x(n,k)
x(k,0)=x(k,n)
x(n+1,k)=x(1,k)
x(k,n+1)=x(k,1)
Next k
For i=1 To n
For j=1 To n
s=x(i-1,j-1)+x(i-1,j)+x(i-1,j+1)+x(i,j-1)+x(i,j+1)+x(i+1,j-1)+x(i+1,j)+x(i+1,j+1)
If s>0 Then R(i,j)=0
Next j
Next i
R(0,0)=R(n,n)
R(0,n+1)=R(n,1)
R(n+1,0)=R(1,n)
R(n+1,n+1)=R(1,1)
For k = 1 To n
R(0,k)=R(n,k)
R(k,0)=R(k,n)
R(n+1,k)=R(1,k)
R(k,n+1)=R(k,1)
Next k
For i=1 To n
For j=1 To n
sX=x(i-1,j-1)+x(i-1,j)+x(i-1,j+1)+x(i,j-1)+x(i,j+1)+x(i+1,j-1)+x(i+1,j)+x(i+1,j+1)
sR=R(i-1,j-1)+R(i-1,j)+R(i-1,j+1)+R(i,j-1)+R(i,j+1)+R(i+1,j-1)+R(i+1,j)+R(i+1,j+1)
y(i,j)=0
If sX>0 And sR>0 Then y(i,j)=1
Next j
Next i
For i=1 To n
For j=1 To n
color=RGB(255,255,255)
If y(i,j)=1 Then color=RGB(0,0,0)
PSet(i,j),color
x(i,j)=y(i,j)
R(i,j)=1
Next j
Next i
Next l
End Sub
Как видно, правила предельно просты и вместе с тем похожи в чем-то на то, что реально происходит в природе. Несмотря на предельную простоту, поведение описанного клеточного автомата чрезвычайно занимательно. Он способен порождать прямоугольные волны, вечно видоизменяющиеся структуры, симметричные узоры и смешанные комбинации всего перечисленного. Иногда картинки, порожденные этой игрой, напоминают хитросплетение линий на материнской плате компьютера, иногда элементы традиционного белорусского орнамента.

Вечное диалектическое противоречие между питанием и размножением в условиях ограниченного ресурса заставляет хаотичное исходное множество точек превращаться в упорядоченные, бесконечно изменяющиеся структуры. Как и в природе, "жизнь" постоянно сама все расставляет по своим местам.
А. КОЛЕСНИКОВ,
[email protected]






Комментарии