Podobnie jak w zeszłym roku, naszym pierwszym zadaniem zaliczeniowym będzie wykonanie programu w pythonie, który symuluje automat komórkowy. Tym razem będzie to tzw. stochastyczny automat komórkowy, gdzie zmiany stanów następują losowo, zgodnie z pewnymi regułami. Będziemy to robić na przykładzie bardzo uproszczonego modelu epidemii podczas kwarantanny. Będziemy używali adaptacji uproszczonego modelu Kermack’a-McKendricka. Osoby zainteresowane mogą poczytać wicej o podobnych modelach w tym artykule:schneckenreither2008
W naszym przypadku model automatu komórkowego to dwuwymiarowa macierz o wymiarach NxN (gdzie N jest parametrem wykonania programu). Każda komórka macierzy reprezentuje jedną osobę i może przyjmować jedną z 3 możliwych wartości:
- 0 – podatny na zarażenie,
- 1 – zarażony,
- 2 – ozdrowieniec (niepodatny na zarażenie).
Macierz jest w większości inicjowana na 0 (cała populacja jest na razie zdrowa i podatna na zarażenie), oprócz k pierwszych zarażonych, rozłożonych losowo w różnych miejscach macierzy (k to kolejny parametr wykonania)
W każdym kroku symulacji, wartości w macierzy będą zmieniały się zgodnie z następującymi regułami:
- ozdrowieńcy (komórki o wartości 2) nie zmieniają już swojego stanu
- każda komórka w stanie zarażonym (1) ma szanse na wyzdrowienie (przejście do stanu 2) w każdym kroku równe p_w (parametr)
- każda komórka w stanie podatnym (0) ma szanse na zarażenie się od każdego chorego sąsiada równe p_z (parametr)
Sąsiedztwo wyznaczamy wg. metody Moore’a, przy czym rozważamy sąsiedztwo o promieniu r, (parametr, domyślnie 1), czyli sąsiadami są pola o odległości Czebyszewa nie większej niż r.
W związku z tym, w każdym kroku możemy obliczyć dla każdego pola liczbę sąsiadów zarażonych Z (liczba pól w zadanym sąsiedztwie, które w obecnym stanie mają wartość 1). Wtedy prawdopodobieństwo zarażenia w danym kroku (zakładamy niezależne zarażenia od wszystkich sąsiadów) to 1- (1-p_z)**Z.
Interesuje nas ewolucja takich układów dla zadanych parametrów N,k,p_w,p_z,r.
Państwa zadaniem jest napisanie programu, który pozwala na:
- Przeprowadzenie symulacji (dla zadanych parametrów), która wykonuje maksymalnie M kroków, chyba, że wcześniej zostanie osiągnięty stan, w którym wszyscy są już
niepodatni na zarażenieozdrowieńcami (5 pkt) - Wizualizacja poszczególnych kroków algorytmu w postaci:
a) wykresu liniowego (liczba komórek o wartościach 0,1,2 w zależności od czasu – 1 pkt)
b) wizualizacji stanów systemu w kolejnych krokach (przy pomocy funkcji imshow() – 1pkt)
c) zapisu tych wizualizacji do formatu .png (1 pkt)
c) animacji przy pomocy klasy animation (2 pkt).
Mają Państwo na to 2 tygodnie, czyli spodziewam się przesłania do mnie e-mailem, z tagiem [ONA] w tytule, rozwiązania w postaci pojedyńczego, skomentowanego pliku pythonowego, jako załącznik, do dnia 1. kwietnia 2020.
Pytania najlepiej przesyłać w postaci komentarzy do tego posta.
Na wykładzie ustaliliśmy, że wydajność nie będzie miała zasadniczego wpływu na ocenę, ale zakładam, że korzystać będziecie Państwo z macierzy numpy i wizualizacji matplotlib.
Czy parametry: N,k,p_w,p_z,rsą podawane w momencie uruchomienia z terminala, czy mają być zbierane ze stdin? Czy jeśli mogą być ze stdin to możemy użyć int(input()) dla każdego z parametrów?
Nie jest to wymienione w zadaniu, więc można to zrobić dowolnie, ale zachęcam do zapoznania się z modułem Argparse i przetwarzaniem parametrów z linii komend. int(input()) to nie jest dobra metoda przyjmowania argumentów…
“Przeprowadzenie symulacji (dla zadanych parametrów), która wykonuje maksymalnie M kroków”
M to kolejny parametr? Nie został wymieniony w zadanych parametrach.
Tak.
Czy animacja powinna mieć tytuł albo inne cechy, czy wystarczą “zmieniające się kolory kwadracików”?
Ścisłych wymogów nie ma, ale może lepiej, żeby miała jakiś tytuł.
Czy wykres 2a mamy zapisywać dla każdego kroku czy tylko końcową formę?
Wykres liniowy wystarczy jeden dla całości symulacji.
Moment zakończenia, czyli gdy nikt nie jest podatny na zarażenie, mamy interpretwać w ten sposób, że po prostu nie ma 0 w macierzy, czy że mogą być nadal 0, ale już wiemy, że się nie zarażą?
Moment zakończenia, to wtedy, gdy są same 2 (jeśli mamy 1 – to jeszcze muszą wyzdrowieć). Początkowo to niejasno sformułowałem.
Przepraszam, ale nie wiem czy dobrze rozumiem. Cytuję: “Przeprowadzenie symulacji (dla zadanych parametrów), która wykonuje maksymalnie M kroków, chyba, że wcześniej zostanie osiągnięty stan, w którym wszyscy są już ozdrowieńcami (5 pkt)”. Z tego wynika, że jeśli nie ma już komórek o wartości 1, ale ciągle są 0 i 2 (sytuacja w której nie wszyscy się zarazili) to symulacja ma dalej trwać aż do M kroków? Nie lepiej to zakończyć w momencie, gdy na mapie nie ma już komórek zarażonych?
Słuszna uwaga, choć to sytuacja raczej teoretyczna
Mamy zapisać sam wykres liniowy czy również animację?
Zapisywanie do pliku png (punkt 2c) dotyczy zarówno wykresu liniowego jak i pojedyńczych klatek animacji (2a, 2b), natomiast nie ma obowiązku zapisywania samej animacji do pliku gif, choć jak ktoś się tego nauczy, to na pewno się to przyda…