The "Turtles" simulation Pack
Prev |  | Next

# 3. Virus

## 3.1. Synopsis

Figure 5. The green turtles are contaminated by the red ones

In this simulation, we want to simulate the transmission of a virus in a population and observe it. To do this, we have created a kind of turtle (Virus class) that can take two behaviors: infected or non infected (red and green). The all turtles just walk around and the red ones contaminate the others when cross them on a patch.

## 3.2. Virus transmission simulation

We have created two classes of Virus to simulate two ways to transmit the virus. The first way is to use real MadKit agent messages: when a red turtle cross turtles that are green, it gets their AgentAddress and sends them a VirusMessage. So if a sane turtle has its mailbox not empty, it changes of behavior and becomes a red turtle. (Just like an email virus: we can imagine another version of this simulation where a turtle might be capable of being careful when reading its mailbox.

    public String red()

      {

    	 wiggle();

    	 Turtle[] ts = turtlesHere(); //returns the other turtles that are on the same patch

    	 if (ts != null)

    		 for (int i=0; i < ts.length;i++)

    			 if (ts[i].getColor() == Color.green)

    				 sendMessage(ts[i].getAddress(),new VirusMessage());

    	 return("red");

     }

    }

    public String green()

      {

      if (nextMessage() != null) //check mailbox

      {

    	  setColor(Color.red);

    	  playRole("infected");

    	  return ("red");

      }

      else

      {

    	  wiggle();

    	  return ("green");

      }

     }

The second way (Virus2) consists in directly interact with the other turtles by changing their color to simulate the transmission. So a sane turtle always check its color and adopts the corresponding behavior: red or green.

    public String red()

      {

    	 wiggle();

    	 Turtle[] ts = turtlesHere();

    	 if (ts != null)

    		 for (int i=0; i < ts.length;i++)

    			 if (ts[i].getColor() == Color.green)

    				 ts[i].setColor(Color.red);

    	 return("red");

     }

    public String green()

      {

      if (getColor() == Color.red)

      {

    	  playRole("infected");

    	  return ("red");

      }

      else

      {

    	  wiggle();

    	  return ("green");

      }

     }

In each case, an infected turtle plays the role "infected" in order to be distinguished by the observer.

## 3.3. Observe the simulation

Figure 6. The curve looks like an exponential one

The Observer of this simulation, the VirusWatcher, just creates a TurtleTable with the role infected and displays the corresponding number using a special GUI (a madkit.lib.simulation.SimplePlotPanel) suited to draw mathematic curves.

    /** initialize the variable infectedTurtles (a Turtle[]) using getTurtleWithRole*/

    public void initializeTurtleTables()

    {

        infectedTurtles = getTurtleWithRole("infected");

    }

    /**this method overrides watch in the class Observer. So it will be invoked for each simulation step*/

     step public void watch()

    {

    	plot.addPoint(infectedTurtles.length); //plot is the GUI

    }

## 3.4. About the code

A Turtle is a real MadKit agent: it owns all the possibilities of any `AbstractAgent` of MadKit. Specially, interesting points are the usage of group, roles and `AgentAddress` concepts to structure the application logics and identify the agents.

Prev | Home | Next
Demo simulations |  | Gravity