CustomNode.java: Difference between revisions
From Santa Fe Institute Events Wiki
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Base model]] | |||
<pre> | |||
/* | /* | ||
* CustomNode.java | * CustomNode.java | ||
Line 242: | Line 244: | ||
} | } | ||
</pre> |
Latest revision as of 04:00, 16 June 2006
/* * CustomNode.java * * Created on January 22, 2005, 2:41 PM * Modified on June 14, 2006 * * This class contains the parameters and methods * for an agent acting on the network */ package CoopNetBlue; import uchicago.src.sim.gui.NetworkDrawable; import uchicago.src.sim.network.DefaultDrawableNode; import uchicago.src.sim.gui.DrawableNonGridNode; import uchicago.src.sim.util.Random; import uchicago.src.sim.gui.OvalNetworkItem; import java.awt.Color; import uchicago.src.sim.gui.ColorMap; import uchicago.src.sim.engine.CustomProbeable; import java.util.ArrayList; /** * * @author Jack Waddell * */ // DefaultDrawableNode lets us draw it in the GUI // CustomProbeable lets us define which attributes appear when // probed in the GUI public class CustomNode extends DefaultDrawableNode implements CustomProbeable { //*********************************** // Static Parameters // tracks next unique id public static int nextID = 0; public static GUIModel guiModel = null; public static CoopNetBlue model; //********************************8** // Instance parameters // Two colormaps are generated for color-coding the nodes in GUI public static ColorMap centerColorMap; public static ColorMap edgeColorMap; public static final int colorMapSize = 16; public static final int colorMapMax = colorMapSize - 1; private int id; // uniquely ids node public Color myColor; // used to draw color in GUI public String myPajekColor = "Red"; // color to appear in Pajek output public int utility; // current wealth or stored utility public double strategy; // strategy parameter /////////////////////////////////////////////////////////////// // constructor // Inputs: NetworkDrawable drawable, to draw in GUI // double strategy, the strategy parameter public CustomNode (NetworkDrawable drawable, double strategy) { super(drawable); id = nextID++; // set id and iterate to next this.strategy = strategy; utility = 50; // Generalize. Currently hard-coded if (guiModel != null) setNodeEdgeColorFromStrategy(); } /////////////////////////////////////////////////////////// // getProbedProperties // Required to implement CustomProbeable // Inputs: none // Outputs: array of strings holding parameter names public String[] getProbedProperties(){ return new String[] {"id", "utility", "strategy"}; } ////////////////////////////////////////////////////////// // step // Input: none // Output: none // (Can be) Called by main model to have nodes execute a single step public void step(){ } ////////////////////////////////////////////////////////// // setNodeColorFromUtility // Input: maxUtility, the highest utility from all agents // Output: none // Sets the node color to the colormap leval depending on utility public void setNodeColorFromUtility(int maxUtility){ int i = (int) Math.round(colorMapMax*((double)utility)/ ((double) maxUtility)); this.setColor(centerColorMap.getColor(i)); /*if (rDebug > 1){ double rat = ((double) getUtility())/((double) maxUtility); int ival = (int) Math.round(rat*colorMapSize); System.out.printf("%d/%d = %f -> %d\n", getUtility(), maxUtility, rat, ival); }*/ } ////////////////////////////////////////////////////////// // setNodeEdgeColorFromStrategy // Input: none // Output: none // Sets the node edge color to the colormap level depending on strategy public void setNodeEdgeColorFromStrategy(){ int i = (int) Math.round(colorMapMax*strategy); this.setBorderColor(edgeColorMap.getColor(i)); this.setBorderWidth(3); /*if (rDebug > 1){ double rat = ((double) getUtility())/((double) maxUtility); int ival = (int) Math.round(rat*colorMapSize); System.out.printf("%d/%d = %f -> %d\n", getUtility(), maxUtility, rat, ival); }*/ } //////////////////////////////////////////////////////////// // bearChild // Input: none // Output: node // Creates a child node public void bearChild(){ double deviation = model.getNormalDouble(0, 0.1); // mutate child double childStrategy = strategy + deviation; childStrategy = Math.min(1, Math.max(0, childStrategy)); OvalNetworkItem drawable = new OvalNetworkItem(0,0); CustomNode child = new CustomNode(drawable, childStrategy); ArrayList<CustomNode> parentNeighbors = this.getOutNodes(); for (CustomNode neighbor : parentNeighbors){ CustomEdge edge1 = new CustomEdge(child, neighbor); CustomEdge edge2 = new CustomEdge(neighbor, child); // I think you have to add edges in and out to make it // undirected. child.addOutEdge(edge1); neighbor.addInEdge(edge1); child.addInEdge(edge2); neighbor.addOutEdge(edge2); } CustomEdge edge1 = new CustomEdge(this, child); CustomEdge edge2 = new CustomEdge(child, this); child.addOutEdge(edge2); this.addInEdge(edge2); child.addInEdge(edge1); this.addOutEdge(edge1); if (guiModel!=null) guiModel.addAgent(child); else model.addAgent(child); } ////////////////////////////////////////////////////// // die // Inputs: none // Outputs: none // Kills an agent public void die(){ // Go through neighbors, removing links to or from node // Make sure you get them all! ArrayList<CustomNode> neighbors = this.getOutNodes(); for (CustomNode neigh : neighbors){ neigh.removeEdgesFrom(this); neigh.removeEdgesTo(this); } if (guiModel != null) guiModel.delAgent(this); else model.delAgent(this); } /////////////////////////////////////////////////////// // getDegree // Input: none // Output: int degree // Calculates the degree of the node (assuming symmetric) public int getDegree(){ return (this.getOutNodes()).size(); } //*************************************************************** // Getters and Setters public int getID() {return id;} public void setMyPajekColor(String i) {myPajekColor = i;} public String getMyPajekColor() {return myPajekColor;} public int getUtility() {return utility;} public void setUtility(int i) {utility = i;} public int incUtility() {return ++utility;} public int decUtility() {return --utility;} public double getStrategy() {return strategy;} public void setStrategy(double i) {strategy = i;} //*************************************************************** // Static Methods public static void setModel(CoopNetBlue m) {model = m;} ////////////////////////////////////////////////////////// // setUpNodeDrawing // Input: GUIModel m, a pointer to the GUIModel // Output: none public static void setUpNodeDrawing (GUIModel m) { guiModel = m; centerColorMap = new ColorMap(); edgeColorMap = new ColorMap(); double minColor = 0.1; for (int i = 0; i < colorMapSize; i++){ double fracColor = minColor + ( (1.0-minColor)*i/colorMapMax ); centerColorMap.mapColor(i, 0, 0, fracColor); edgeColorMap.mapColor(i, 0, fracColor, 0); } } /////////////////////////////////////////////////////////// // resetNextID // Inputs: none // Outputs: none // Resets nextID. Called when the model is reset, and a // new set of nodes is generated public static void resetNextID(){ nextID = 0; } }