From ecb9cc26e9dca9a71c7fa65ceceac57cc82531a2 Mon Sep 17 00:00:00 2001 From: AlexBocken Date: Thu, 11 May 2023 17:57:39 +0200 Subject: [PATCH] dynamic normalization for pheromones --- server.py | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/server.py b/server.py index afda068..1a4e8d8 100755 --- a/server.py +++ b/server.py @@ -39,14 +39,16 @@ def setup(params=None): canvas_width = 500 canvas_height = 500 - def __init__(self, portrayal_method, grid_width, grid_height, canvas_width=500, canvas_height=500,): + def __init__(self, portrayal_method, grid_width, grid_height, canvas_width=500, canvas_height=500, norm_method=None): super().__init__(portrayal_method, grid_width, grid_height, canvas_width, canvas_height) + self.norm_method = norm_method def render(self, model): grid_state = defaultdict(list) + norm = self.norm_method(model) for x in range(model.grid.width): for y in range(model.grid.height): - portrayal = self.portrayal_method(model, (x, y)) + portrayal = self.portrayal_method(model, (x, y), norm) if portrayal: portrayal["x"] = x portrayal["y"] = y @@ -63,13 +65,13 @@ def setup(params=None): return max(int(255 - level * 255 / normalization), 0) - def portray_ant_density(model, pos): + def portray_ant_density(model, pos, norm): if model.grid.is_nest(pos): col = "red" elif model.grid.is_food(pos): col = "green" else: - col = get_color(level=len(model.grid[pos]), normalization=5) + col = get_color(level=len(model.grid[pos]), normalization=norm) col = f"rgb({col}, {col}, {col})" @@ -83,9 +85,12 @@ def setup(params=None): "Color": col, } - def portray_pheromone_density(model, pos): - col_a = get_color(level=model.grid.fields["A"][pos], normalization=3) - col_b = get_color(level=model.grid.fields["B"][pos], normalization=3) + def get_max_grid_val(model, key): + return np.max(model.grid.fields[key]) + + def portray_pheromone_density(model, pos, norm): + col_a = get_color(level=model.grid.fields["A"][pos], normalization=norm) + col_b = get_color(level=model.grid.fields["B"][pos], normalization=norm) return { "Shape": "hex", "r": 1, @@ -101,10 +106,31 @@ def setup(params=None): width = params['width'] height = params['height'] pixel_ratio = 10 - grid_ants = CanvasHexGridMultiAgents(portray_ant_density, width, height, width*pixel_ratio, height*pixel_ratio) - grid_pheromones = CanvasHexGridMultiAgents(portray_pheromone_density, width, height, width*pixel_ratio, height*pixel_ratio) + grid_ants = CanvasHexGridMultiAgents(portray_ant_density, + width, height, width*pixel_ratio, height*pixel_ratio, + norm_method=lambda m: 5) + + def norm_ants(model): + return 5 + + def norm_pheromones(model): + max_a = np.max(model.grid.fields["A"]) + max_b = np.max(model.grid.fields["B"]) + return np.ceil(np.max([max_a, max_b, 20]) + 1e-4).astype(int) + + grid_pheromones = CanvasHexGridMultiAgents(portray_pheromone_density, + width, height, width*pixel_ratio, height*pixel_ratio, + norm_method=norm_pheromones + ) test_text = TextElement() - return ModularServer(ActiveWalkerModel, [lambda m: "

Ant density

Nest: Red, Food: Green
", grid_ants, lambda m: "

Pheromone Density

Pheromone A: Cyan, Pheromone B: Pink
", grid_pheromones], + return ModularServer(ActiveWalkerModel, + [lambda m: "

Ant density

Nest: Red, Food: Green
", + grid_ants, + lambda m: f"
Normalization Value: {norm_ants(m)}
", + lambda m: "

Pheromone Density

Pheromone A: Cyan, Pheromone B: Pink
", + grid_pheromones, + lambda m: f"
Normalization Value: {norm_pheromones(m)}
" + ], "Active Random Walker Ants", params) if __name__ == "__main__":