Complexity Explorer Santa Few Institute

Lecture: Crime and Punishment

Lead instructor:

Your progress is not being saved! Enroll now or log in to track your progress or submit homework.

Agent-Based Models with Python: An Introduction to Mesa

Geoff Evamy Hill
16 Oct 2024 11:21am UTC
2
in Agent-Based Models with Python: An Introduction to Mesa

Hi there,
I am getting this error when I run the code from step 7.
"""
self.grid.place_agent(trader, (x,y))
:83: UserWarning: Agent 4139 is being placed with
place_agent() despite already having the position (30, 30). In most
cases, you'd want to clear the current position with remove_agent()
before placing the agent again.
"""

It seems to happen with the code from the github as well. Any ideas?

Zhaohan
28 Nov 2024 12:41am UTC
in Agent-Based Models with Python: An Introduction to Mesa

Hi Geoff,
place_agent method checks whether the agent already has a position before placing it. You could simply solve this issue by setting pos = None when creating a new agent. Here is the source code.
@warn_if_agent_has_position_already
def place_agent(self, agent: Agent, pos: Coordinate) -> None:
"""Place the agent at the specified location, and set its pos variable."""
x, y = pos
if agent.pos is None or agent not in self._grid[x][y]:
self._grid[x][y].append(agent)
agent.pos = pos
if self._empties_built:
self._empties.discard(pos)
self._empty_mask[agent.pos] = True

Martina Umlauft
04 Dec 2024 1pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

Hi Geoff,
the current version of Mesa seems to do quite a bit of things differently to the version they used for the tutorial. I just commented out the call to place_agent() because the x,y coordinates are already given when you instantiate the agent. So, I basically just did it like this:
for _,(x,y) in self.grid.coord_iter():
max_sugar = sugar_distribution[x,y]
if max_sugar > 0:
sugar = Sugar(self, (x,y), max_sugar) # already placed
#self.grid.place_agent(sugar, (x,y)) # do NOT re-place without removing from old location
print(sugar.unique_id, sugar.pos, sugar.max_sugar)

Tom Youngman
16 Oct 2024 3:16pm UTC
6
in Agent-Based Models with Python: An Introduction to Mesa

I'm running the code as shown in session 5 but getting the follow error - any ideas?

---------------------------------------------------------------------------

ValueError Traceback (most recent call last)

in ()
----> 1 model = SugarscapeG1mt()

in __init__(self, width, height)
19
20 agent_id = 0
---> 21 for (x,y) in self.grid.coord_iter():
22 max_sugar = sugar_distribution[x,y]
23 if max_sugar > 0:

ValueError: too many values to unpack (expected 2)

Tom Youngman
16 Oct 2024 3:44pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

I've not figured out the error:
for _,(x,y) in self.grid.coord_iter():

needs the brackets around (x,y) removed to become:
for _,x,y in self.grid.coord_iter():

I have forked the session 5 on GitHub and suggested the change

Eka Putri Difayanti
10 Nov 2024 10:37pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

I have the same problem. Did you find a solution?

Kai Greenlees
26 Nov 2024 12:18pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

I've had the same problem as well, did anyone come across a solution?

Tom Youngman
26 Nov 2024 12:21pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

Did this fix not work?
for _,(x,y) in self.grid.coord_iter():

needs the brackets around (x,y) removed to become:
for _,x,y in self.grid.coord_iter():

Kai Greenlees
26 Nov 2024 12:56pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

Hi Tom, actually I am struggling with another issue when I try to run the last step in the fifth session I get this error about the number of arguments being incorrect with the __init__() function in the Sugar agent parameters, but the code I've used is a direct copy of the Session 5 code provided. Any thoughts on how to troubleshoot would be greatly appreciated. I am new to Python & ABM so the syntax is still new to me

Error message:
TypeError Traceback (most recent call last)
in ()
----> 1 model = SugarscapeG1mt()

2 frames
/usr/local/lib/python3.10/dist-packages/mesa/agent.py in __init__(self, model, *args, **kwargs)
62
63 """
---> 64 super().__init__(*args, **kwargs)
65
66 self.model: Model = model

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

Martina Umlauft
04 Dec 2024 12:54pm UTC
in Agent-Based Models with Python: An Introduction to Mesa

Hi Kai,
the problem is that in the current version of Mesa the mesa.Agent does not take the unique_id argument anymore. You do not set the id anymore, the agents do that themselves when they are created. So, when you call super().__init__(...) in your Sugar class, it should NOT pass the unique_id as an argument. If you do that, python thinks this is not for mesa.Agent - becase mesa.Agent's constructor doesn't take that argument anymore - and searches up the class hierarchy for a class that has a constructor that takes both, the unique_id and model as arguments. And then ends up at the top level of the class hierarchy at object - which also takes only one argument.
It took me a while to understand what was going on there (also because the AI generated "explain this error" explanations were simply wrong). I tried installing a older versions of Mesa but couldn't find the correct one - when I tried the versions mentioned in the first videos - 0.8 and 1.1 other stuff broke, like mesa.space.MultiGrid... idk what version they are really using for this tutorial.

Anyway, the solution to fix this is to do just
super().__init__(model)
in your Sugar class and to not do anything with this unique_id and agent_id. That stuff is automatic in the agent now.

You also need to do this in your SugarscapeG1mt model class now:

def __init__(self, width=50, height=50):
# Initialize the random number generator
self.random = np.random.default_rng(seed=123) # set seed

because these when these agents now try to register with the model, the model needs to have a random generator.

In an ideal world, they'd update the tutorial to reflect the changes but I'd be already happy if anybody could tell me what version of mesa the tutorial is supposed to use because it seems a lot has changed and it does NOT work with the versions they mentioned (0.8. and 1.1 respectively) either.