I actually don’t simulate anything in python at all, so I can’t say much about moving units in the GameState. I do remember having problems with updating information because of how shallow copying works in python (I would start there, personally). The way my simulator works is I pass it two parameters. The first is a formatted input of the current map. The second is a list of checks, or units to add in addition to the static map (both static and mobile units). So I don’t “move” anything between each simulation, I simply create a new check. The simulator then returns information for each individual check, stuff like score, damage, etc.
The simulator is is C++, so I don’t actually ever add/remove/move units in python for checking conditions, I just add them to my check and decide whether to spawn stuff based on that.