malariariariara

This commit is contained in:
Sijmen 2019-03-07 17:06:20 +01:00
parent 2fd94ae46c
commit 7de4eaaf38

View file

@ -1,4 +1,5 @@
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np import numpy as np
import random import random
from enum import IntEnum from enum import IntEnum
@ -6,7 +7,7 @@ from enum import IntEnum
class Model: class Model:
def __init__(self, width=32, height=32, humandens=0.15, mosquitodens=0.10, def __init__(self, width=32, height=32, humandens=0.15, mosquitodens=0.10,
immumepct=0.1, mosqinfpct=0.1, hm_infpct=0.5, mh_infpct=0.5, immunepct=0.1, mosqinfpct=0.1, hm_infpct=0.5, mh_infpct=0.5,
hinfdiepct=0.01, mhungrypct=0.1, humandiepct=10**-6, hinfdiepct=0.01, mhungrypct=0.1, humandiepct=10**-6,
mosqdiepct=10**-3, mosqnetdens=0.05, time_steps=500): mosqdiepct=10**-3, mosqnetdens=0.05, time_steps=500):
self.width = width self.width = width
@ -31,47 +32,50 @@ class Model:
def recycle_human(self): def recycle_human(self):
# Get all living humans # Get all living humans
humans = np.transpose(np.where(a != Human.DEAD)) humans = np.transpose(np.where(self.grid != Human.DEAD))
deaths = numpy.random.rand(len(humans)) < self.humandiepct
grid[humans[deaths]] = Human.DEAD
for x, y in humans: # Get a mask of humans to kill
if numpy.random.rand() < self.humandiepct: deaths = np.random.rand(len(humans)) < self.humandiepct
grid[x, y] =
# Kill them.
self.grid[humans[deaths][:, 0], humans[deaths][:, 1]] = Human.DEAD
# Pick a random, unpopulated spot # Pick a random, unpopulated spot
x, y = random.choice(np.transpose(np.where(a == Human.DEAD))) x, y = random.choice(np.transpose(np.where(self.grid == Human.DEAD)),
size=np.count_nonzero(deaths))
def gen_humans(self): def gen_humans(self):
# Calculate the probabilities
p_dead = 1 - self.humandens p_dead = 1 - self.humandens
p_immune = self.humandens * self.immunepct p_immune = self.humandens * self.immunepct
p_healthy = p_dead - p_immune p_healthy = self.humandens - p_immune
# Create the grid with humans.
return np.random.choice((Human.DEAD, Human.HEALTHY, Human.IMMUNE), return np.random.choice((Human.DEAD, Human.HEALTHY, Human.IMMUNE),
size=(self.width, self.height), size=(self.width, self.height),
p=(p_dead, p_immune, p_healthy)) p=(p_dead, p_healthy, p_immune))
def gen_mosquitos(self): def gen_mosquitos(self):
mosquitos = []
count = self.width * self.height * self.mosquitodens count = self.width * self.height * self.mosquitodens
for _ in count:
def run(self): def run(self):
for _ in range(self.time_steps): for _ in range(self.time_steps):
self.step() self.step()
self.draw() self.draw()
def step(self): def step(self):
# dingen # dingen
pass pass
def draw(self): def draw(self):
# this function draws the humans # this function draws the humans
plt.imshow(self.humans) colors = matplotlib.colors.ListedColormap(
["black", "green", "red", "yellow"])
bounds = [Human.DEAD, Human.HEALTHY, Human.INFECTED, Human.IMMUNE]
norm = matplotlib.colors.BoundaryNorm(bounds, colors.N)
plt.imshow(self.humans, cmap=colors, norm=norm)
plt.pause(0.0001) plt.pause(0.0001)
plt.clf() plt.clf()
@ -93,11 +97,8 @@ class Human(IntEnum):
if __name__ == "__main__": if __name__ == "__main__":
plt.ion() plt.ion()
model = Model()
while True:
model.draw()
for i in range(500):
img = np.random.randint(0, 3, (10000, 10000))
plt.imshow(img)
plt.pause(0.0001)
plt.clf()