CoopNetBlue.java
From Santa Fe Institute Events Wiki
/*
* CoopNetBlue.java * * Created on January 22, 2005, 6:11 PM * Modified June 14, 2006 by Jack */
package CoopNetBlue; import java.awt.Color; import java.util.ArrayList; import java.util.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import uchicago.src.sim.engine.BasicAction; import uchicago.src.sim.engine.Schedule; //import uchicago.src.sim.engine.SimModelImpl; //import uchicago.src.sim.gui.DisplaySurface; //import uchicago.src.sim.gui.Network2DDisplay; import uchicago.src.sim.gui.OvalNetworkItem; //import uchicago.src.sim.network.NetworkFactory; //import uchicago.src.sim.network.NetworkRecorder; //import uchicago.src.sim.network.Node; //import uchicago.src.sim.util.Random; import uchicago.src.sim.util.SimUtilities; //import uchicago.src.sim.network.DefaultDrawableNode; //import uchicago.src.sim.network.DefaultDrawableEdge; //import uchicago.src.sim.gui.CircularGraphLayout; //import uchicago.src.sim.gui.KamadaGraphLayout; //import uchicago.src.sim.gui.AbstractGraphLayout; //import uchicago.src.sim.space.Object2DGrid; //import uchicago.src.sim.gui.Object2DDisplay; import uchicago.src.sim.util.*;
import uchicago.src.sim.network.NetUtilities;
/**
* * @author Jack Waddell */
public class CoopNetBlue extends ModelParameters{
// model variables public int numAgents = 16; public ArrayList agentList = new ArrayList (numAgents); public int worldXSize = 400; public int worldYSize = 400;
public Schedule schedule; // Schedules Events public GameMaster gm; // Runs the games // The P parameter for regular lattice -> small world rewiring // Also used as the probability in the random network public double reconnectProb;
// the connection radius of the regular lattice public int connectRadius;
// selects which network type to use in Network.java public int netType;
// Stores how frequently, in units of time steps, to update... public int updateInterval; // The report file public int pajekUpdateInterval; // The pajek files public int evolveUpdateInterval; // The evolution of the net
Network net; // The network class // The following class performs calculations on the network NetUtilities netCalculator = new NetUtilities();
/** Creates a new instance of CoopNetBlue */
public CoopNetBlue() {
}
/////////////////////////////////////////////////
// begin
// builds model-required elements
public void begin () {
buildModel ();
buildSchedule ();
}
///////////////////////////////////////////////////////
// addModelSpecificParameters
// Maps the input parameters.
public void addModelSpecificParameters () {
parametersMap.put( "size", "numAgents"); parametersMap.put( "ui", "updateInterval"); parametersMap.put( "rP", "reconnectProb"); parametersMap.put( "cR", "connectRadius"); parametersMap.put( "nT", "netType"); parametersMap.put( "pUI", "pajekUpdateInterval"); parametersMap.put( "nUI", "evolveUpdateInterval");
}
//////////////////////////////////////////////////////
// getInitParam
// Controls what appears the the GUI parameter panel
public String[] getInitParam () {
String[] params = { "numAgents", "connectRadius", "reconnectProb", "netType", // these are from the super class: "rDebug", "seed"}; return params;
}
//////////////////////////////////////////////////////////
// getters and setters
// ******************** Note *************************
// Specific format required if using inputted parameters
// (either through batch or gui)
public int getWorldXSize () {return worldXSize;}
public void setWorldXSize (int size) {worldXSize = size;}
public int getWorldYSize () {return worldYSize;}
public void setWorldYSize (int size) {worldYSize = size;}
public int getNumAgents() {return numAgents;}
public void setNumAgents(int i) {
numAgents = i;
}
public double getReconnectProb() {return reconnectProb;}
public void setReconnectProb(double i) {reconnectProb = i;}
public int getConnectRadius() {return connectRadius;}
public void setConnectRadius(int i) {connectRadius = i;}
public void setNetType(int i) {netType = i;}
public int getNetType() {return netType;}
public int getUpdateInterval() {return updateInterval;}
public void setUpdateInterval(int i) {updateInterval = i;}
public int getPajekUpdateInterval() {return pajekUpdateInterval;}
public void setPajekUpdateInterval(int i) {pajekUpdateInterval = i;}
public int getEvolveUpdateInterval() {return evolveUpdateInterval;}
public void setEvolveUpdateInterval(int i) {evolveUpdateInterval = i;}
//////////////////////////////////////////////////////////
// buildModel
// Does what it says
public void buildModel(){
if(rDebug > 0) System.out.printf("Build Model Begin\n");
// CALL FIRST -- defined in super class -- it starts RNG, etc buildModelStart();
// setup the network class
net = new Network(numAgents, connectRadius, reconnectProb);
net.setModel(this);
CustomNode.setModel(this);
// have the network class build the network
net.buildAdjacencyMatrix(netType); // first build the adjacency matrix
net.buildAgentList(); // then the agent list
agentList = net.getAgentList();
// setup the gamemaster gm = new GameMaster(agentList);
// prepare pajek file
net.startPajekFile(0);
System.out.printf("Build Model End\n");
}
//////////////////////////////////////////////////////////
// buildSchedule
// Sets what is to happen, when.
public void buildSchedule () {
// schedule the current BatchModel's step() function // to execute every time step starting with time step 0 schedule.scheduleActionBeginning( 0, this, "step" );
// Schedule to stop at a particular time, StopT. Rem out // to run indefinitely schedule.scheduleActionAt(getStopT(), this, "processEndOfRun");
// Only run every updateInterval steps schedule.scheduleActionAtInterval(updateInterval, new BasicAction() { public void execute() { System.gc(); // garbage collect stepReport(); // write step report } }, Schedule.LAST);
schedule.scheduleActionAtInterval(evolveUpdateInterval, new BasicAction() { public void execute() { gm.evolveAgents(); // evolve agents } }, Schedule.LAST);
// Only run every pajekUpdateInterval steps schedule.scheduleActionAtInterval(pajekUpdateInterval, new BasicAction() { public void execute() { nextPajekNetwork(); // write pajek file and open new one }
}, Schedule.LAST);
// Execute at step 1 only schedule.scheduleActionAt(1, new BasicAction() { public void execute() { stepReport(); nextPajekNetwork(); } }, Schedule.LAST);
}
/////////////////////////////////////////////////////////////////////////
// printProjectHelp
// this could be filled in with some help to get from running with
// -help parameter
public void printProjectHelp() {
// print project help
System.out.printf( "\n%s -- \n", getName() );
System.out.printf( "\n **** Add more info here!! **** \n" );
System.out.printf( "\n" );
printParametersMap();
System.exit( 0 );
}
////////////////////////////////////////////////////////////////
// stepNodes
// Steps each node.
// Current has nodes re-draw themselves based on Utility
public void stepNodes(){
CustomNode node;
int maxUtility = 0;
for(int i = 0; i < numAgents; i++){
node = (CustomNode) agentList.get(i);
if (node.getUtility() > maxUtility) maxUtility = node.getUtility();
}
for(int i = 0; i < numAgents; i++){
node = (CustomNode) agentList.get(i);
node.setNodeColorFromUtility(maxUtility);
}
}
//////////////////////////////////////////////////////////////
// Setup
// Prepares the model, or resets it after the reset button is pressed
// in GUI model
public void setup () {
if ( rDebug > 0 ) System.out.printf( "<== Model setup() done.\n" ); // Clean up previous instances schedule = null; System.gc ();
// Set default values // These are overwritten by inputted values, if any numAgents = 64; updateInterval = 1000; pajekUpdateInterval = 5000; evolveUpdateInterval = 10;
worldXSize = 400;
worldYSize = 400;
netType = 0; connectRadius = 2; reconnectProb = 0.1;
CustomNode.resetNextID();
agentList = new ArrayList (numAgents);
super.setup(); // Reads in input values
schedule = new Schedule (1);
// some post-load finishing touches
startReportFile();
// you probably don't want to remove any of the following // calls to process parameter changes and write the // initial state to the report file. // NB -> you might remove/add more agentChange processing
applyAnyStoredChanges();
//stepReport();
//getPlaintextReportFile().flush();
}
/////////////////////////////////////////////////////////////
// step
// governs what happens at each step
public void step(){
gm.playAll(); stepNodes();
}
/////////////////////////////////////////////////////////////
// addAgent
// Input: CustomNode agent
// Output: none
// Adds a new agent to the agent list
public void addAgent(CustomNode agent){
agentList.add(agent);
}
/////////////////////////////////////////////////////////////
// delAgent
// Input: CustomNode agent
// Output: none
// Deletes an agent from the agent list
public void delAgent(CustomNode agent){
agentList.remove(agentList.indexOf(agent)); System.gc();
}
//////////////////////////////////////////////////////////////////////
// calcAvgUtility()
public double calcAvgUtility(){
double sum = 0; for(int i = 0; i < numAgents; i++){ CustomNode node = (CustomNode) agentList.get(i); sum += (double) node.getUtility(); } return sum/(double) numAgents;
}
///////////////////////////////////////////////////////////////////////
// stepReport
// each step write out:
// time expectivity
//
// Note: update the writeHeaderCommentsToReportFile() to print
// lines of text describing the data written to the report file.
public void stepReport () {
String s; s = String.format("%f", schedule.getCurrentTimeDouble());
//writeLineToReportFile ( "<stepreport>" + s + "</stepreport>" ); writeLineToPlaintextReportFile( s ); // flush the buffers so the data is not lost in a "crash" //getReportFile().flush(); getPlaintextReportFile().flush();
}
/////////////////////////////////////////////////////////////////////////
// writeHeaderCommentsToReportFile
// customize to match what you are writing to the report files in
// stepReport.
public void writeHeaderCommentsToReportFile () {
writeLineToReportFile( "<comment>" ); writeLineToReportFile( " " ); writeLineToReportFile( " time expectivity " ); writeLineToReportFile( "</comment>" );
writeLineToPlaintextReportFile( " #time" );
}
public Schedule getSchedule () {
return schedule;
}
public String getName () {
return "Network";
}
public ArrayList<CustomNode> getAgentList() {return agentList;}
public static void main (String[] args) {
uchicago.src.sim.engine.SimInit init = new uchicago.src.sim.engine.SimInit ();
CoopNetBlue model = new CoopNetBlue ();
init.loadModel (model, null, false);
}
// The following are some debugging methods
public static void printVector(double[] vector){
System.out.printf("\n");
for(int i = 0; i < vector.length; i++){
System.out.printf("%f ", vector[i]);
}
System.out.printf("\n");
}
public static void printVector(int[] vector){
System.out.printf("\n");
for(int i = 0; i < vector.length; i++){
System.out.printf("%d ", vector[i]);
}
System.out.printf("\n");
}
public void printAgentList(){
System.out.printf("Printing agentList, size = %d\n", agentList.size());
CustomNode node;
CustomNode inode;
for(int i = 0; i < (agentList.size()); i++){
node = (CustomNode) agentList.get(i); ArrayList <CustomNode> outNodes = node.getToNodes(); System.out.printf("Node %d points to (%d objects): ", node.getID(), outNodes.size()); for(int j = 0; j < (outNodes.size()); j++){ inode = (CustomNode) outNodes.get(j); System.out.printf(" %d ", inode.getID()); } System.out.printf("\n");
}
System.out.printf("\n");
}
/////////////////////////////////////////////////////////
// nextPajekNetwork
// closes the current pajek file and opens the new one.
public void nextPajekNetwork(){
net.writePajekNetwork(agentList); net.endPajekFile(); net.startPajekFile((int) schedule.getCurrentTime()/pajekUpdateInterval + 1);
}
/////////////////////////////////////////////////////////////////////
// processEndOfRun
// ends process
public void processEndOfRun ( ) {
long finalStep = (long) schedule.getCurrentTime(); if ( rDebug > 0 ) System.out.printf("\n\n===== Model processEndOfRun =====\n\n" ); applyAnyStoredChanges(); stepReport(); endReportFile(finalStep); net.writePajekNetwork(agentList); net.endPajekFile(); this.fireStopSim();
}
}
