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.