Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите с практикой пожалуйста
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
ИлюХа
Задача об инфекции стригущего лишая.
Промоделировать процесс распространения инфекции — стригущего лишая по участку кожи размером n*n (n — нечетное) клеток. Предполагается, что исходной зараженной клеткой кожи является центральная. В каждый интервал времени пораженная инфекцией клетка может с вероятностью 0,5 заразить любую из соседних здоровых клеток. По прошествии шести единиц време­ни зараженная клетка становится невосприимчивой к инфекции. Возникший иммунитет действует в течение последующих четырех единиц времени, а затем клетка оказывается здоровой. В ходе моделирования описанного процесса выдавать текущее состояние моделируемого участка кожи в каждом интервале времени отмечая зараженные, невосприимчивые к инфекции и здоровые клетки. пожалуйста если можно сделайте в течении 3 дней
Archon
Забавная формулировка для клеточного автомата. Попробуй поискать игру "Жизнь" и изменить ее под свои нужды. Реализации выкладывались и на этом форуме:
Игра "жизнь" - еще одна реализация
реализация игры жизнь.
Life
Lapp
Цитата(ИлюХа @ 24.06.2009 19:01) *
если можно сделайте в течении 3 дней
Знаешь что, с такими просьбами иди-ка ты в Задачи На Заказ. Если "сделайте", то платите денежки. Я поздно заметил эту приписку - уже сделал программу, но вот выкладывать не буду, раз ты сам участвовать не планируешь.

2 Archon: общего с Life, конечно, немало, но все же и отличия есть. Приобретение иммунитета - это все же некоторая зависимость от предыстории. Конечно, слои хранить тут не надо, но тогда состояние клетки должно учитывать прошедшее время.

Вероятность заражения, равная 50% - многовато, мне кажется. Неинтересно получается. Вот фрагментик:


#
###
#####
######
#######
#########
#######
###
# #







#
##
####
#######
#######
#########
#### #####
#########
#### #
####
# #






###
####
# #####
#########
######## #
#### ######
#### #####
#### #####
########
######
####





##
#####
#####
########
##########
#### ######
#### #######
##### ####
#### #####
# ########
######## #
#####
#
Lapp
При вероятности заражения 20% ситуация все еще безрадостная:
Код
++++ ++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
+++++++++++++++++++++
++ ++++++++++++++++++
++++++++++++++++++++  

Это конечный результат. Тут я стал метить переболевшие клетки плюсами. Видно, что заболевания избежали только три клетки((. Кстати, еще влияет длительность протекания заболевания. Ее тоже можно поварьировать.

Добавлено через 13 мин.
Экспериментируем дальше)). Последующие картинки печатаются с разрядкой.
При 15% заразности намечается некоторое улучшение, но все равно исход трагический. И хотя проходение болезни оставляло некоторый оптимизм в начале, переболели почти все:
Код
+ + + + + + + + + + + +   + +   + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + +   + + + +   + + + + + + + + + +
+ + + + + + + + + +   + + + + + + + + + +
+ + + + + + + + + +   + + + + + + + + + +
+ + + + + + + + + +   + + + + + + + + + +
+ + + + + + + + + + + + + + + + +   + + +
+ + + + + + + + + + + + + + + + +   + + +
+ + + + + + + + +   + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +   + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +   + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +   + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +


И только при 12% можно говорить, что болезнь не имеет совсем уж глобального характера:
Код








       + +
+ + + + + + + + + + + +
     + + + +   + + + + +             + + +
     + + + + + + + + +           + + + + +
       + + +       +           + + + + + +
       + + + +               + + + + + + +
       + + + +       +       + + + + + + +
           + + + + + + + + + + + + + + + +
         + + + + + + +   + + + +   + + + +
         + + + + + + + + + + + + + + + + +
       + + + + + + + + + + + + + + + + + +
       + + + + + + + + + + + + + + + + + +
       + + + + + + + + + + + + + + + + + +


Ну и при 9% можно сказать, что болезнь локализуется сама по себе:
Код






                       +
                   + + + + +
                   + + + + +
                   + + + + + + +
                   + + + + + +   + + +
                   + + + + +     + +
                   + + + + + + + + + + +
                   + + + + + + + + +
                     + + + + +   + + +
                     + +             + +
                                     + +





Время протекания пока не менял, везде равно 6.
Lapp
После нескольких экспериментов я пришел к выводу, что изменение времени протекания болезни не меняет картину в целом. Конечно, общее время эпидемии меняется соответственно, но результат зависит, видимо, от некоторой комбинации, типа произведение времени болезни на вероятность заражения. Вот, например, результат с такими параметрами: заразность=0.03, время=30
Код
    + + + + + +   + + + + + +   + + + + +
    + + + + + + + + + + + + +     + + +
+ + + + + + + + + + + + + + + + + + + + +
  + + + + + + + +     + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + +   + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +   + + + + + +
  + + + + + + + + + + + + + + + + + + + +
+ + + + + + +   + + + + + + +   + +   + +
  + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + +     + + + + + + + + + + + + +
+ + + + +   + + + + + + + + + + + +     +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +     + + + + + +
+   + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + +   + + + + + +     + + + + + + + +
+ + + + + + + + + + + + + +   + + + + + +

Да, еще забыл сказать: я с самого начала взял окрестность из 4 точек, а не из 8 как в Life. Если взять 8 соседей, то заразность придется еще больше уменьшать, енссно. Думаю, никаких особо новых эффектов это не привнесет.

Добавлено через 19 мин.
Однако, я не заметил не только фразы со "сделайте". Я не заметил, что иммунитет тоже истекает через некоторое время.. Внес исправления, теперь все значительно интереснее даже с заразностью 50%)). Эпидемия не кончается никогда, проходит волнами. Вот три последовательных кадра.
Код
# # # + + + + + + + + + + + # # # # # # #
# # + + +   +           + + # # # + # # #
# # + +                 + + # # # + + # #
+ + + +                   + + + + + + + #
+                         + + + + +   + +
                #         + # + + #     +
+               # #     # # # # # # # # +
+       # #   # # # # # # # # # # # # # #
        # # # # # # # # # # # + # # # #
  # # # # # # # # # # + # # # # # # # # #
# # # # # # # + + # + + # # # # # + + # #
# # # # # + + + + + + + + + # + + + + # #
# # # # + + + +   + + + + + + + + +   # #
# # # + +   # # #   #   + + + + # # # # #
# # + + + # # # # # # # + +         # # #
# # #   # # # # + + #         # # + + + #
# # # + # # # + + + # #       # + + + # #
# # # + + # # + #   # # #     # + # # # #
# # # + +       # # # # +   +   + # # # #
# # # # + + + + + +       + + + + # # #
# # # # # # + # + +   + + + + + + # # #

# # + + +   +   + + +   + + + # # + # # #
# + + +                 + + # # # + + # #
+ # + +                   + + + + + + + #
+ +                       + + + + +   + +
                #         +   + +     + +
                # #     # + #   # # # # +
          #   # # # # # # # # # # # # #
        # # # # # # # # # # # # # # # # #
  # # # # # # # # # # # # # # + + # # # #
# # # # # # # # # # # + # # # + # # + # #
# # # # # + + + + + + + + # # # + + + # #
# # # # + + + +   + + + + + + + + +   # #
# # # + + +     #   +   + + + + + #   # #
# # + + + # # # # # #     + + + # # # # #
# # + + # # # # # # # # + +   # #   # + #
# # # # # # # # + + # #       # # +   + +
# # + + # # + + +   # # #     # + + + # #
# # + + + # # + # # # # #     # + # + # #
# # + +   # # # # # # #         + + # # #
# # # + + + + + + +         +   + # # # #
# # # # # + + + +     +   + + + + # # # #

# # + +     +     +     + + + # # + # # #
+ + +                     + # + + + + + #
+ + + +                   + + + + + + + +
+               #             + +     + +
                # #     #     +       + +
          #   # # # # # # + # # # # # # +
        # # # # # # # # # # # # # # # # #
  # #   # # # # # # # # # # # # # # # # #
  # # # # # # # # # # + # # + + + # # # #
# # # # # # + + + # + + + # # + + + + # #
# # # # + + + + + + + + + + # + + + + + #
# # # + + + +   # + +   + + + + + # # + #
# # + + + + # # # #       + + + # # # + #
# # + + # # # # # # #       + # # # # # #
# # + # # # # # # + # #     # # # # # + +
# # + # # # + + + + + # #     # # + # + +
# + + # + # + +     # # # # # + + +   + #
# + + +   # +   # # # # #     #   + + + #
# # + + # # # # # # # # #         + # # #
# # + + + +   + + +   #         + + # # #
# # # + + + + + +         + + + + + # # #

По-прежнему учитываются только 4 соседа. Впрочем, исправить на 8 несложно.
Lapp
Теперь можно опубликовать код, использованных для приведенных выше расчетов.

uses
CRT;

const
n= 21; {размер области}
Cont= 50; {заразность в процентах}
Ill= 6; {время болезни}
Imm= 4; {длительность иммунитета}

var
a,b: array[1..n,1..n]of integer;
i,j: integer;
c: char;


procedure Show;
begin
for i:=1 to n do begin
for j:=1 to n do
if (a[i,j]>0) then Write(' #') else if a[i,j]<0 then Write(' +') else Write(' ');
WriteLn
end
end;


begin
FillChar(a,SizeOf(a),0);
a[n div 2+1,n div 2+1]:=1;
Show;
Randomize;
repeat
b:=a;
for i:=1 to n do begin
for j:=1 to n do begin
if a[i,j]>0 then begin
if (i>1) and (b[i-1,j]=0) and (Random(100)<Cont) then b[i-1,j]:=1;
if (j>1) and (b[i,j-1]=0) and (Random(100)<Cont) then b[i,j-1]:=1;
if (i<n) and (b[i+1,j]=0) and (Random(100)<Cont) then b[i+1,j]:=1;
if (j<n) and (b[i,j+1]=0) and (Random(100)<Cont) then b[i,j+1]:=1;
Inc(b[i,j]);
if b[i,j]>Ill then b[i,j]:=-Imm
end
else if a[i,j]<0 then Inc(b[i,j])
end
end;
a:=b;
Show;
WriteLn;
c:=ReadKey
until c=#27
end.

Unconnected
Выждал "в течение трёх дней"? lol.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.