-
Notifications
You must be signed in to change notification settings - Fork 0
/
Sugarscape.jl
148 lines (135 loc) · 5.43 KB
/
Sugarscape.jl
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using Random
using Plots
# using VegaLite
using DataFrames
using Statistics
## using Match
mutable struct Sugarcell
location_x::Int64
location_y::Int64
growth_rate::Float64
carrying_capacity::Float64
sugar_level::Float64
occupied::Bool
agent_id::Int64
end
function generate_sugarscape(side, growth_rate, carrying_cap, scenario=1)
"""
Create an array of cells, representing, together the sugarscape object.
Each cell's sugar grows back at rate given by growth_rate.
The max. value of sugar in a cell is specified by its carrying capacity -
constant across all cells.
Each cell's initial sugarlevel is initialized to
0) a random value,
1) a central region with maximal sugar value, and sugarlevel falling off
uniformly as an inverse power of 0.3 with distance.
2) two regions of maximal sugar value, located in the north-east and south-
west quadrants
3) four regions of maximal sugar value, located roughly in the middle of
each of the four quadrants
"""
array_suglevels = zeros(side, side)
if scenario == 0
array_suglevels = [rand()* carrying_cap for x in 1:side, y in 1:side]
# return([Sugarcell(x, y, growth_rate, carrying_cap, ceil(rand()*5), false)
# for x in 1:side, y in 1:side])
elseif scenario == 1
central_x, central_y = side/2, side/2
array_suglevels = [carrying_cap/(sqrt((x - central_x)^2 + (y - central_y)^2)^0.3)
for x in 1:side, y in 1:side]
# return([Sugarcell(x, y, growth_rate, carrying_cap, array_suglevels[x,y], false)
# for x in 1:side, y in 1:side])
elseif scenario == 2
ne_row = side/3
ne_col = side * 2/3
sw_row = side * 2/3
sw_col = side/3
for x in 1:side
for y in 1:side
dist_sw = sqrt((x - sw_row)^2 + (y - sw_col)^2)
dist_ne = sqrt((x - ne_row)^2 + (y - ne_col)^2)
array_suglevels[x, y] = carrying_cap/(min(dist_ne, dist_sw)^0.3)
end
end
# return([Sugarcell(x, y, growth_rate, carrying_cap, array_suglevels[x,y], false)
# for x in 1:side, y in 1:side])
elseif scenario == 3
ne_row = side/4
ne_col = side * 3/4
nw_row = side/4
nw_col = side/4
se_row = side * 3/4
se_col = side * 3/4
sw_row = side * 3/4
sw_col = side/4
array_suglevels = zeros(side, side)
for x in 1:side
for y in 1:side
dist_sw = sqrt((x - sw_row)^2 + (y - sw_col)^2)
dist_ne = sqrt((x - ne_row)^2 + (y - ne_col)^2)
dist_se = sqrt((x - se_row)^2 + (y - se_col)^2)
dist_nw = sqrt((x - nw_row)^2 + (y - nw_col)^2)
array_suglevels[x, y] = carrying_cap/(min(dist_ne, dist_nw,
dist_se, dist_sw)^0.3)
end
end ## end of outer for
end ## end of scenarios
## default occupied = false and agent_id = -1
return([Sugarcell(x, y, growth_rate, carrying_cap, array_suglevels[x,y], false, -1)
for x in 1:side, y in 1:side])
end ## end of function generate_sugarscape
# function get_sugscape_suglevels(sugscape_obj)
# return([sugarobj.sugar_level for sugarobj in sugscape_obj])
# end ## get_sugscape_suglevels()
function get_sugarscape_stats(sugscape_obj)
"""
Returns min., max., mean, median, and sd. of sugar levels.
"""
# arr_suglevels = get_sugscape_suglevels(sugscape_obj)
arr_suglevels = [sugarobj.sugar_level for sugarobj in sugscape_obj]
return(minimum(arr_suglevels), maximum(arr_suglevels), mean(arr_suglevels),
median(arr_suglevels), std(arr_suglevels))
end ## get_sugarscape_stats()
function regenerate_sugar!(sugscape_obj)
"""
Modifies the cell objects in place by regenerating sugar in each cell by an
amount specified by growth_date, with an upper bound of carrying_capacity.
Does not return a new object, since the cell objects are modified in place.
"""
## println("Inside regenerate_sugar!()")
for cellobj in sugscape_obj
old_val = cellobj.sugar_level
new_val =
cellobj.sugar_level = max(0, min(cellobj.sugar_level*(1 + cellobj.growth_rate),
cellobj.carrying_capacity))
# println(string("Changing sugar level from ", old_val, " to ",
# cellobj.sugar_level, "\n"))
end
return
end ## regenerate_sugar!()
function plot_sugar_concentrations!(sugscape_obj)
"""
Generates a heatmap of the sugarlevels of all the cells
"""
print("Inside plot_sugar_concentrations\n")
gr()
nrows, ncols = size(sugscape_obj)
xs = [string(i) for i = 1:nrows]
ys = [string(i) for i = 1:ncols]
z = [sugscape_obj[row, col].sugar_level for row in 1:nrows, col in 1:ncols]
heatmap(xs, ys, z, aspect_ratio=1)
end ## plot_sugar_concentrations()
function update_occupied_status!(arr_agents, sugscape_obj)
"""
Updates the occupied status of all sugarcells, based on the
location values of agents that are alive.
"""
for cellobj in sugscape_obj
cellobj.occupied = false
end
for agobj in arr_agents
if agobj.location_x >= 1 && agobj.location_y >= 1
sugscape_obj[agobj.location_x, agobj.location_y].occupied = true
end
end
end