⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e0c50b76dbf9001d10088c048d85d403

📁 应用repast实现的一个多智能体生态仿真系统
💻
字号:
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 + -