Although Environment
s inherit Agent
methods
like Agent.set
, Agent.get
, etc. they have
a different constructor
signature.
Pass in predefined Environment
options for:
torus
— Whether the Environment
should wrap around in 2d space (with Agent
s that move off the right reappearing on the left, off the top reappearing on the bottom, etc.)width
— The width of the Environment
(used when torus = true
)height
— The height of the Environment
(used when torus = true
)An array of the renderers associated with this Environment
.
An Environment
can have multiple renderers, usually one to render
the Agent
s spatially and others for data visualization,
such as a LineChartRenderer
, Histogram
, etc.
This property will always equal the number of tick cycles that
have passed since the Environment
was created. If you call
tick
so that it goes forward multiple time steps, it will
increase the time
by that value (not by just 1
, even though
you only called tick
once).
const environment = new Environment();
environment.time; // returns 0
environment.tick();
environment.time; // returns 1
environment.tick(3);
environment.time; // returns 4
Add an Agent
to this Environment
. Once this is called,
the Agent
's environment
property
will automatically be set to this Environment
.
Whether to rebalance if there is a KDTree
(defaults to true)
Remove all agents from the environment.
Decrement a numeric piece of data associated with this Agent
(decreasing its value by 1). This method is synchronous —
it immediately decreases the value (to asynchronously decrease it,
the rule function should instead return a new value.
agent.set('x', 50);
agent.decrement('x');
agent.get('x'); // returns 49
If the second parameter n
is included, decrements by that amount.
agent.set('x', 50);
agent.decrement('x', 10);
agent.get('x'); // returns 40
If the value has not yet been set, calling this method sets it to -1
(or to -n
).
Retrieve an arbitrary piece of data associated by name.
If the data has not been set
, returns null
.
Get an agent in the environment by its ID.
Get an array of all the agents in the environment.
Retrieve all the data associated with this Agent
at once.
agent.set('x', 3);
agent.set('color', 'blue');
agent.set('active', false);
agent.getData();
// returns {
// x: 3,
// color: 'blue',
// active: false
// }
increment a numeric piece of data associated with this Agent
(increasing its value by 1). This method is synchronous —
it immediately increases the value (to asynchronously increase it,
the rule function should instead return a new value.
agent.set('x', 50);
agent.increment('x');
agent.get('x'); // returns 51
If the second parameter n
is included, decrements by that amount.
agent.set('x', 50);
agent.increment('x', 10);
agent.get('x'); // returns 60
If the value has not yet been set, calling this method sets it to 1
(or to n
).
Pass a function to cache and use the return value within the same environment tick.
The function to memoize.
The return value of the function that was passed.
Remove an agent from the environment.
Remove an agent from the environment by its ID.
Set a piece of data associated with this agent. Name should be a string while value can be any valid type. Alternatively, the first parameter can be an object, which merges the current data with the new data (adding new values and overwriting existing). Ex. agent.set('x', 5); agent.set('color', 'red');
Get an array of data associated with agents in the environment by key.
Calling environment.stat('name')
is equivalent to calling
environment.getAgents().map(agent => agent.get('name'));
By default, calling this will calculate the result at most once per time cycle, and return the cached value on subsequent calls (until the next time cycle, when it will recalculate).
The key for which to retrieve data.
Whether or not to cache the result.
Array of data associated with agent.get(key)
across all agents.
environment.addAgent(new Agent({ name: "Alice" }));
environment.addAgent(new Agent({ name: "Bob" }));
environment.addAgent(new Agent({ name: "Chaz" }));
environment.stat('name'); // returns ['Alice', 'Bob', 'Chaz']
Runs the Environment
s tick cycle. Depending on the parameters, one,
some, or all of the Agent
s in the Environment
might be activated, and all renderers associated with the
Environment
will update. After the tick cycle finishes, any rules that were enqueued will be run and the Environment
's time
property will have incremented.
environment.tick(); // ticks once
// To run multiple tick cycles, you can pass a number
environment.tick(5); // ticks 5 times
Passing a configuration object (instead of a number) allows you to have finer control over the tick cycle. The object can have the following keys:
activation
: Either "uniform"
or "random"
(defaults to "uniform"
).activation = "uniform"
— All Agent
s in the Environment
are activated with every tick cycle.activation = "random"
— One or more Agent
s are randomly selected to be activated every tick cycle (see activationCount
below).activationCount
: For "random"
activation, this many Agent
s will be activated with each tick cycle. Defaults to 1
. If activationCount
is greater than the number of Agent
s in the Environment
, then all the Agent
s will be activated exactly once in random order.count
: The number of tick cycles to run.randomizeOrder
: When activation = "uniform"
, if randomizeOrder = true
, Agent
s will be activated in random order, otherwise in the order they were added to the Environment
. This currently defaults to false
but will default to true
in v0.6.0.// Ticks three times, activating 10 random agents with each tick cycle.
environment.tick({
activation: "random",
activationCount: 10,
count: 3
});
Generated using TypeDoc
An environment provides the space and time in which Agents interact. Environments are themselves Agents, and can store data in key-value pairs that can be manipulated just like Agent data.
0.0.5