Эволюция колоний знаменитой игры "Жизнь" удивительно напоминает поведение настоящей живой материи. Однако эволюция колоний в игре Конвэя, поначалу бурная, постепенно замирает, останавливается или зацикливается на повторении одних и тех же простых фигур. Мне же всегда хотелось, чтобы биение искусственной жизни не утихало и не замирало со временем. Конечность бытия отдельной живой единицы должна компенсироваться вечностью круговорота жизни как явления. Поэтому я задумался над такими правилами, которые обеспечивали бы бесконечную во времени эволюцию клеточных колоний. Бесконечно эволюционирующая сложность возникает всегда между двумя диалектическими противоречиями. Основу жизни составляют питание и размножение. Два эти процесса тесно взаимообусловлены. С одной стороны, чем обильнее питание, тем интенсивнее размножение. С другой стороны, чем интенсивнее размножение, тем больше требуется ресурсов питания, а ресурсы, как правило, ограничены. Эта взаимосвязь носит универсальный характер в живой природе и проявляется на всех уровнях ее организации - от микроскопических колоний примитивных бактерий до популяций высших животных. Попробуем разобраться, что может получиться, если смоделировать взаимосвязь процессов питания и размножения в клеточной игре, напоминающей игру "Жизнь". Поступим следующим образом. Первоначально на клеточное поле, свернутое в тор, в случайном порядке разбросаем некоторое количество живых клеток. Затем предположим, что каждая живая клетка за время жизни своего поколения выедает весь ресурс в соседних восьми ячейках. В следующий момент времени в какой-либо клетке поля возникает живая "особь", если в ее окрестности (соседних с ней восьми клетках) в предыдущем поколении обитал хотя бы один живой организм-родитель, а также если в ее окрестности оставалась хотя бы одна клетка с нетронутым ресурсом питания. После того, как поколение клеточных организмов обновилось по описанным правилам, ресурс питания, съеденный предыдущим поколением, обновляется, и весь жизненный цикл повторяется вновь.
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]
Комментарии