📄 e0c50b76dbf9001d10088c048d85d403
字号:
import java.awt.Color;
import java.util.ArrayList;
import uchicago.src.sim.engine.*;
import uchicago.src.sim.analysis.BinDataSource;
import uchicago.src.sim.analysis.DataSource;
import uchicago.src.sim.analysis.DataRecorder;
import uchicago.src.sim.analysis.OpenHistogram;
import uchicago.src.sim.analysis.OpenSequenceGraph;
import uchicago.src.sim.analysis.Sequence;
import uchicago.src.sim.engine.BasicAction;
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.Object2DDisplay;
import uchicago.src.sim.gui.Value2DDisplay;
import uchicago.src.sim.util.SimUtilities;
import uchicago.src.sim.analysis.LocalDataRecorder;
import uchicago.src.sim.space.Object2DGrid;
import uchicago.src.sim.space.RasterSpace;
public class LakeModel extends SimModelImpl{
private static final int SFNUMAGENTS = 50;
private static final int KWNUMAGENTS = 100;
private static final int SF_AGENT_MIN_LIFESPAN = 0;
private static final int SF_AGENT_MAX_LIFESPAN = 275;
private static final int KW_AGENT_MIN_LIFESPAN = 0;
private static final int KW_AGENT_MAX_LIFESPAN = 90;
private static final int SF_AGENT_LIFE_ABILITY = 10;
private static final int KW_AGENT_LIFE_ABILITY = 10;
private static final int SF_AGENT_NEW_NUMBER = 0;
private static final int KW_AGENT_NEW_NUMBER = 0;
private static final int SF_NEIGHOR_X_DISTANCE = 2;
private static final int SF_NEIGHOR_Y_DISTANCE = 2;
private static final int SF_DISTANCE_KW = 3;
private static final int SCHEDULE = 10;
private int sfnumAgents = SFNUMAGENTS;
private int kwnumAgents = KWNUMAGENTS;
private int sfagentMinLifespan = SF_AGENT_MIN_LIFESPAN;
private int sfagentMaxLifespan = SF_AGENT_MAX_LIFESPAN;
private int kwagentMinLifespan = KW_AGENT_MIN_LIFESPAN;
private int kwagentMaxLifespan = KW_AGENT_MAX_LIFESPAN;
private int sfla=SF_AGENT_LIFE_ABILITY;
private int kwla=KW_AGENT_LIFE_ABILITY;
private int sfn=SF_AGENT_NEW_NUMBER;
private int kwn=KW_AGENT_NEW_NUMBER;
private int sfxd=SF_NEIGHOR_X_DISTANCE;
private int sfyd=SF_NEIGHOR_Y_DISTANCE;
private int sfkwd=SF_DISTANCE_KW;
private int click=SCHEDULE;
private RasterSpace space;
private WaterSpace waterspaceSF,waterspaceKW;
private Schedule schedule;
private ArrayList agentSFList,agentKWList;
private DisplaySurface displaySurf;
private DataRecorder recorder;
private OpenSequenceGraph amountOfSFInSpace;
private OpenSequenceGraph amountOfKWInSpace;
class SFInSpace implements DataSource,Sequence{
public Object execute(){
return new Double (getSValue());
}
public double getSValue(){
return countLivingSF();
}
}
class KWInSpace implements DataSource, Sequence{
public Object execute(){
return new Double (getSValue());
}
public double getSValue(){
return countLivingKW();
}
}
/**
* @param args
*/
public String getName(){
return "Life In the Lake";
}
public void setup(){
System.out.println("Running setup");
waterspaceSF=null;
waterspaceKW=null;
agentSFList = new ArrayList();
agentKWList = new ArrayList();
schedule = new Schedule(click);
if (displaySurf != null){
displaySurf.dispose();
}
displaySurf = null;
if (amountOfSFInSpace != null){
amountOfSFInSpace.dispose();
}
amountOfSFInSpace = null;
if (amountOfKWInSpace != null){
amountOfKWInSpace.dispose();
}
amountOfKWInSpace = null;
displaySurf = new DisplaySurface (this,"Life in the Lake Window 1");
amountOfSFInSpace = new OpenSequenceGraph ("Amount of SF In Space",this);
amountOfKWInSpace = new OpenSequenceGraph("Amount of KW In Space",this);
registerDisplaySurface("Life in the Lake Window 1", displaySurf);
this.registerMediaProducer("Plot", amountOfSFInSpace);
this.registerMediaProducer("Plot", amountOfKWInSpace);
}
public void begin(){
buildModel();
buildSchedule();
buildDisplay();
displaySurf.display();
amountOfSFInSpace.display();
amountOfKWInSpace.display();
}
public void buildModel(){
System.out.println("Running BuildModel");
try{
String file = "waterdepth.txt";
java.io.InputStream stream = getClass().getResourceAsStream(file);
space = new RasterSpace(stream);
}catch(Exception e){
System.out.println(e);
}
waterspaceSF=new WaterSpace(space.getSizeX(), space.getSizeY());
waterspaceKW=new WaterSpace(space.getSizeX(), space.getSizeY());
for(int i=0;i<sfnumAgents;i++){
addNewSFAgent();
}
for(int i=0;i<kwnumAgents;i++){
addNewKWAgent();
}
}
public void buildSchedule(){
System.out.println("Running BuildSchedule");
class LifeinLake extends BasicAction{
public void execute(){
SimUtilities.shuffle(agentSFList);
SimUtilities.shuffle(agentKWList);
for (int i=0;i<agentSFList.size();i++){
SFAgent cda = (SFAgent)agentSFList.get(i);
cda.step();
}
for (int i=0;i<agentKWList.size();i++){
KWAgent cdb =(KWAgent)agentKWList.get(i);
cdb.step();
}
int deadSF=reapDeadSF();
int deadKW=reapDeadKW();
//give birth to new SF
for(int i=0;i<deadSF*sfn;i++){
addNewSFAgent1();
}
//give birth to new KW
for(int i=0;i<deadKW*kwn;i++){
addNewKWAgent1();
}
displaySurf.updateDisplay();
}
}
schedule.scheduleActionBeginning(0, new LifeinLake());
class SFInLakeSpace extends BasicAction{
public void execute(){
amountOfSFInSpace.step();
}
}
schedule.scheduleActionAtInterval(1, new SFInLakeSpace());
class KWInLakeSpace extends BasicAction{
public void execute(){
amountOfKWInSpace.step();
}
}
schedule.scheduleActionAtInterval(1, new KWInLakeSpace());
}
public void buildDisplay(){
System.out.println("Runing BuildDisplay");
Object2DDisplay displaySF= new Object2DDisplay(waterspaceSF.getCurrentSFSpace());
displaySF.setObjectList(agentSFList);
Object2DDisplay displayKW= new Object2DDisplay(waterspaceKW.getCurrentKWSpace());
displayKW.setObjectList(agentKWList);
ColorMap map = new ColorMap();
for (int i = 0; i < 8; i++) {
map.mapColor(i, new Color(0, 0, (int)i*16+127));
}
Value2DDisplay rasterDisplay = new Value2DDisplay(space, map);
rasterDisplay.setZeroTransparent(true);
rasterDisplay.setDisplayMapping(1, 0);
displaySurf.addDisplayable(rasterDisplay, "Water Space");
displaySurf.addDisplayableProbeable(displaySF, "SF");
displaySurf.addDisplayableProbeable(displayKW, "KW");
amountOfSFInSpace.addSequence("SF in the lake", new SFInSpace());
amountOfKWInSpace.addSequence("KF in the lake", new KWInSpace());
}
private int reapDeadSF(){
int count=0;
DisSFSF(sfla,sfxd,sfyd);
for (int i =(agentSFList.size()-1);i>=0;i--){
SFAgent cda=(SFAgent)agentSFList.get(i);
if(cda.getstepsToLive()<1){
waterspaceSF.removeSFAT(cda.getX(), cda.getY());
agentSFList.remove(i);
count++;
}
}
return count;
}
private int reapDeadKW(){
int count=0;
DisSFKW(kwla);
for (int i =(agentKWList.size()-1);i>=0;i--){
KWAgent cda=(KWAgent)agentKWList.get(i);
if(cda.getstepsToLive()<1){
waterspaceKW.removeKWAT(cda.getX(), cda.getY());
agentKWList.remove(i);
count++;
}
}
return count;
}
private int countLivingSF(){
int livingSF=0;
for (int i=0;i<agentSFList.size();i++){
SFAgent cda=(SFAgent)agentSFList.get(i);
if(cda.getstepsToLive()>0) livingSF++;
}
return livingSF;
}
private int countLivingKW(){
int livingKW=0;
for (int i=0;i<agentKWList.size();i++){
KWAgent cda=(KWAgent)agentKWList.get(i);
if(cda.getstepsToLive()>0) livingKW++;
}
return livingKW;
}
public void addNewSFAgent(){
SFAgent a= new SFAgent(sfagentMinLifespan,sfagentMaxLifespan);
agentSFList.add(a);
waterspaceSF.addSFagent(a,sfagentMinLifespan,sfagentMaxLifespan);
}
public void addNewSFAgent1(){
SFAgent a= new SFAgent(sfagentMinLifespan,sfagentMaxLifespan);
agentSFList.add(a);
waterspaceSF.addSFagent1(a,sfagentMinLifespan,sfagentMaxLifespan);
}
public void addNewKWAgent(){
KWAgent a= new KWAgent(kwagentMinLifespan,kwagentMaxLifespan);
agentKWList.add(a);
waterspaceKW.addKWagent(a);
}
public void addNewKWAgent1(){
KWAgent a= new KWAgent(kwagentMinLifespan,kwagentMaxLifespan);
agentKWList.add(a);
waterspaceKW.addKWagent1(a);
}
//distance between sf & kw
//Life ability of KW:s
public void DisSFKW(int kwla){
double d1=0;
for (int i=0;i<agentSFList.size();i++)
for(int j=0;j<agentKWList.size();j++){
SFAgent cdSF=(SFAgent)agentSFList.get(i);
KWAgent cdKW=(KWAgent)agentKWList.get(j);
d1= Math.sqrt((cdSF.getX()-cdKW.getX())*(cdSF.getX()-cdKW.getX())+(cdSF.getY()-cdKW.getY())*(cdSF.getY()-cdKW.getY()));
if(d1<sfkwd)
{
int s=cdKW.getstepsToLive();
cdKW.setstepsToLive(s/kwla);
}
}
}
//distance between sf & sf
//Life ability of SF:s
public void DisSFSF(int sfla,int sfxd,int sfyd){
int a=0;
int b=0;
int c=0;
for (int i=0;i<agentSFList.size();i++){
SFAgent cdSF=(SFAgent)agentSFList.get(i);
c=cdSF.getstepsToLive();
a= waterspaceSF.getCurrentSFSpace().getMooreNeighbors(cdSF.getX(), cdSF.getY(), false).size();
int s=cdSF.getstepsToLive();
for(int j=0;j<a;j++){
SFAgent cdSF1 = (SFAgent)waterspaceSF.getCurrentSFSpace().getMooreNeighbors(cdSF.getX(), cdSF.getY(),sfxd,sfyd, false).get(j);//(SFAgent)SFSpace.getMooreNeighbors(x, y,2,2, false).get(i);
b=cdSF1.getstepsToLive();
if (c>=b){
cdSF.setstepsToLive(s/sfla);
}
else {
cdSF1.setstepsToLive(s/sfla);
}
}
}
}
public Schedule getSchedule(){
return schedule;
}
public String[]getInitParam(){
String[] initParams={"sfnumAgents","kwnumAgents","sfagentMinLifespan","sfagentMaxLifespan","kwagentMinLifespan","kwagentMaxLifespan","sfla","kwla","sfn","kwn","sfxd","sfyd","sfkwd","click"};
return initParams;
}
public int getsfnumAgents (){
return sfnumAgents;
}
public void setsfnumAgents(int na){
sfnumAgents=na;
}
public int getkwnumAgents(){
return kwnumAgents;
}
public void setkwnumAgents(int nt){
kwnumAgents=nt;
}
public int getsfagentMinLifespan(){
return sfagentMinLifespan;
}
public void setsfagentMinLifespan(int i){
sfagentMinLifespan=i;
}
public int getsfagentMaxLifespan(){
return sfagentMaxLifespan;
}
public void setsfagentMaxLifespan(int i){
sfagentMaxLifespan=i;
}
public int getkwagentMinLifespan(){
return kwagentMinLifespan;
}
public void setkwagentMinLifespan(int i){
kwagentMinLifespan=i;
}
public int getkwagentMaxLifespan(){
return kwagentMaxLifespan;
}
public void setkwagentMaxLifespan(int i){
kwagentMaxLifespan=i;
}
public void setsfla(int i){
sfla=i;
}
public int getsfla(){
return sfla;
}
public void setkwla(int i){
kwla=i;
}
public int getkwla(){
return kwla;
}
public void setsfn(int i){
sfn=i;
}
public int getsfn(){
return sfn;
}
public void setkwn(int i){
kwn=i;
}
public int getkwn(){
return kwn;
}
public void setsfxd(int i){
sfxd=i;
}
public int getsfxd(){
return sfxd;
}
public void setsfyd(int i){
sfyd=i;
}
public int getsfyd(){
return sfyd;
}
public void setsfkwd(int i){
sfkwd=i;
}
public int getsfkwd(){
return sfkwd;
}
public void setclick(int i){
click=i;
}
public int getclick(){
return click;
}
public static void main(String[] args) {
SimInit init = new SimInit();
LakeModel model = new LakeModel();
init.loadModel(model,"", false);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -