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