-
Notifications
You must be signed in to change notification settings - Fork 1
/
simulation.py
101 lines (84 loc) · 3.37 KB
/
simulation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import ABM as abm
import numpy as np
import matplotlib.pyplot as plt
import yaml
import datetime as dt
with open("simconfig.yml", 'r') as ymlfile:
cfg = yaml.load(ymlfile)
# fixed random seed for reproducability
np.random.seed(123456789)
# Sim setup
w = cfg['Grid']['NX']
h = cfg['Grid']['NY']
rhoprey = cfg['Sim']['RhoPrey']
rhopred = cfg['Sim']['RhoPred']
ff = cfg['Sim']['FastForward']
pFlee = cfg['Prey']['Pflee']
pBreedPrey = cfg['Prey']['Pbreed']
pBreedPred = cfg['Pred']['Pbreed']
FoodReservePrey = cfg['Prey']['FoodReserve']
FoodReservePred = cfg['Pred']['FoodReserve']
MaxFrPrey = cfg['Prey']['FoodReserveMax']
MaxFrPred = cfg['Pred']['FoodReserveMax']
# plot config
filepath = cfg['Plots']['filepath']
figsize = cfg['Plots']['figsize']
DPI = cfg['Plots']['DPI']
fmt = cfg['Plots']['format']
# Grid setup
grid = abm.Grid(h, # height of the grid
w, # width of the grid
rhoprey, # rhoprey
rhopred, # rhopred
FoodReservePrey, # food reserve prey
FoodReservePred, # fr pred
MaxFrPrey, # max food reserve prey
MaxFrPred, # max fr pred
pBreedPrey, # pBreed prey
pBreedPred, # pBreed pred
pFlee) # pFlee for prey
# actual sim
cycles = h*w
ts = cfg['Sim']['Timesteps'] # timesteps
# initialize empty lists for density plots
nprey = []
npred = []
# initialize empty step counter
stepcnt = 0
# append the first values
nprey.append(grid.get_num_prey())
npred.append(grid.get_num_pred())
if(__name__ == '__main__'):
# initial plot, currenttimestep = -1, because range(ts) starts at 0 and internally the x axis is created via np.arange(currenttimestep)
print(": Simulation start", dt.datetime.now())
fig, ax, cbar = grid.plot(densities=[nprey, npred], currenttimestep=-1, timesteps=ts, dpi=DPI,
filepath=filepath, filename=grid.timestamp()+"_0", title='init',
fmt=fmt, figsize=figsize)
plt.close(fig)
inittime = dt.datetime.now()
# actual simulation
for _ in range(ts):
stepcnt += 1
start = dt.datetime.now()
_y, _x = np.where(grid.get_grid() != '') # indices of agents
idc = np.array([_y, _x]).T
np.random.shuffle(idc) # shuffle the indices
for idx in idc:
j, i = idx
grid.TakeAction([j, i], FoodReservePrey, FoodReservePred)
if(grid.get_num_pred() == 0): # precaution, if predator dies out, the simulation stops
print(":: Predator died out !")
break
print(":: Step ", _, " | Elapsed time: ", dt.datetime.now() - start)
nprey.append(grid.get_num_prey())
npred.append(grid.get_num_pred())
if(stepcnt >= ff):
fig, ax, cbar = grid.plot(densities=[nprey, npred], currenttimestep=_, timesteps=ts,
dpi=DPI, filepath=filepath,
filename=grid.timestamp() + "_" + str(_ + 1),
title='Step ' + str(_) + ', ', fmt=fmt, figsize=figsize)
plt.close()
stepcnt = 0 # reset counter
stoptime = dt.datetime.now()
print(": Simulation stop", stoptime)
print(": Total Runtime: ", stoptime - inittime)