Nice... How are you storing the memories of things? You probably already know what you are doing, but may i suggest something?
I know ive said this before, but i find it easy to use and debug. You construct the memories out of a base class- one with a single ID to describe what kind it is. Then you can use small values to store the rest of the info. At most, saving the location of an object is 5 ints: the ID that it was a memory of an object, the position, and the last time it saw it. I would think for the position that you would need exact numbers, so rounding and possible some noise could save memory.
That's a pretty decent structure for memories. Push things onto a list that each agent has of stuff. The other trick you can do with this is to store world events/items one time in a separate "world knowledge" list and then have agents simply have pointers to items in that list. That way, multiple entities can refer to the same event. It saves a lot of memory space if there is going to be knowledge that could be had by numerous people.