Open sholloway opened 2 years ago
Example Time Scales | Example | Real Time (mins) | Simulation Time | Notes |
---|---|---|---|---|
Minecraft | 20 | 1 day | Minecraft is 72x faster than real life. 1440 minutes in a day/20 FPS = 72 | |
Sims 4 | 24 minutes | 1 day | Sim Rules Sims uses 1 s = 1 minute 1 Sim Year is only 22 Simulation Days Winter and Spring are 5 sim days each. Summer and Fall are 6 days each. Sims has three speeds: Normal, Fast, Ultra Time is shortened for children and teens. Each has two weeks of simulation time. | |
RDR2/GTA V | 48 | 1 day | ||
Elden Ring | 60 | 1 day | ||
Fallout 4 | 72 | 1 day | 1 s in real life is 20 secs in the sim. |
Emotions begin in the body, influenced by environmental stimuli. The brain responds to low-level perceptions, which translate into persistent characteristics (e.g. fear). These emotions can potentially become visible via behaviors (e.g. crying, laughing, running away).
There is a chain of concepts: Stimuli -> Sensations -> Emotion -> (Moods | Feelings/Beliefs) | Behavior
Stimuli are produced by things in the agent's environment. The things in the town that can stimulate an agent are composed of two categories (locations, other agents).
Schools: Factory: Churches Dinner Fancy Restaurant Food Truck Coffee Bar Bar Bowling Ally Movie Theater Roller Rink Park Town Square City Hall Grocery/Supply Store Cemetery Homes (houses/apartments) Court Jail Prison
A sensation is an immediate reaction to an agent's current status. Sensations can be caused by stimuli or by cognitive activity (i.e. thinking).
Sensations Table
An emotion is a lasting characteristic of an agent's state. Emotions are initiated by sensations. Each primary emotions may have a variable intensity (e.g. fear). The various degrees of a primary emotion are called secondary emotions.
Fear Secondary Emotions Example | Fear Amount | Secondary Emotion |
---|---|---|
0.1 | Caution | |
0.2 | Caution | |
0.3 | Worry | |
0.4 | Worry | |
0.5 | Anxiety | |
0.6 | Anxiety | |
0.7 | Dread | |
0.8 | Panic | |
0.9 | Horror | |
0.10 | Terror |
An agent could have an irrational fear of something (i.e phobia) that invokes a higher fear response than other agents.
Primary emotions may also be defined such that two of them may not be present at the same time. These pairs are called complementary emotions.
A mood is a complete set of emotions that constitutes someone's mental state at a particular time.
A mood is represented as a set of primary emotions, each with their degree of secondary emotion. The combination of the primary emotions produce complex emotions (e.g. love, optimism, depression)
A feeling is a persistent association of an emotion with a class of object (e.g. food, house, institution, location, another agent, a concept). They can be expressed about the past or future. They do not rely on the current agent's state.
Examples: pity, love, hatred, affection Look at this list.
How the agent sees their world. This applies to their own sense of self ( I am a good person), how they see others, their political leanings, and religious practices.
tbd
One thought is to leverage D&D as a template for thinking through generating characters. The D&D rule set is available as a free PDF.
For example, in a simulation run a history might be:
24 babies born
17 deaths
12 High School Graduates
3 HS drop outs
5 mariages
4 divorces
3 people jailed
7 incarcerated in prison
The average attendance for each church
The average time people call in sick to the factory.
An individual history could also be enable with the log of the agent's actions.
An agent's lineage and social network could also be maintained and reported.
Have a master task that only runs that bootstraps the simulation generation. This might look something like the following.
def populate_town(context) -> None:
simulation = context.scene.simulation
# Generate the population of agents.
# Initially create the base characteristics of each agent individually.
# The parameters should ideally all be in the TOML file.
general_population = create_agents(
simulation.total_pop_size,
simulation.gender_distribution,
simulation.faith_distribution,
simulation.political_distribution,
simulation.age_range,
simulation.life_span_range,
simulation.attraction_distribution,
simulation.education_distribution,
simulation.financial_status_distribution,
additional personality traits...
)
# Who is in relationships (friends, dating, co-habitating, married, divorced).
# Matching Challenge
establish_initial_relationships(general_population)
# Assign jobs, academic status, job status.
assign_initial_roles(general_population)
# Based on relationships, financial status, and roles, assign a house to each agent.
# Packing problem
assign_housing(general_population)
The various locations are connected via streets/walkways. Agents go from one location to another by traversing the streets. This is done in real-time.
The agent traversal algorithm is going to need to focus on segments. The render is going to care about the streets.
An adjacency list can be used to internally store a bi-directional graph of junctions.
segment_graph: dict[junction, list[junction]
segment_graph[a] = [b]
segment[b] = [a, c, d]
In the TOML file it may be simpler to just define the street network twice. The simplified street network, and the invisible more detailed junction network.
# Streets are long and just define their start and end points since they're all linear.
# They are rendered in the simulation.
[scene.entities]
streets = [
# The N/S highway that connects all of the E/W streets
{'interstate': [a, b,...], label='Interstate', start_loc = [14, 22], end_loc = [415, 22]}
{'main_street': [a, b,...], label='Main Street', start_loc = [14, 22], end_loc = [415, 22]}
]
# A directed graph is used for a navigation mesh.
# Nodes in the navigation graph are called junctions.
# A junction can be associated with a location.
[scene.entities]
junctions = [
{ id = 1, cell=[14, 12], location_id=1, description='The Factory'},
{ id = 2, cell=[10, 12]}
]
# An adjacency list of junctions.
segments = {
1 : [2]
2: [1]
}
One thought is to lay the streets out, and then generate a navigation mesh dynamically based on the intersection of the buildings and streets. The basic idea is that we'd extend the navigation concept from the mazes. So each cell could potential be a room with four walls. The A* algorithm would traverse the network of cells to devise the path an agent takes.
I want to leverage utility theory to a degree in the Agent's cognitive model.
Consider prospect theory and loss aversion in this model. Look at the model of prospect theory for an example of how to implement this.
Todo
Zoom(Not possible with DearPyGUI)In the GDC talk Emergent Storytelling Techniques in the Sims by Matt Brown the speaker demonstrates a demo that they made of a bunch of green boxes living in homes. Each agent is given a simulated backstory. You can click on an agent and see it's history. For example:
This is the type of thing I'd like to try building.
Thoughts
Goals Learn how to implement AI techniques that deal with autonomous agents. Specifically:
Our Town
The town was founded 100 years ago when a wealthy man built a factory to produce shoes. Over time a small town grew up around the factory. There is now a main street with restaurants and entertainment options. Religious institutions for community and faith. A park for exercise and relaxation. An educational system and justice system.
Town Locations
What can happen in an Agent's life?
An Agent
UI