Skip to content
Pedro Andrade edited this page Jul 18, 2017 · 25 revisions

Modeling Paradigms in TerraME

This tutorial is an updated version of the original tutorial described in Andrade et al. (2015). It works with TerraME version 2.0.0-RC4 or greater.

Summary

Introduction

A model is generally understood as a purposeful and simplified representation of some system or any other aspect of the real world (Starfield et al., 1993). There are many types of models, including, among others, verbal, mathematical, and graphical representations. Building models is a well-known way of improving our understanding of the world. Computational simulation is a particular type of model. Unlike mathematical models, simulations are run rather than solved. Therefore, by overcoming many limitations imposed by mathematical tractability, simulation models allow researchers to address issues that require less simplified representations of the world (Railsback, Grimm, 2011). Such models introduce new possibilities to investigate coupled natural and human systems, including the ability of simulating the emergence of complex behaviors from relatively simple activities.

There are different world views, also called paradigms, to develop computational models for coupled natural and human systems. The system under study is then represented with the definitions available for that paradigm. The modeler needs to take into account the advantages and the limitations of the available paradigms in order to choose one that best addresses the problem under study. This tutorial explores three modeling paradigms: Systems dynamics, Cellular automata, and Agent-based modeling, which are presented as follows.

System Dynamics

System dynamics is the most basic paradigm upon which all others are based. This paradigm starts from the assumption that a system under study can be isolated from the rest of the world. In this sense, we would have only linear dynamics between the system and the rest of the world. If the dynamics is not linear, it would need to be simplified to a linear dynamics or to be included in the model.

This paradigm views the world as a set of stocks and flows, assuming that everything that can be measured can also be modelled (Ford, 1999). Stocks can be anything, from the area covered by a lake to the number of individuals that have a given disease, from the amount of carbon stored in the atmosphere to the fat of a body. Flows describe mathematically how to transform or move stocks, making the system dynamic. They can connect two stocks, a stock with itself, or a stock with the external world, being always directed (Angerhofer and Angelides, 2000). One or more flows can build a feedback loop that allows the system to present complex behavior. A model of System dynamics usually has two or more feedbacks that compete with each other to control the simulation.

Using System dynamics models, it is possible to work with what-if scenarios to investigate the behavior of the system according to changes in its inputs or even changes in its internal behavior (Stave, 2003; Meadows et al., 1972). These scenarios might be developed from scratch, can be result of proposed public policies (Stave, 2002; Ghaarzadegan et al., 2011), or based on outcomes of other models such as the ones developed by IPCC (Field et al., 2014). One important property these scenarios can investigate is whether the system is capable of adapting itself to exogenous changes, keeping its internal state stable. This property is called homeostasis.

The main disadvantage of this paradigm comes from its simplicity in representing the world as stocks. Individuals have to be aggregated in quantities, percentages, or averages. Space is constrained to measures of volume or area, with everything distributed homogeneously within the study area. The connections between stocks cannot change along the simulation. These constraints can be feasible in some studies, but they might become too much restricting if the spatial distribution of stocks is important to the problem under study, of when individuals need to take their own decisions autonomously. These constraints are relaxed by the next paradigms.

Cellular Automata

The Cellular automata (CA) paradigm views the world as a space with a finite set of two-dimensional discrete and contiguous cells (Von Neumann, 1966). Each cell has a homogeneous internal con- tent, which includes zero or more stocks and an internal state machine, called automaton. The simulation then runs as a sequence of discrete steps. In each step, the automaton state changes according to transition rules, defined based on its own state and the state of its neighbors. These changes occur in parallel in space, which means that, when a cell changes its state in a given time step, this change cannot cause any effect in the decision of the other cells in the same time step.

The Neighborhood is an important concept for CA, since it determines the interaction between the elements that build up the model (Hagoort et al., 2008). If two cells are neighbors, it means that one exerts some sort of influence over the state of the other. Depending on the process being modelled, the neighborhood can be homogeneous or heterogeneous in space. Examples of homogeneous neighborhoods are the well-established von Neumann and Moore Neighborhoods. However, in some cases, these neighborhoods are not enough to represent the complexities of the spatial relations, which may demand, for example, the definition of neighborhoods that include transportation networks.

This paradigm has become increasingly popular among environmental modelers because of its ability to simulate complex spatial patterns that emerge from simple parallel local interactions between neighboring cells (Couclelis, 2000; Wolfram, 1984). In addition, due to its explicit spatial representation, it has a direct compatibility with geospatial representations of the world used by Geographic Information Systems (GIS). During the last decades, it has been widely used in the studies of phisical processes (Hesselbarth and Gobel, 1991) and social process, like urban dynamics (Batty and Xie, 1994; Batty, 2007; Clarke and Gaydos, 1998) and epidemiology (Medeiros et al., 2011; Slimi et al., 2009).

Despite its ability to simulate the emergence of complex spatial patterns from simple local rules, the main disadvantage of this paradigm comes from the impossibility of representing mobile objects, once the cells are fixed in space. Models that use CA to study human behavior need to anthropomorphise the state variables of a cell, simulating human behavior as a physical processes. However, these adaptations might not be enough to represent the complexity of human behaviour.

Agent-based Modeling

The Agent-based modeling (ABM) paradigm views the world as multiple autonomous agents interacting within an environment. Agents can be understood as entities "situated within and a part of an environment, that senses that environment and acts on it, over time, in pursuit of its own agenda" (Franklin and Graesser, 1997). This definition emphasizes agent’s features that have been conventionally identified as important: autonomy, social ability, reactivity, and proactivity (Wooldridge and Jennings, 1995). First, like CA, agents are autonomous. They are a separate locus of control, fully responsible for their actions and in charge of accomplishing their role. Although centralized authorities may exist as environmental constraints, there is no global or external flux of control dictating the agent’s actions. This self-organization of autonomous agents is what promotes the emergence of global patterns from the bottom-up (Macy and Willer, 2002). Second, agents have social ability and are able to interact with each other. Third, agents are reactive and capable of responding to stimuli coming from their environment. Finally, agents are proactive, which means that they exhibit goal-directed behavior by taking their own initiative (Wooldridge and Jennings, 1995; Zamboneli et al., 2001).

The environment defines a space in which agents operate, serving as a support to their actions. The meaning and role of an environment depends on the system that is being modeled. In some situations, it may be neutral, with minimal or no effect on the agents or, in analogy to the real world, the environment may have an active role in providing the context for agents to perform their actions, to acquire information about the problem they have to solve, and to communicate with each other (Gilbert, 2008; Weyns, Schumacher et al., 2005). In the latter case, the environment can be specified as an independent piece of software, such as CA, that encapsulates its own roles, including particular characteristics and dynamics that directly influence the agent's behavior and the emergence of complex structures (Gilbert, 2008; Weyns et al., 2005).

Interactions are also fundamental for an ABM, as they represent the main feature that distinguishes ABM from other paradigms. The agents’ potential to locally interact with each other and their environment is the key to the simulation of the emergent properties of complex systems (Axelrod, 2003; Holland, 1998). For this reason, all ABM include some sort of interaction that involves transmission of knowledge or materials that can affect the behavior of the recipients (Gilbert, 2004). The nature and sophistication level of these interactions may vary substantially depending on the roles assumed by the agents in a simulated system. In some cases, agents interact by simply perceiving the presence of their pairs in the surroundings, while other situations demand interactions based on the development and use of complicated communication means (Gilbert, 2008; Zambonelli et al., 2001). In general, ABM can present direct agent-agent interactions, indirect agent-agent interactions, and agent-environment interactions.

The agent-based modeling paradigm separates the spatial representation from the individuals that take decision, which makes it more complex than the other two paradigms. It means that this paradigm is particularly powerful for representing the complexity of coupled natural and human systems, but also more challenging and time consuming in terms of development.

A Small Tutorial

This section presents a short tutorial based on the course introduced in last section. We describe one model for each of the three modeling paradigms, implement them in TerraME, and investigate their outcomes.

Water in the Tub

The first model of this tutorial was initially proposed by Meadows (2008). It is called water in the tub. This very simple model uses System Dynamics to describe how water flows out of a tub. Initially the tub is filled with 40 gallons of water. During the simulation, water flows out of the tub at a constant rate of 5 gallons per second. The idea is to implement a model to simulate the amount of water in the tub over time. In TerraME, a stock is described as a variable within a Model. The code below shows a declaration of a Model named Tub in TerraME with three attributes: water, flow, and finalTime. Note that the source code does not represent units of measurement explicitly. It is up to the modeler to define that a given stock is measured as gallons, liters, or any other unit, using or converting it accordingly when defining flows. In the case of Tub, water and flow are measured in gallons, while finalTime is measured in seconds.

Tub = Model{
    water = 40,
    flow = 5,
    finalTime = 8,

Next we need to describe how the simulation changes stocks in each time step. It simply reduces the amount of water in the tub according to flow. This function takes the model itself as argument and uses the operator . to access its variables.

    execute = function(model)
        model.water = model.water - model.flow
    end,

We need now to indicate how the stock will be observed along the simulation. TerraME has a concept of Chart to plot the attributes along the simulation. We then select attribute "water" of the model to be visualized.

    init = function(model)
        model.chart = Chart{
            target = model,
            select = "water"
        }

The last concepts needed in this model are Event and Timer. Event is a time instant when the simulation engine executes operations. It contains a function named action that describes part of the behavior of the Model. Timer is a type that registers, manages, and executes a set of Events over time. It manages an Event queue ordered according to their priorities and timestamps. We create two Events: one to execute the model and the other to update model.chart.

        model.timer = Timer{
            Event{action = model},
            Event{action = model.chart}
        }
    end -- init()
} -- Tub

To run the simulation we can just call:

Tub:run()

Figure below shows the output of a simulation. In the end, the amount of water in the tub is zero as five gallons of water are removed from the tub each time step.

Note that, if we run the model until a time greater than eight, the simulation would produce a physically inconsistent output. As it keeps removing water out of the tub, the simulation will produce negative amounts of water. Therefore, this Model is correct as long as we simulate it to a time equal or less than the initial amount of water divided by the flow. Semantic problems such as this one are always up to the modeler, as the toolkit cannot identify them.

instance = Tub{
    finalTime = 12
}

instance:run()

Executing the water in the tub gives the impression that time is continuous, as th Chart plots a line. However, in TerraME events are executed in discrete time steps. The default periodicity of each Event is one, therefore it removes five gallons of water from the tub at once in each time step. We can see this clearly if we reduce the observation event to a period of 0.1, which means that it will occur ten times before water is taken out from the tub. Code below describes the new Timer.

        model.timer = Timer{
            Event{action = model},
            Event{action = model.chart, period = 0.1}
        }

This new implementation has the same simple behavior of the previous one, but it has a different outcome, as shown in Figure below. Instead of having a straight line that could be thought as a continuous simulation, now we have what really happens in the simulation. As the observation time is more frequent than the behavior of the model, it will observe a couple of times the same amount of water before it flows out from the tub. This is a property of discrete event simulators that needs to be taken into account when developing any model. Each model has a temporal scale that should be defined a priori. In theoretical models it is possible to reduce the time scale by reducing the frequency of the events and the amount of flows. Models that use data usually have their temporal scale constrained by the frequency of data acquisition. In any case, one should never observe the model more frequently than it changes because it will not produce any new output.

By using the idea of a system composed by stocks and flows, it is possible to develop models that can produce complex behaviors. Flows can connect different stocks as well as a stock to itself to generate feedback loops, which is the main source of complexity in systems. TerraME also has other functionalities to deal with system dynamics such as events that have different initial times and observation of different attributes of a cell at the same time.

More examples related to System Dynamics in TerraME can be found in package sysdyn.

Fire in the forest

The second example simulates fire in a forest using CA paradigm. The simulation starts with a small fire in one random cell of a forest completely filled with trees. The fire then propagates to the neighboring forest cells on and on until all the forest is completely burned. To represent this process with a CA we need to have three states: forest, burning, and burned. A forest cell will remain in this state until it finds a burning neighbor. A burning cell will become burned in the next time step, while a burned cell will not change its state anymore.

The implementation of the model starts with a definition of a Model, as presented below. Fire has two parameters, dim, representing the size in x and y dimensions, and finalTime, indicating the final simulation time.

Fire = Model{
    finalTime = 50,
    dim = 50,

Function init must then initialize a Cell that describes the attributes and functions of each spatial partition. Each Cell will initially have an attribute called state with value "forest". It also has an execute function to describe the behavior of the Cell in each time step, implementing the transition rules of the automaton. In this function, the Cell verifies its internal state. In the case of being "forest", it needs to check whether any neighbor is "burning". It uses a second order function called forEachNeighbor to transverse its Neighborhood. A second order function is a function that takes another function as argument. This function takes a neighbor Cell as argument and is called for each of its neighbors. If any of the neighbor cells has a burning state then the Cell also becomes "burning". Otherwise, if the state of the Cell is burning then it becomes "burned". If the state is "burned" it will not change, therefore this situation is not described in the source code.

    init = function(model)
        model.cell = Cell{
            state = "forest",
            execute = function(self)
                if self.past.state == "burning" then
                    self.state = "burned"
                elseif self.past.state == "forest" then
                    forEachNeighbor(self, function(neigh)
                        if neigh.past.state == "burning" then
                            self.state = "burning"
                        end
                    end)
                end
            end
        }

An important point in the description of execute is the attribute past. In a CA, the process takes place in parallel in space. In this sense, the changes in the state of the a Cell cannot affect the state of another Cell in the same time step. Because of this, we need to work with two copies of the cells, one storing the present state and the other storing the past state. TerraME allows cells to have the attribute named past with the attributes of the Cell in the previous time step. The methodology to implement a CA is then to read only from the past and write into the present. Therefore, every line that has an if uses past, while the lines that update states do not.

The next step to implement the model is to define the whole space. In TerraME, we use a CellularSpace to represent the forest. It is a set of cells representing a spatial region under study, created from a Cell and a description of its x and y dimensions, as shown in the code below. In the code, world is a CellularSpace with 2,500 cells initially with state forest. Any CellularSpace can have a Neighborhood, a set of cells defining the proximity relations of a given Cell. The CellularSpace will have a von Neumann Neighborhood, connecting each Cell to its four touching neighbors. The final step to build the initial state of the forest is to initialize one random Cell with burning state to start the fire, as shown in the last line.

        model.cs = CellularSpace{
            xdim = model.dim,
            instance = model.cell,
        }

        model.cs:createNeighborhood{strategy = "vonneumann"}
        model.cs:sample().state = "burning"

To plot the amount of cells in each state, we need to create a Chart. We can select attribute state and plot some of its values ("forest", "burning", and "burned", in the code below). To visualize the spatial distribution of cells, we need to define a Map. In both Chart and Map we will paint "forest" as green, "burning" as red, and "burned" as brown.

        model.chart = Chart{
            target = model.cs,
            select = "state",
            value = {"forest", "burning", "burned"},
            color = {"green", "red", "brown"}
        }

        model.map = Map{
            target = model.cs,
            select = "state",
            value = {"forest", "burning", "burned"},
            color = {"green", "red", "brown"}
        }

Finally, we need to define a Timer with three Events to simulate the model. The first one synchronizes the CellularSpace, copying the current attribute values to the past, and then calls execute for each of its Cells to spread the fire. The second one updates the Chart and the third one updates the Map.

        model.timer = Timer{
            Event{action = model.cs},
            Event{action = model.chart},
            Event{action = model.map}
        }
    end -- init()
} -- Fire

Fire:run()

Figure below shows the output of a simulation. On the top there is a Chart with the amount of Cells in each state. In the bottom there are three images. On the left, the image describes the beginning of the simulation, when there is only one burning Cell. As it is chosen randomly, different simulations will start with a different burning Cell. In the middle, we have the simulation after ten time steps, where the burning cells produce a square with burned cells inside. The square grows symmetrically in the four directions based on the initial burning Cell. In the right, we have the final state of the simulation. Note that executing the simulation until time 50 will not be enough to burn all the cells. If we simulate a couple more steps, the forest will still burn, but as we configured the simulation to stop in time 50 this was the final state. As the Cellularspace has 50x50 cells, the simulation will never burn all the cells in 50 steps, even if the fire starts in one of the four cells in the middle of the CellularSpace. To guarantee that all the cells will be burned we would need to run the simulation with at least 99 steps.

CA is useful when one wants to model continuous processes that take place in a given region under study. It is used to study environmental processes such as hydrology, vegetation dynamics, as well as human processes, such as deforestation or urban growth. TerraME also has functionalities to model complex CA. Some of them are database interface, creating cellular spaces stored in external sources, visualization of different attributes at the same time, and strategies to create complex neighbourhoods.

More examples related to Cellular Automata in TerraME can be found in package ca.

Population growth

In the last model of this tutorial we investigate a model of population growth that explicitly represents individuals through an agent-based model. In this model, agents can move freely in space and reproduce. The idea is to see how one can describe an agent-based model and investigate whether a very simple model can produce an emergent behaviour. This model has three parameters: quantity, representing the amount of agents in the beginning of the simulation, dim, describing the spatial dimensions, and finalTime.

GrowingSociety = Model{
    quantity = 10,
    dim = 100,
    finalTime = 120,

The central concept in TerraME to work with ABM is the idea of Agent. It is an autonomous individual that can have a set of attributes, relations with other agents as well as with spatial partitions, and autonomy to take decisions. The Agent in the population growth model has a single function execute that describes its behavior, as shown in the code below. First, it selects a random empty Cell from the neighborhood using emptyNeighbor(). This function returns nil if there is no empty neighbor. If there is an empty neighbor, then with 30% of probability it reproduces and puts its child there. To implement this we use a sample() over a Random using a probability p of 0.3. After that, the Agent tries to get a random neighbor Cell to move, leaving the previous Cell empty. Note that if the Agent is fully surrounded by other agents it cannot take any action.

    init = function(model)
        model.agent = Agent{
            execute = function(self)
				local cell = self:emptyNeighbor()
                if cell and Random{p = 0.3}:sample() then
                    local child = self:reproduce()
                    child:move(cell)
                end

                cell = self:emptyNeighbor()
                if cell then
                    self:move(cell)
                end
            end
        }

The next step of the population growth model is to define a Society of agents. It is a set of agents with the same general behavior and attributes. This Society will have ten agents and an instance describing the overall behavior of its agents, which is the Agent that we have just defined. Every time an Agent inside a Society reproduces, the newborn will be automatically added to the same Society of its parent.

        model.soc = Society{
            instance = model.agent,
            quantity = model.quantity
        }

The ten agents will be placed in a 100x100 CellularSpace with a Moore neighborhood, connecting a Cell to its eight surrounding cells. The CellularSpace also has an instance, which is a Cell with a function called state. It returns "full" if there is an Agent inside of it. Otherwise it returns "empty". This function will be used to create a Map.

        model.cell = Cell{
            state = function(self)
                if self:isEmpty() then
                    return "empty"
                else
                    return "full"
                end
            end
        }

        model.cs = CellularSpace{
            xdim = model.dim,
            instance = model.cell
        }

        model.cs:createNeighborhood()

To connect the agents to the cells we need an Environment, which aggregates space and behavior. In this model, we will create a random placement of agents with at most one Agent per Cell, as shown in the code below.

        model.env = Environment{
            model.cs,
            model.soc
        }

        model.env:createPlacement()

Before running the simulation we need to define a Map and a Chart, one to see the spatial distribution of agents and the other to see the amount of agents, respectively. When a Map observes a function instead of a value, it shows the output of the function in each Cell . A Chart over a Society as default observes the number of agents along the simulation.

        model.map = Map{
            target = model.cs,
            select = "state",
            value = {"full", "empty"},
            color = {"black", "white"}
        }

        model.chart = Chart{
            target = model.soc
        }

Then we declare a Timer to execute the Society. When the action of an Event is a Society, it executes all its agents. We also need two events to update map and chart.

        model.timer = Timer{
            Event{action = model.soc},
            Event{action = model.map},
            Event{action = model.chart}
        }
    end -- init()
} -- GrowingSociety

GrowingSociety:run()

The evolution of the simulation is quite simple, with the spatial distribution of agents along the simulation shown below. As agents can move randomly, there is always a heterogeneous distribution of agents around the areas where the first agents were placed in the beginning of the simulation. We can see that if we simulate for more a couple of time steps the population will fill all available cells, reaching a stable state where nobody can reproduce or move.

Although very simple, this model generates an emergent behavior. Figure below summarizes the amount of agents along the simulation. We can see that the population grows according to a logistic curve. In the beginning, it has an exponential growth until around time 40 as there are no spatial constraints. As the model evolves, it becomes more and more difficult to reproduce because the neighborhood is full or because the border of the CellularSpace was reached, until the population reach the stable state. Note that this constraint is not explicitly represented in the model, but it emerges from the individual decisions of the agents along the simulation.

This model is non-deterministic, which means that every time it is simulated it will produce a different outcome. In this situation, it is always interesting to repeat the simulation and perform statistical analysis about the stability of the results. Despite its randomness, running this model different times will produce similar outcomes.

Agent-based modeling has no limits in terms of what can be represented. Agents can be any autonomous decision making entity. They can have a complex internal representation, message passing strategies, belong to social networks, and have multiple placements, among other capabilities. TerraME has functionalities to deal with all these challenges.

More examples related to Agent-Based Modeling in TerraME can be found in package logo.

References

Andrade, P. R., Camara, G., Maretto, R. V., Monteiro, A. M. V., Carneiro, T. G. S., Feitosa, F. F. (2015) Experiences with a Socio-Environmental Modeling Course. Modelling in Science, Education and Learning Volume 8(1), 2015 doi: 10.4995/msel.2015.2811.

Angerhofer, B. J., Angelides, M. C. (2000). System dynamics modelling in supply chain management: 456 research review. Simulation conference, 2000. Proceedings. Winter (Vol. 1, pp. 342-351).

Axelrod, R. (2003). Advancing the art of simulation in the social sciences. Japanese Journal for Management Information System, 12(3), 3–16.

Batty, M. (2007). Cities and complexity: understanding cities with cellular automata, agent-based models, and fractals. The MIT press.

Batty, M., Xie, Y. (1994). From cells to cities. Environment and planning B, 21(7), 31–48.

Clarke, K. C., Gaydos, L. J. (1998). Loose-coupling a cellular automaton model and gis: long-term urban growth prediction for san francisco and washington/baltimore. International Journal of Geographical Information Science, 12(7), 699–714.

Couclelis, H. (2000). Modeling frameworks, paradigms, and approaches. Geographic information systems and environmental modeling, 36–50.

Field, C., Barros, V., Dokken, D., et al. (2014). Climate change 2014: impacts, adaptation, and vulnerability. Volume I: Global and Sectoral Aspects. Contribution of Working Group II to the Fifth Assessment Report of the Intergovernmental Panel on Climate Change. Available from http://ipcc-wg2.gov/AR5/

Ford, F. A. (1999). Modeling the environment: an introduction to system dynamics models of environmental systems. Island Press.

Franklin, S., Graesser, A. (1997). Is it an agent, or just a program?: A taxonomy for autonomous agents. In J. Muller, M. Wooldridge, N. Jennings (Eds.), Intelligent agents III: agent theories, architectures, 4 and languages (Vol. 1193, pp. 21–35). Springer Berlin Heidelberg. Available from http://dx.doi.org/10.1007/BFb0013570

Gilbert, N. (2004). Agent-based social simulation: dealing with complexity. The Complex Systems Network of Excellence, 9(25), 1–14.

Gilbert, N. (2008). Agent-based models. London: Sage Publications.

Hagoort, M., Geertman, S., Ottens, H. (2008). Spatial externalities, neighbourhood rules and ca land-use modelling. The Annals of Regional Science, 42(1), 39–56.

Hesselbarth, H. W., Gobel, I. R. (1991). Simulation of recrystallization by cellular automata. Acta Metallurgica et Materialia, 39(9), 2135–2143. Available from http://www.sciencedirect.com/science/ article/pii/0956715191901832

Holland, J. H. (1998). Emergence: from chaos to order. Oxford University Press.

Macy, M. W., Willer, R. (2002). From factors to actors: Computational sociology and agent-based modeling. Annual Review of Sociology, 28, 143–166. Available from http://www.jstor.org/stable/3069238

Meadows, D. H. (2008). Thinking in systems: A primer. Chelsea Green Publishing.

Meadows, D. H., Meadows, D., Randers, J., Behrens III, W. W. (1972). The limits to growth: A report for the club of rome’s project on the predicament of mankind. New York: Universe.

Medeiros, L. C. d. C., Castilho, C. A. R., Braga, C., Souza, W. V., Regis, L., Monteiro, A. M. V. (2011). Modeling the dynamic transmission of dengue fever: investigating disease persistence. PLOS neglected tropical diseases, 5(1), e942.

Railsback, S., Grimm, V. (2011). Agent-based and individual-based modeling: A practical introduction. Princeton University Press. Available from http://books.google.com.br/books?id=VQOjinaRG9cC

Slimi, R., El Yacoubi, S., Dumonteil, E., Gourbiere, S. (2009). A cellular automata model for chagas disease. Applied Mathematical Modelling, 33(2), 1072–1085. Available from http://www.sciencedirect.com/ science/article/pii/S0307904X07003563

Starfield, A. M., Smith, K., Bleloch, A. L. (1993). How to model it: Problem solving for the computer age. New York, NY, USA: McGraw-Hill, Inc.

Stave, K. A. (2002). Using system dynamics to improve public participation in environmental decisions. System Dynamics Review, 18(2), 139–167. Available from http://dx.doi.org/10.1002/sdr.237

Stave, K. A. (2003). A system dynamics model to facilitate public understanding of water management options in Las Vegas, Nevada. Journal of Environmental Management, 67(4), 303–313. Available from http://www.sciencedirect.com/science/article/pii/S0301479702002050

Von Neumann, J. (1966). Theory of self-reproducing automata. Burks, A.W. (Ed.).

Weyns, D., Schumacher, M., Ricci, A., Viroli, M., Holvoet, T. (2005). Environments in multiagent systems. The Knowledge Engineering Review, 20(2), 127–141.

Wolfram, S. (1984). Cellular automata as models of complexity. Nature, 311(4), 419–24.

Wooldridge, M., Jennings, N. R. (1995). Intelligent agents: Theory and practice. The knowledge engineering review, 10(02), 115–152.

Zambonelli, F., Jennings, N. R., Wooldridge, M. (2001). Organisational abstractions for the analysis and design of multi-agent systems. In Agent-oriented software engineering (pp. 235–251).