Скачиваний:
27
Добавлен:
22.05.2015
Размер:
92.67 Кб
Скачать

Искусственная жизнь

«Искусственная Жизнь» моделирует жизнь поколений гипотетической колонии живых клеток, которые выживают, размножаются или погибают в соответствии со следующими правилами. Клетка выживает, если она имеет двух или трех соседей из восьми возможных. Если у клетки только один сосед или вовсе ни одного, она погибает в изоляции. Если клетка имеет четырех или более соседей, она погибает от перенаселения. В любой пустой позиции, у которой ровно три соседа, в следующем поколении появляется новая клетка.

Ввод осуществляется с клавиатуры (случайный ввод делать не стал - не интересно). Форму клеточного организма можно задавать не только прямоугольной, но любой произвольной формы и даже в виде нескольких несвязанных форм. Внутри каждой формы могут быть полости произвольного размера. В общем, нет ограничений при вводе формы клеточного организма кроме размера окна консольного приложения. Живая клетка вводится иксом (x), место, где может появиться клетка, вводится латинской буквой (o), пустые полости внутри фигуры вводятся пробелами. Конец ввода - ввод пустой строки. Далее каждый шаг жизни клеточного организма происходит по нажатию Enter (хотя можно легко доделать, чтоб было по таймеру).

Внизу организма печатается номер шага. Программа определяет состояние, когда организм перешёл в устойчивое состояние и перестал видоизменяться, и сообщает об этом. Также программа определяет смерть организма. При желании можно добавить идентификацию осцилляторов.

Пример 2. Вот исходный текст, сдобренный обширными комментариями:

implement main

open core,console,string

constants className = "com/visual-prolog/main". classVersion = "$JustDate: $$Revision: $".

class facts cell: (unsigned Шаг,unsigned16 X,unsigned16 Y,char Клетка). % клетка поля в памяти m: unsigned16 := erroneous. % номер строки для вывода текущих сообщений change: boolean := erroneous. % изменилось ли клеточное поле на очередном шаге

class predicates zone: (unsigned16 Y) procedure. % ввод строк клеточного поля с нулевой строки row: (unsigned16,unsigned16,string) procedure. % разделение строки на символы f: (unsigned Шаг,unsigned16 X,unsigned16 Y,char) procedure. % сохранение в БД очередного символа строки в виде клетки life: (unsigned) procedure (i). % житие life_cell: (unsigned,unsigned16,unsigned16,char,unsigned) procedure. neighbours: (unsigned,unsigned16 X,unsigned16 Y) -> unsigned procedure (i,i,i). % число соседей клетки (X,Y) n: (unsigned ЕстьНет,unsigned16 X,unsigned16 Y) -> unsigned procedure (i,i,i). % клетка (X,Y) жива или её нет print: (unsigned) procedure (i).

clauses

classInfo(className, classVersion).

zone(Y):-L=readline(),L>"",row(0,Y,L),!,zone(Y+1);m:=Y.

row(X,Y,L):-frontchar(L,C,R),f(0,X,Y,C),!,row(X+1,Y,R);succeed().

f(_,_,_,' '):-!. % если пробел, то клетки нет f(N,X,Y,C):-assert(cell(N,X+1,Y+1,C)). % иначе - сохраняем клетку в памяти

life(N):-cell(N,X,Y,C),life_cell(N,X,Y,C,neighbours(N,X,Y)),fail. % модификация всех клеток в памяти life(N):-change=true(),print(N+1),retractall(cell(N,_,_,_)),% вывод клеток в консоль     setLocation(console_native::coord(0,m)),write("Шаг ",N+1), % вывод шага жизни     _ = readchar(),change:=false(),!,life(N+1). % рекурсия life(N):-cell(N+1,_,_,'x'),setLocation(console_native::coord(0,m+1)),write("Устой-ть"),!. % изменений нет, но живые есть life(_):-setLocation(console_native::coord(0,m+1)),write("Все вымерли").  % живых не осталось

life_cell(N,X,Y,'o',3):-assert(cell(N+1,X,Y,'x')),change:=true(),!. % рождение новой клетки на пустом месте, если есть три соседа life_cell(N,X,Y,'x',NB):-NB>1,NB<4,assert(cell(N+1,X,Y,'x')),!. % продолжение жизни клетки life_cell(N,X,Y,'x',_):-assert(cell(N+1,X,Y,'o')),change:=true(),!.% смерть клетки life_cell(N,X,Y,C,_):-assert(cell(N+1,X,Y,C)). % без изменений - клетки не было, и не появилось

neighbours(N,X,Y)=n(N,X-1,Y-1)+n(N,X,Y-1)+n(N,X+1,Y-1)+    n(N,X-1,Y)+n(N,X+1,Y)+n(N,X-1,Y+1)+n(N,X,Y+1)+n(N,X+1,Y+1).

n(N,X,Y)=1:-cell(N,X,Y,'x'),!. % клетка (X,Y) жива n(_,_,_)=0.

print(N):-cell(N,X,Y,C),setLocation(console_native::coord(X-1,Y-1)),write(C),fail;succeed().

run():-init(),zone(0),life(0), _ = readchar().

end implement main

goal

   mainExe::run(main::run).

Есть также много интересных осцилляторов. Простейший осциллятор представляет собой вертикаль на поле 3х3:

oxo

oxo

oxo

Жизнь такого организма представляет собой бесконечную смену двух состояний: вертикаль – горизонталь. Пропеллер.

Задание 5. На основе примера 2 исследовать влияние модификации констант правил на жизнь популяции.

Задание 6. Разработать модель распространения инфекции (допустим клетка ‘ф’), каждый промежуток времени с вероятностью 50% она заражает соседнюю клетку, клетка болеет 6 промежутков времени болеет (‘б’), затем вылечивается и на 4 промежутка времени имеет иммунитет ("и"). Подсказка: для получения вероятности воспользуйтесь функцией math::random().

Задание повышенной сложности 4. Разработать программу “Естественный отбор”, моделирующую жизнь поколений двух враждующих колоний живых клеток на общей территории, которые выживают, размножаются или погибают согласно правилам, которые Вы придумайте сами в соответствии со следующей стратегией. Клетки умирают либо от перенаселения, либо от большого количества чужих клеток, находящихся по соседству. Клетки продолжают жить, если нет перенаселения и чужих клеток рядом мало или нет. Клетки рождаются, когда рядом немного своих клеток и совсем нет чужих. Колонии могут иметь различные константы своей стратегии.

Задание повышенной сложности 5. Разработать программу “Симбиоз”, моделирующую жизнь поколений двух враждующих колоний живых клеток на общей территории, которые выживают, размножаются или погибают согласно правилам, которые Вы придумайте сами в соответствии со следующей стратегией. Клетки умирают либо от перенаселения, либо от малого количества чужих клеток, находящихся по соседству. Клетки продолжают жить, если нет перенаселения и чужих клеток рядом достаточно. Клетки рождаются, когда рядом немного своих клеток и немного чужих. Колонии могут иметь различные константы своей стратегии.

Задание повышенной сложности 6. Разработать программу “Гармония и равновесие” моделирующую жизнь хищников, травоядных и травы на общей территории. Хищники передвигаются быстро и при встрече пожирают встреченных травоядных. Если через несколько промежутков времени еда не найдена – хищник погибает от голода. Травоядные передвигаются медленно и едят подножный корм. Травоядное умирает от голода, если не найдёт траву через несколько промежутков времени. Калорийность белковой пищи гораздо выше растительной. Трава растёт на новом месте, если рядом есть трава. Трава не умирает сама по себе и может быть только съедена.

Соседние файлы в папке Лабораторные работы