Designing with Stochasticity

Multi-Agent Simulation approaches problem-solving from a stochastic lens. Instead of quantitatively or numerically determining the solution to a set of equations representing a system, HASH will let you approximate messy, complex real-world systems, and empirically and statistically come to conclusions about how they behave. In order to better approximate the real world, you'll often want to initialize agents with heterogeneous properties, and ensure your behaviors properly randomize when necessary. Here are a number of ways you can incorporate stochasticity into your HASH simulations.

Distributions

Initializing agent properties using different types of distributions is a common practice in Multi-Agent models. In HASH, you can use the jStats library or the NumPy package for sampling distributions. Here's an example that uses a number of these distributions to create agents:

  • We've sampled a Poisson distribution to determine how many new birds arrive at each step.

  • We've sampled a uniform distribution to determine its x and y coordinates.

  • We've sampled a triangular distribution to determine its altitude.

  • We've sampled a normal distribution to determine its speed.

JavaScript
Python
JavaScript
function behavior(state, context) {
const { poisson, uniform, triangular, normal } = hash_stdlib.stats;
const num_new_agents = poisson.sample(10); // expected occurence rate
for (let i = 0; i < num_new_agents; i++) {
const x = uniform.sample(0, 10); // min, max
const y = uniform.sample(0, 10);
const altitude = triangular.sample(10, 10000, 500) // min, max, mode
state.addMessage("hash", "create_agent", {
"agent_name": "bird",
"position": [x, y, altitude],
"speed": normal.sample(25, 10), // mean, standard deviation
})
}
};
Python
from numpy.random import poisson, uniform, triangular, normal
def behavior(state, context):
num_new_agents = poisson(1); # expected occurence rate
for i in range(num_new_agents):
x = uniform(0, 10); # min, max
y = uniform(0, 10);
altitude = triangular(10, 50, 200) # min, mode, max
state.add_message("hash", "create_agent", {
"agent_name": "bird",
"position": [x, y, altitude],
"speed": normal(25, 10), # mean, standard deviation
})