A RePast Tutorial by John T. Murphy, University of Arizona & Arizona State University (contact)
We will need to modify the space object so that we can add agents to it. We will use the same object we used to store money; however, we will put this object to different uses. We will not use it to display the agents, for example. Primarily, we want to be able to ask "Is there an agent at x,y?" This is an easy question to ask in a space object (just look in x,y and you've got the answer), but it is more difficult if the only way you've stored spatial information for the agents is by storing an x,y in each agent's instance variables- if you did that, then the only way you could answer the question "Is there an agent at x,y?" is by asking every agent "Are you at x,y?" This also allows us to prevent two agents from being in the same cell
The things we need to do are:
The last of these is the most complicated. We want to make sure that the routine will not only add the agent to the space, but will place it at a random position that is not already occupied. We also need to make sure that the agent is placed into the agentSpace object and that the agent's own x and y variables are set. To do this, we also need to create a set method for the agent object's x and y position variables.
// CarryDropModel
package demo;
import java.awt.Color;
import java.util.ArrayList;
import uchicago.src.sim.engine.Schedule;
import uchicago.src.sim.engine.SimInit;
import uchicago.src.sim.engine.SimModelImpl;
import uchicago.src.sim.gui.DisplaySurface;
import uchicago.src.sim.gui.ColorMap;
import uchicago.src.sim.gui.Value2DDisplay;
public class CarryDropModel extends SimModelImpl {
// Default Values
private static final int NUMAGENTS = 100;
private static final int WORLDXSIZE = 40;
private static final int WORLDYSIZE = 40;
private static final int TOTALMONEY = 1000;
private static final int AGENT_MIN_LIFESPAN = 30;
private static final int AGENT_MAX_LIFESPAN = 50;
private int numAgents = NUMAGENTS;
private int worldXSize = WORLDXSIZE;
private int worldYSize = WORLDYSIZE;
private int money = TOTALMONEY;
private int agentMinLifespan = AGENT_MIN_LIFESPAN;
private int agentMaxLifespan = AGENT_MAX_LIFESPAN;
private Schedule schedule;
private CarryDropSpace cdSpace;
private ArrayList agentList;
private DisplaySurface displaySurf;
public String getName(){
return "Carry And Drop";
}
public void setup(){
System.out.println("Running setup");
cdSpace = null;
agentList = new ArrayList();
if (displaySurf != null){
displaySurf.dispose();
}
displaySurf = null;
displaySurf = new DisplaySurface(this, "Carry Drop Model Window 1");
registerDisplaySurface("Carry Drop Model Window 1", displaySurf);
}
public void begin(){
buildModel();
buildSchedule();
buildDisplay();
displaySurf.display();
}
public void buildModel(){
System.out.println("Running BuildModel");
cdSpace = new CarryDropSpace(worldXSize, worldYSize);
cdSpace.spreadMoney(money);
for(int i = 0; i < numAgents; i++){
addNewAgent();
}
}
public void buildSchedule(){
System.out.println("Running BuildSchedule");
}
public void buildDisplay(){
System.out.println("Running BuildDisplay");
ColorMap map = new ColorMap();
for(int i = 1; i<16; i++){
map.mapColor(i, new Color((int)(i * 8 + 127), 0, 0));
}
map.mapColor(0, Color.white);
Value2DDisplay displayMoney =
new Value2DDisplay(cdSpace.getCurrentMoneySpace(), map);
displaySurf.addDisplayable(displayMoney, "Money");
}
private void addNewAgent(){
CarryDropAgent a = new CarryDropAgent(agentMinLifespan, agentMaxLifespan);
agentList.add(a);
}
public Schedule getSchedule(){
return schedule;
}
public String[] getInitParam(){
String[] initParams = { "NumAgents", "WorldXSize", "WorldYSize", "Money", "AgentMinLifespan", "AgentMaxLifespan"};
return initParams;
}
public int getNumAgents(){
return numAgents;
}
public void setNumAgents(int na){
numAgents = na;
}
public int getWorldXSize(){
return worldXSize;
}
public void setWorldXSize(int wxs){
worldXSize = wxs;
}
public int getWorldYSize(){
return worldYSize;
}
public void setWorldYSize(int wys){
worldYSize = wys;
}
public int getMoney() {
return money;
}
public void setMoney(int i) {
money = i;
}
public int getAgentMaxLifespan() {
return agentMaxLifespan;
}
public int getAgentMinLifespan() {
return agentMinLifespan;
}
public void setAgentMaxLifespan(int i) {
agentMaxLifespan = i;
}
public void setAgentMinLifespan(int i) {
agentMinLifespan = i;
}
public static void main(String[] args) {
SimInit init = new SimInit();
CarryDropModel model = new CarryDropModel();
init.loadModel(model, "", false);
}
}
// CarryDropAgent
package demo;
public class CarryDropAgent {
private int x;
private int y;
private int money;
private int stepsToLive;
public CarryDropAgent(int minLifespan, int maxLifespan){
x = -1;
y = -1;
money = 0;
stepsToLive =
(int)((Math.random() * (maxLifespan - minLifespan)) + minLifespan);
}
public void setXY(int newX, int newY){
x = newX;
y = newY;
}
}
// CarryDropSpace
package demo;
import uchicago.src.sim.space.Object2DGrid;
public class CarryDropSpace {
private Object2DGrid moneySpace;
private Object2DGrid agentSpace;
public CarryDropSpace(int xSize, int ySize){
moneySpace = new Object2DGrid(xSize, ySize);
agentSpace = new Object2DGrid(xSize, ySize);
for(int i = 0; i < xSize; i++){
for(int j = 0; j < ySize; j++){
moneySpace.putObjectAt(i,j,new Integer(0));
}
}
}
public void spreadMoney(int money){
// Randomly place money in moneySpace
for(int i = 0; i < money; i++){
// Choose coordinates
int x = (int)(Math.random()*(moneySpace.getSizeX()));
int y = (int)(Math.random()*(moneySpace.getSizeY()));
// Get the value of the object at those coordinates
int currentValue = getMoneyAt(x, y);
// Replace the Integer object with another one with the new value
moneySpace.putObjectAt(x,y,new Integer(currentValue + 1));
}
}
public int getMoneyAt(int x, int y){
int i;
if(moneySpace.getObjectAt(x,y)!= null){
i = ((Integer)moneySpace.getObjectAt(x,y)).intValue();
}
else{
i = 0;
}
return i;
}
public Object2DGrid getCurrentMoneySpace(){
return moneySpace;
}
public boolean isCellOccupied(int x, int y){
boolean retVal = false;
if(agentSpace.getObjectAt(x, y)!=null) retVal = true;
return retVal;
}
public boolean addAgent(CarryDropAgent agent){
boolean retVal = false;
int count = 0;
int countLimit = 10 * agentSpace.getSizeX() * agentSpace.getSizeY();
while((retVal==false) && (count < countLimit)){
int x = (int)(Math.random()*(agentSpace.getSizeX()));
int y = (int)(Math.random()*(agentSpace.getSizeY()));
if(isCellOccupied(x,y) == false){
agentSpace.putObjectAt(x,y,agent);
agent.setXY(x,y);
retVal = true;
}
count++;
}
return retVal;
}
}
Note: In the implementation presented here, the addAgent routine will return true if the agent is added, and false if not; one reason the agent might not be added is because there are no open cells left. The routine will guess up to n times, where n is ten times the number of cells, before giving up and returning false.
Next: Adding Agents to the Space
Go to Table of Contents
A RePast Tutorial by John T. Murphy, University of Arizona & Arizona State University (contact)