Here is the code for controller and model. package sim.algs.alg2; /* This is the primary simulation with reproduction of each agent by a single child. age is to determine death and survival. Need to introduce Death, survival probability and colour change due to age. /* Copyright 2006 by Sean Luke and George Mason University Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ import ec.util.MersenneTwisterFast; //import sim.alg1.Agent; import sim.engine.Schedule; import sim.engine.Sequence; import sim.engine.SimState; import sim.engine.Steppable; import sim.field.grid.ObjectGrid2D; import sim.util.Bag; import java.io.FileWriter; import java.io.PrintWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Comparator; public class SimEnviro2 extends SimState { private static final long serialVersionUID = 1L; private ObjectGrid2D mySpace; public static final int gridWidth = 5; public static final int gridHeight = 6; private Bag agents; private int initNumberOfAgents = 1; public SimEnviro2(long seed) { super(new MersenneTwisterFast(seed), new Schedule()); } public void start() { super.start(); buildModel(); buildSchedule(); } public void buildModel() { mySpace = new ObjectGrid2D(gridWidth, gridHeight); agents = new Bag(); for (int i=0; i<initNumberOfAgents; i++) { agents.add(new Agent2(this)); } } public void buildSchedule() { // build a sequence that makes all the agents // replicate Sequence agentReplicateSeq = new Sequence(agents) { public void step(SimState state) { super.step(state); for (int i=0; i<steps.length; i++) ((Agent2)steps[i]).replicate(state); } }; schedule.scheduleRepeating(0,0,agentReplicateSeq); // build a sequence that makes all the agents // steps is the instance variable in a Sequence // that stores the Steppable objects } public int getgridWidth() { return gridWidth; } public int getgridHeight() { return gridHeight; } public ObjectGrid2D getMySpace() { return mySpace; } public int getInitNumberOfAgents(){ return initNumberOfAgents; } public void setInitNumberOfAgents(int initNumberOfAgents) { this.initNumberOfAgents = initNumberOfAgents; } public Bag getAgents() { return agents; } } -------------------------------------------------------------------------------------------- package sim.algs.alg2; import sim.engine.SimState; import sim.engine.Steppable; import sim.field.grid.Grid2D; import sim.field.grid.ObjectGrid2D; import sim.util.Bag; import sim.util.IntBag; import ec.util.*; /** * Created by Your PC on 14/05/2015. * Revised 15/03/2018 */ public class Agent2 implements Steppable { private static final long serialVersionUID = 1L; public MersenneTwisterFast random; private static final int Width = SimEnviro2.gridWidth; private static final int Height = SimEnviro2.gridHeight; private int myX, myY, nextX, nextY; private double age; private int counter = 1; // This constructor for offspring public Agent2(){ age = 0.0; } public Agent2(SimEnviro2 theModel) { placeFirstAgent(theModel); age = 1.0; } public void placeFirstAgent(SimEnviro2 theModel) { ObjectGrid2D mySpace = theModel.getMySpace(); // 2 options either direct placement. do { myX = 0; myY = 0; } // or randomly place agent into grid /* do { myX = theModel.random.nextInt(Width); myY = theModel.random.nextInt(Height); } */ while (mySpace.field[myX][myY] != null); mySpace.field[myX][myY] = this; } public void finish() { } public void step(SimState state) { // this would make an agent move and grow, then the // next agent move and replicate... not what we want /* move(); replicate(); */ } // Don't need this method as there is not a requirement // of random movement except for the first placement. // each subsequent placement is from the von Neumann neighbours // found by the built-in method. public void replicate(SimState state) { SimEnviro2 theModel = (SimEnviro2) state; Bag theAgents = theModel.getAgents(); ObjectGrid2D mySpace = theModel.getMySpace(); // int newX, newY; int hop = 8; Bag result = new Bag(); IntBag xNeighbors = new IntBag(); IntBag yNeighbors = new IntBag(); // mySpace.getVonNeumannNeighbors(myX, myY, hop, Grid2D.BOUNDED, false, null, xNeighbors, yNeighbors); mySpace.getVonNeumannNeighbors(myX, myY, hop, Grid2D.BOUNDED, false, result, xNeighbors, yNeighbors); int len = xNeighbors.size(); int loc = result.size(); /* int j; for ( j = 0; j < len-3; j++) { System.out.println(" Bag size " + len);} /* System.out.print(" x = " + xNeighbors.get(j)); System.out.println(" : y = " + yNeighbors.get(j)); *//* System.out.print(" myX = " + myX); System.out.println(" : myY = " + myY); */ for (int i=0; i<len; i++) { Agent2 child = new Agent2(); int total = ( Width * Height ); if (len == loc) { state.finish(); } nextX = mySpace.tx(xNeighbors.get(i)); nextY = mySpace.tx(yNeighbors.get(i)); if (mySpace.field[nextX][nextY]== null) { // System.out.print(" nextX = " + nextX); // System.out.println(" : NextY = " + nextY); System.out.println(" : counter = " + counter); mySpace.field[nextX][nextY] = child; child.myX = nextX; child.myY = nextY; theAgents.add(child); // System.out.println("Final :" + ((total - counter) - 1)); counter++; break; } } myX = nextX; myY = nextY; if ( counter == ( Width * Height )) { state.finish(); } } }