repast simphony java getting started 示例 中文版

1.Zombie.java

package jzombies;

import repast.simphony.query.space.grid.GridCellNgh;
import repast.simphony.random.RandomHelper;
import repast.simphony.space.SpatialMath;
import repast.simphony.space.continuous.ContinuousSpace;
import repast.simphony.space.continuous.NdPoint;
import repast.simphony.space.graph.Network;
import repast.simphony.space.grid.Grid;
import repast.simphony.space.grid.GridPoint;
import repast.simphony.util.ContextUtils;
import repast.simphony.util.SimUtilities;

import java.util.ArrayList;
import java.util.List;

import repast.simphony.context.Context;
import repast.simphony.engine.schedule.ScheduledMethod;

import repast.simphony.query.space.grid.GridCell;;

public class Zombie {
	private ContinuousSpace  space;
	private Grid grid;
	private boolean moved;//接Human.java----35行---
	public Zombie(ContinuousSpace space,Grid grid) {
		this.space=space;
		this.grid=grid;
	}
	@ScheduledMethod(start=1,interval=1)//指定该方法何时以及多久被调用
	public void step() {
		GridPoint pt=grid.getLocation(this);//得到僵尸的格子位置,this指当前对象正在调用代码的哪个方法
		GridCellNgh nghCreator=new GridCellNgh(grid,pt,Human.class,1,1); //创建一个僵尸格子周围包含人类的格子列表
		//即僵尸格子grid所在位置(pt)的八个方向
		List<GridCell<Human>> gridCells=nghCreator.getNeighborhood(true);//过滤掉非Human的邻近格子,返回列表
		SimUtilities.shuffle(gridCells, RandomHelper.getUniform());//置乱(打乱列表gridCells)[如果不打乱的话,当所有单元格机会均等时,僵尸将始终
		//像同一方向前进];RandomHelper,随机生成置乱顺序列表的类
		
		GridPoint pointWithMostHumans=null;
		int maxCount=-1;
		for (GridCell cell : gridCells) {//遍历所有单元格,记录周围有最多的Human的格子的位置以及统计个数
			if (cell.size()>maxCount){
				pointWithMostHumans=cell.getPoint();
				maxCount=cell.size();
			}
		}
		moveTowards(pointWithMostHumans);//	
		infect();
	}
	//写好走步的方法后,我们想要每次重复的仿真都调用这个走步方法,则需要添加@ScheduledMethod静态注释在step()上
	public void moveTowards(GridPoint pt) {
		if (!pt.equals(grid.getLocation(this))) {//判断僵尸是否已经处在要移动的位置
			NdPoint myPoint=space.getLocation(this);//得到僵尸在空间中的当前位置【NdPoint,存放的是double型的坐标,因此在连续空间中是合适的】
			NdPoint otherPoint=new NdPoint(pt.getX(),pt.getY());//将GridPoint pt(离散性)转换为NdPoint(连续型) ,使僵尸能够以连续空间移动
			double angle=SpatialMath.calcAngleFor2DMovement(space, myPoint, otherPoint);//计算二维空间(僵尸到pt)移动的角度
			space.moveByVector(this, 1, angle,0);//动起来,移动僵尸1个单元沿着计算的角度
			//NdPoint moveByVector(T object, double distance, double... anglesInRadians);
			myPoint=space.getLocation(this);//更新当前位置
			grid.moveTo(this, (int)myPoint.getX(),(int)myPoint.getY());//grid.moveTo(object, newLocation)
			
			moved=true;//接Human.java----35行---
		}
	}//-------------------- part1 end--------------------转至最后一行----------------------
	
//<<----------------------------------------接---JZombieBuilder.java--末尾----------------------------	
	/*infect()方法得到了在Zombie的网格位置的所有Human--Humans。随机从Humans中选择一个Human,这个被选择的Human将会被感染
	 * 【从simulation中移除并被一个Zombie取代】。
	 * Zombie类调用infect()方法从得到this的网格位置(grid location)开始
	 * */
	public void infect() {
		GridPoint pt=grid.getLocation(this);//得到Zombie当前所在网格位置
		List<Object> humans=new ArrayList();//创建Humans列表
		for(Object obj:grid.getObjectsAt(pt.getX(),pt.getY())) {//将在当前网格位置的所有(Human类的实例)Human存入huamns列表
			if(obj instanceof Human) {
				humans.add(obj);
			}
		}
		
		if(humans.size()>0) {//如果humans列表中有Human
			int index=RandomHelper.nextIntFromTo(0, humans.size()-1);//随机选取一个humans中的索引
			Object obj=humans.get(index);//根据索引得到一个Human
			NdPoint spacePt=space.getLocation(obj);//得到Human所在的空间位置(space location)
			Context<Object> context=ContextUtils.getContext(obj);//利用ContextUtils类得到包含这个随机选取的Human的context
			context.remove(obj);//从context中移除该Human【此时相应的与该Human的context相关的所有projection也会被移除】
			//在本例子中即从gird和space projection中移除。
			Zombie zombie=new Zombie(space,grid);//随后,我们new一个新的Zombie
			context.add(zombie);//并将其添加到context中
			space.moveTo(zombie, spacePt.getX(),spacePt.getY());//然后将该Zombie移动到被删除的随机选择的Human的space location
			//即前面的spacePt暂存的位置
			grid.moveTo(zombie, pt.getX(),pt.getY());//然后,将grid location设置为该Zombie的坐标即前面的pt暂存的位置
			
			//最后,我们通过从context中按名称获取感染网络(infection network)来结束。 (我们还没有创建这个网络
			//但是,但很快就会这样做)
			Network<Object> net=(Network)context.getProjection("infection network");
			net.addEdge(this,zombie);//在this和后来被构造的zombie之间有一条边,表示Zombie 感染了那个Human
			//我们需要添加调用infect()方法的代码到Zombie类的step()中。
			//将infect()添加到moveTowards(pointWithMostHuman)的后面
			//最后,我们需要创建network在JZombieBuilder中,就像之前我们创建space和grid projection一样。
			//打开JZombieBuilder并添加以下代码到build()方法的顶部
			/*NetworkBuilder netBuilder=new NetworkBuilder("infection network",context,true);
			  netBuilder.buildNetwork(); */	
//--------------------------转至---JZombieBuilder.java----------build()方法顶部-------------->>
		}
		
	}
	
		
	
}//然后我们将转换到Human的行为中(Human.java)即他们的基本反应当僵尸来到其附近时,从那个区域跑开有最多僵尸的格子

2.Human.java

package jzombies;

import java.util.List;

import repast.simphony.engine.watcher.Watch;
import repast.simphony.engine.watcher.WatcherTriggerSchedule;
import repast.simphony.query.space.grid.GridCell;
import repast.simphony.query.space.grid.GridCellNgh;
import repast.simphony.random.RandomHelper;
import repast.simphony.space.SpatialMath;
import repast.simphony.space.continuous.ContinuousSpace;
import repast.simphony.space.continuous.NdPoint;
import repast.simphony.space.grid.Grid;
import repast.simphony.space.grid.GridPoint;
import repast.simphony.util.SimUtilities;

public class Human {
	private ContinuousSpace  space;
	private Grid grid;
	private int energy,startingEnergy;
	public Human(ContinuousSpace space,Grid grid,int energy) {
		this.space=space;
		this.grid=grid;
		this.energy=startingEnergy=energy;//energy用来跟踪Human的能量总量,startingEnergy记录初始能量,当Human用完后恢复为原值
		
	}
	//Human实现的是跑的方法
//<<--------------接run()----------末尾
	@Watch(watcheeClassName="jzombies.Zombie",
			watcheeFieldNames = "moved",
			query="within_moore 1",//X(1) is the extent of the neighborhood in the x, y, [z]dimensions
			whenToTrigger=WatcherTriggerSchedule.IMMEDIATE)
	//@Watch将会观察在Zombie类中任何的变化,即无论何时任意一个Zombie 移动并且他们的移动变量更新,那么它就会检测每一个Human,
	//如果查询为True对于个别Human,那么run()方法将会被立刻调用【当Zombie移动至Human所在格子邻近的8个格子时】
	//细心的同学会发现我i们并未定义变量moved,在Zombie类中,故添加private boolean moved在Zombie.java的Zombie类中,
	//然后添加moved=true在moveTowards()方法的末尾
//---------------------------->>
	public void run() {
		GridPoint pt=grid.getLocation(this);
		GridCellNgh nghCreator=new GridCellNgh(grid,pt,Zombie.class,1,1);
		List<GridCell<Human>> gridCells=nghCreator.getNeighborhood(true);
		SimUtilities.shuffle(gridCells, RandomHelper.getUniform());//置乱
		
		GridPoint pointWithLeastZombies=null;
		int minCount=-1;
		for (GridCell cell : gridCells) {//遍历所有单元格,记录周围有最少的Zombie的格子的位置以及统计个数
			if (cell.size()<minCount){
				pointWithLeastZombies=cell.getPoint();
				minCount=cell.size();
			}
		}
		if(energy>0) {
			moveTowards(pointWithLeastZombies);
		}else {
			energy=startingEnergy;
		}
	//不像僵尸那样,我们不需要安排时间表给人的run方法;我们打算设置一个watcher 去触发事件【当僵尸移动到Human的周围时】
	//我们使用@Watch静态注释,其中有一些条件被满足时就会触发;我们也可以定义一个查询在@Watch上去更好的指定触发条件 ---->>转至28行----
	}
	public void moveTowards(GridPoint pt) {//移动能量减少,格子数为2
		if(!pt.equals(grid.getLocation(this))) {
			NdPoint myPoint=space.getLocation(this);//得到Human在空间中的当前位置【NdPoint,存放的是double型的坐标,因此在连续空间中是合适的】
			NdPoint otherPoint=new NdPoint(pt.getX(),pt.getY());//将GridPoint pt(离散性)转换为NdPoint(连续型) ,使僵尸能够以连续空间移动
			double angle=SpatialMath.calcAngleFor2DMovement(space, myPoint, otherPoint);//计算二维空间(Human到pt)移动的角度
			space.moveByVector(this, 2, angle,0);//动起来,移动Human 2个单元沿着计算的角度
			//NdPoint moveByVector(T object, double distance, double... anglesInRadians);
			myPoint=space.getLocation(this);//更新当前位置
			grid.moveTo(this, (int)myPoint.getX(),(int)myPoint.getY());//grid.moveTo(object, newLocation)
			energy--;
		}
		
	}
	
}
//这时我们已经完成了Zombies和Humans的代码部分。现在我们需要初始化simulation。在Repast S模型中,初始化是在一个继承自Repast Simphony ContextBuilder类中
//我们新建一个类 JZombiesBuilder,在 new class 的弹出框中的interfaces框右侧点击add-输入ContextBuilder-点击OK-点击finish,后面内容在JZombiesBuilder
//中继续

3.JZombiesBuilder.java

package jzombies;

import repast.simphony.context.Context;
import repast.simphony.context.space.continuous.ContinuousSpaceFactory;
import repast.simphony.context.space.continuous.ContinuousSpaceFactoryFinder;
import repast.simphony.context.space.graph.NetworkBuilder;
import repast.simphony.context.space.grid.GridFactory;
import repast.simphony.context.space.grid.GridFactoryFinder;
import repast.simphony.dataLoader.ContextBuilder;
import repast.simphony.engine.environment.RunEnvironment;
import repast.simphony.parameter.Parameters;
import repast.simphony.random.RandomHelper;
import repast.simphony.space.continuous.ContinuousSpace;
import repast.simphony.space.continuous.NdPoint;
import repast.simphony.space.continuous.RandomCartesianAdder;
import repast.simphony.space.grid.Grid;
import repast.simphony.space.grid.GridBuilderParameters;
import repast.simphony.space.grid.SimpleGridAdder;
import repast.simphony.space.grid.WrapAroundBorders;//注意与repast.simphony.space.continuous.WrapAroundBorders的区分
//当我们创建完成后会看到有两处错误:public class 【JZombiesBuilder】 implements ContextBuilder<【T】> 即图中【】
//前者是因为JZombiesBuilder类并没有实现ContextBuilder接口中的方法,可以通过Eclipse自动添加:右键单击JZombiesBuilder.java
//-选择source-Override/Implement Methods--ok.
//后者将T改为Object即可
public class JZombiesBuilder implements ContextBuilder<Object> {
//ContextBuilder顾名思义就是创建一个文本;本质上是命名的代理集合,创建包含命名和添加代理agents
/*A Projection takes the agents in a Context and imposes some sort of structure on them.  Our ContinuousSpace
and Grid are projections.  They take agents and locate them in a continuous space and matrix like grid respectivel
 * */
	
	//在build()方法中,我们需要构造agents,ContinuousSpace和Grid的投影,下面开始初始化Context以及构造投影
	@Override
	public Context build(Context<Object> context) {
		// TODO Auto-generated method stub
//<-----接--------Zombie.java-------infect()方法--底部--------
		
		NetworkBuilder netBuilder=new NetworkBuilder("infection network",context,true);
		netBuilder.buildNetwork();
		  
		 /*我们使用NetworkBuilder去构造网络。 它有以下参数,如字面意思。
		  * NetworkBuilder(String networkName, Context<T> context, boolean isDirected)
		  * 在我们的示例中需要一个有向网络表示Zombie感染与被感染的关系;
		  * 为了实际创建网络,我们调用了buildNetwork。它将会创建网络投影(network projection)以及自动关联相关的context
		  * */
		  //就像之前在context.xml配置space和grid projection那样,我们需要添加network projection。代码如下,
		  //<projection type="network" id="infection network"></projection>
		  /*现在让我们运行simulation。
		   * 当Repast Simphony 弹出,初始化并且运行开始simulation。你应该能够看到human变成了zombie。
		   * 如果没有,那么请检查你的代码【注意:网络network并没有显现,我们需要更新display以及Humans和Zombies的styles才能去显示network】
		   * 首先让我们移除原来的display。右键单击Space Display并删除<delete>,然后新建一个display
		   * 	1.右键单击Displays---点击Add Display
		   * 	2.在Display对话框中设置 name为Space Display,type为2D
		   * 	3.选择我们的space和infection network projections作为我们想要display的,然后点击Projection and Value Layers部分里的space
		   * 	---点击向右的绿色箭头将其移至右端,infection network同理。
		   * 	4.点击next
		   * 	5.和之前一样,选择Human和Zombie agents【将左边的全部移到右边;如果Zombie不在右侧的顶部(第一个位置)使用<上下箭头将其移动到顶部--确保Zombie不会被Human所覆盖>】
 		   *	6.点击next
 		   *	7.在当前框中,我们可以对Zombie和Human的(外观)属性进行一些配置,点击type
 		   *	8.(想换就换)在Icon Shape and Color栏有一个<Select Icon>按钮,点击可以自定义agents的图标【需要先将图片拷贝到项目文件下】
 		   *	9.如果你没有进行 第8步 ,可以使用之前的2DShape editor选择圆点或方点等
 		   *	10.点击OK
 		   *	11.点击next
 		   *	12.点击next
 		   *	13.现在你可以设置infection network的样式。同理
 		   *	14.点击next----finish
		   * */
			//这时已经有一个新的Space Display出现在Displays下面,保存一下。
			//按照之前方式运行simulation,会发现,当human被zombie1感染后会变成zombie2并且会出现zombie1指向zombie2的一条有向边。
			//【注意:有些边可能会扩展space的长度。回想一下,世界是一个圆环,这些边实际上是在 空间space边缘的僵尸之间。 边本身可以是一边缠绕另一边】
		  //数据采集-------------转至DataCollection.java------------
//------>  
		context.setId("jzombies");
		
		ContinuousSpaceFactory spaceFactory=ContinuousSpaceFactoryFinder.createContinuousSpaceFactory(null);
		ContinuousSpace space=spaceFactory.createContinuousSpace("space", context,
				new RandomCartesianAdder(), 
				new repast.simphony.space.continuous.WrapAroundBorders(), 50,50);
		//ContinuousSpace space=spaceFactory.createContinuousSpace(name, context, adder, translator, size)
		
		GridFactory gridFactory=GridFactoryFinder.createGridFactory(null);
		Grid grid=gridFactory.createGrid("grid", context,
				new GridBuilderParameters(new WrapAroundBorders(),new SimpleGridAdder(),true,50,50));
		//Grid grid=gridFactory.createGrid(name, context, params)
		//return null;

	/*前面我们把Context的id 设置为"jzombies"。一般说来,id应该被设置(无论项目名是什么)并且应该将其与context.xml文件中的匹配
	对于创建ContinuousSpace和Grid的投影,首先我们获取它们的合适类型的一个工厂;然后使用工厂去构造最终的ContinuousSpace和Grid。
	两个factory工厂也有相似的参数:
			grid或者space的‘name’;
			与grid或者space相联系的context;
			一个adder,决定哪个位置的grid或者space将会被初始化;
			一个类描述grid或者space的边缘(borders),Borders决定grid或者space在边缘的行为;
			一个尺寸,size
	GridFactory有些许不同表现在它 将 (borders,adder,size)等约束在GridBuilderParameters里,GridBuilderParameters还带了一个布尔值
	决定一次是否允许多个(>1)对象分配一个grid point location。
	
	<考虑到这点,以上代码构造了一个ContinuousSpace名字叫做space并且在Context中想关联。所有加到该空间的对象将会被添加到一个随机位置通过
		RandomCartesianAdder。the border将会缠绕在一起形成一个环面通过repast.simphony.space.continuous.WrapAroundBorders()
		最后空间的维度是50*50>
	<SimpleGridAdder,一个将要添加到grid的对象不会立刻分配location,而是约束在一个类似于‘停车场’的地方等待手工分配【通过一种Grid的方法】>
	借此,我们可以手动设置an agent's Grid location 使得与它的ContinuousSpace location相对应。稍后将会在build()方法中设置。
	*/
	
	//现在,让我们创建agents,添加以下代码,在return context之前。
		Parameters params=RunEnvironment.getInstance().getParameters();
//		int zombieCount=5;
		int zombieCount=params.getInteger("zombie_count");
		for(int i=0;i<zombieCount;i++) {
			context.add(new Zombie(space,grid));
		}
		
//		int humanCount=100;
		int humanCount=params.getInteger("human_count");
		for(int i=0;i<humanCount;i++) {
			int energy=RandomHelper.nextIntFromTo(4,10);//所有的随机数类型的操作都是通过RandomHelper完成的
			context.add(new Human(space,grid,energy));
		}
		//这可能相对直接。我们通过循环执行确定次数的代码,创建指定数量的Zombies和Humans,并添加新的Zombies和Humans到context中。在将它们添加到context
		//的过程中,我们也自动地将它们添加到与context相关联的投影中。因此事实上,Zombies和Humans使用上面描述的Adders被添加到space和grid
	//最后,增加代码移动这些agents到Grid location以及相应的 ContinuousSpace location。
		for(Object obj : context) {//遍历context中所有的对象
			NdPoint pt=space.getLocation(obj);//检索在连续空间每个对象的位置
			grid.moveTo(obj, (int)pt.getX(),(int)pt.getY());//移动到相对应的Grid位置
		}
		return context;
	}	
	
}
/*在我们运行model之前,需要更新数据元以便Repast Simphony runtimes 构建display以及其他的runtime组件:
 * 	打开Navigator-项目-项目名.rs文件夹,选中context.xml并打开;
 * 	我们需要在其中配置 context:你的models使用的context;projection:与context相关联的投影:
 *		XML编辑页面有两个视图Design和Source,点击Source,在<context><context/>中添加我们的contexts包含的投影,它有两个属性id和type
 *		id是投影的名字,比如‘grid’和‘space’【我们曾在在ContextBuilder代码中使用】;
 *		type是投影的类型: continuous space或者grid
 *		将下面两行代码添加至<context><context/>中:[当你在<context><context/>中输入‘<’时,eclipse会自动弹出<projection>的默认值]
 *		<projection type="continuous space" id="space"/>
 *		<projection type="grid" id="grid"/>
 */

//下面是时候启动我们的model了。
/* 当我们使用Repast Simphony创建我们项目时,它会自动创建一个Eclipse启动台,我们可以使用它们启动model;如果你点击Eclips<运行>按钮右边的下拉菜单按钮
 * 你会有多种Model:点击选择‘项目名  Model’并<运行>
 * 
 * 然后会弹出Repast Simphony Runtime 界面。
 * 		我们需要对其进行一些设置以使用context builder去初始化我们的model并且创建一个初始化display【主要通过指定Data Loader】
 * 			1.右键点击Data Loaders--Set Data Loaders
 * 			2.在弹出的Select Data Source Type窗口选择 Custom ContextBuilder Implementation,点击<next>
 * 			3.你会看到我们的jzombies.JZombiesBuilder类[没有请go back去检查你的代码],点击<next>-点击<finish>
 *			4.Data Loaders 下方会出现 JZombiesBuilder作为Data Loader
 *		下面让我们创建一个简单的display
 *			1.右键单击Displays--Add Display
 *			2.在弹出框中设置name为‘Space Display’;type为 2D
 *			3.选择我们的‘space’作为想要display的一个;点击“Projection and Value Layers”部分的‘space’--然后点击<绿色的向右的箭头>--
 *			--右边即为我们将要display的projections,而左边那些则是可能会
 *			4.点击<next>
 *			5.选择Human和Zombie agents【将左边的全部移到右边;如果Zombie不在右侧的顶部(第一个位置)使用<上下箭头将其移动到顶部--确保Zombie不会被Human所覆盖>】
 *			6.点击<next>
 *			7.在当前框中,我们可以对Zombie和Human的(外观)属性进行一些配置,点击type
 *			8.在2D Shape Editor 中进行相应Icon shape and color的修改
 *			9.点击<next>
 *			10.点击<next>
 *			11.点击<next>
 *			12.点击<finish>
 *	你会看到在Displays下方出现了Space Display,然后保存你的操作【点击左上方的<保存图标>】
 *
 */
//现在,可以运行我们的model了,按钮功能 --略。
//我们会看到有5个color1的Zombie和100个color2的Human。
//如果你重复点击<step>按钮,会发现Zombie move around,当他们确实接近一个Human时,Human会run away
//注意当Zombie周围有一群Human时,它会表现出饥饿,这个位置是最满足的地方,所以Zombie不会移动。
//当然你也可以点击<play>按钮顺序执行,如果感觉model 跑的太快可以在 (左下方)Run Options中改变‘tick delay’的值。

//现在让我们回到代码,添加一些附加行为。重新打开Zombie.java,并添加一个新的方法infect()感染
//--------在Zombie.java------infect()中继续---



4.DataCollection.java

package jzombies;

public class DataCollection {
//1.1.1数据采集
/*我们想要记录的数据是,在每一个时间步Zombies和Humans的数目。Repast Simphony 是从Data Sources中记录数据。向导(程序)可以定义Data Sources
 * 或者你可以自行创建。Data Sources(数据源)有两种类型Aggregate和Non-Aggregate(聚合的与非聚合合的)。聚合数据源接受一个对象的集合
 * (比如,agents)并且通常返回在所有对象上计算的一些聚合值。比如,一个聚合数据源或许为每一个对象调用一个方法并且返回最大值;
 * 非聚合数据源接收单个对象(比如单个的agent)并且返回一个值。比如,一个非聚合数据源或许在一个agent上调用一个方法并且返回方法调用后的结果。
 * 【请注意:Repast Simphony将负责将那些对象传递给数据源以及实际的数据收集。 您只需要定义数据源。】
 * 		数据采集在Repast Simphony中通过定义上面描述的数据源进行设置。这些数据源被采集到数据集中。想象一下数据集作为一个生产那些【每列代表
 * 	一个数据源,每行是对应数据源的返回值】列表数据的模板。下面添加一个数据集,
 * 		1.启动项目
 * 		2.右键单击Data Sets---Add Data Set
 * 		3.在Data Set Editor中,设置Data Set ID为Agents Counts,Data Set type为Aggregate。回想我们想要记录每一个时间步的
 * 			Zoombies和Humans的数目。这些计数(counts)被视为集合操作,因为它们对agent集合进行操作。
 * 		4.点击next
 * 		5.在这一步,指定数据源(data sources).你可以添加一些标准数据源到你的数据集通过Standard Sources。选择Tick Count(刻度计数)
 * 			 将会创建一个返回当前tick(刻度)的数据源,Run Number将会返回当前的运行数,Random Seed将会返回当前的随机种子。这里我们选择Tick
 * 			Count
 * 		6.点击Method Data Source。你可以创建一个【在模型的agents上调用一个方法然后在方法调用返回的返回值上执行一些聚合操作】的数据源
 * 		7.点击<Add>按钮。你会看到新出现一行添加方法数据源的列表
 * 		8.双击那行列表的Source name空项并输入Human Count
 * 		9.如果Agent Type 不是Human可以双击进行选择
 * 		10.如果Aggregate Operation不是Count,可以双击进行选择。此项决定在方法调用的结果上执行的顺序是什么。比如,可以选择最小值,最大子,平均值
 * 			的执行顺序。Count操作返回的是在simulation过程中 在Agent Type中指定的agent类型的对象的数目。 这里没有方法调用实际适用,因此应自动
 * 			设置为N/A。
 * 		11.重复第 7 步 到本步骤 以添加新的一行以提供 Zombie的count。(Custom Data Source,你可以输入一个类名既可以继承自聚合数据源也可以是
 * 			非聚合数据源。在本模型中我们不使用)
 * 		12.点击next
 * 		13.Schedule Parameters栏,你可以在数据将要被记录的时候编辑。我们想要记录数据在所有Zombies移动后。回想我们scheduled的Zombie.step()
 * 			方法,其中start=1 and interval=1.我们想要在这之后记录我们的数据。【注意:Priority的值Last 能够确保记录的是所有Zombies移动后的】
 * 		14.点击Finish
 * 	现在你应该看到在Data Sets下一个有一个Agents Counts节点.
 */
 //1.1.2 写数据。
	/*如果我们现在运行模型,数据将会被记录但是我们没有设置将它写入的地方。Simphony可以将数据写到一个文件和console中。Console输出展示在Eclipse
	 *的console中,并且对于debugging也是有用的。文件输出将会将记录的数据写入到一个文件中。我们可以通过定义一个File Sink创建一些文件输出。
	 * 		1.右键单击Text Sinks --点击Add File Sink
	 * 		2.File Data properties 中可以选择我们想要file sink写入的数据。设置File Sink的name为Count Output。如果我们曾经创建过超过
	 * 		一个数据集,我们可能需要从Data Set ID下拉框中选择(本示例只有一个默认的Agents Counts数据集)。在Data Set ID下面可以看到有两列。
	 * 		第一列 列出了与当前选择的数据集相关的数据源;第二列展示将要被写入到文件中的数据源。依次 点击左侧的数据源--点击向右的箭头--将其移动到右侧
	 * 		(将要被写入),你可以点击向上或向下的箭头调整数据源的顺序。
	 * 		3.点击next
	 * 		4.File Properties 可以设置一些附加的文件属性:文件名和放到文件名里的媒体数据(比如,当前时间)(我们可以使用默认)。Delimiter指定用
	 * 		那种字符(串)去分隔数据。Format Type 可以是 列表(tabular)或者(line)行。tabular是经典的CSV文件格式,
	 * 		line在每个数据值之前,数据源名称后 加冒号。用本示例描述的话,就像  tick:1,Human Count:20,Zombie Count: 5
	 * 		5.点击Finish
	 * ---点击保存---
	 * 现在可以运行simulation,然后看一下输出。初始化并运行模拟(100 or so)100个左右的tick。默认输出将会被写入到项目目录下。在Eclipse中,
	 * 右键单击根目录‘项目名’,点击Refresh刷新。将会看到一个文件名类似于ModelOutput.2018.九月.20.19_05_23.txt的文件。
	 * 双击后会看到记录的数据
	 */
 //1.1.3创建一个图表。
	/*我们可以使用相同的数据集去创建一个时间序列类型的图表--绘制随着时间的推移的Human Zombie计数
	 * 		1.如果你已经完成了运行,确定重置simulation。右键单击Repast Simphony中的Charts----点击Add Time Series Chart。
	 * 		2.设置name为Agents Counts Chart,选择Agent Counts 作为数据集(如果没有添加额外的数据集的话,它应该是默认的),点击next
	 * 		3.Chart Data Properties你可以选择数据源去绘制图表,也可以为每个数据源指定指定图例标签和颜色。每个被选择的数据源在图表中将会转化
	 * 			成序列。点击复选框选择Human Count和Zombie Count。默认的标签和颜色很好,当然你可以双击修改
	 * 		4.点击next
	 * 		5.Chart Properties 可以设置图表属性。title设置为 Agents Counts ,Y-Axis设置为Number of Agents。默认属性is fine,
	 * 			你也可以自由改动Color颜色和X-Axis Range(长度和宽度)范围。X-Axis Range值设置为-1的意思是完全显示在x轴里,其它值则是
	 * 			指定范围。
	 * 		6.点击Finish。
	 * 一个新的Agents Counts Chart已经建好,点击保存。
	 * 运行simulation,你会看到一个随时间变化的Zombie Human 计数变化图表。可点击Repast Simphony的display栏底部的Agents Counts查看。
	 * */
 //1.2. 模型参数
	/*曾记否,我们辛辛辛苦苦敲代码在JZombieBuilder中初始化我们的zombies和humans的数目。现在我们可以通过model parameters调整它们。
	 * model parameters 即模型的参数,用户可以通过GUI进行设置。我们可以在Repast Simphony Runtime中构造这些。
	 * 	从eclipse中启动项目-->使用在Repast Simphony左侧底部的GUI,选择Parameters-->点击<Add Parameter>(左上角的‘+’号)按钮,然后
	 * 	将会弹出Add Parameter对话框。
	 * 	对话框包括以下内容:
	 * 			Name--这个参数的唯一识别符。每个模型参数都应该有唯一的名
	 * 			Display Name--在此模型参数的参数面板中使用的标签。 这不一定是唯一的。
	 * 			Type--可以是int,long int,double,或者string类型。你还可以添加任何其他类型的完全限定名称
	 * 			Default Value--参数的初始值
	 * 			Converter--【选填】类名,继承自repast.simphony.parameter.StringConverter.StringConverter可以将非标准类型转换
	 * 				为String或从String转换非标准类型。 除非使用int,long,double或string以外的类型,否则这不是必需的.
	 * 			Values--[选填],所选类型的空格分隔值列表。 该参数将限制为这些值
	 * 下面添加我们的模型参数
	 * 		1.Name:zombie_count
	 * 		2.Display Name:Zombie Count
	 * 		3.Type:int
	 * 		4.Default Value:5
	 * 		5.点击OK
	 * 		6.继续添加下一个
	 * 		7.Name:human_count
	 * 		8.Display Name:Human Count
	 * 		9.Type:int
	 * 		10.Default Value:200
	 * 		11.点击OK
	 * 
	 * 想要使用我们设置的模型参数我们需要retrieve它们。我们可以使用 RunEnvironment singleleton获得Parameters对象。
	 * 我们可以使用getInteger(String paramName)获得整型参数的值。对JZombieBuilder做以下改变,替换硬代码的zombieCount值	:
	 * 		//correct import: repast.simphony.parameters.Parameters
	 * 		Parameters params=RunEnvironment.getInstance().getParameters();
	 * 		int zombieCount=params.getInteger("zombie_count");	
	 * 		//同理,
	 * 		int humanCount=params.getInteger("human_count");
	 * 
	 * 重新运行项目,我们可以通过修改Parameters的值来获得不同的simulation。
	 * */
 //1.2.1 随机执行和参数扫描
	/*大多数Repast模型使用随机抽取,因此是随机模拟。随机模拟将针对不同的随机数流产生不同的结果,这通常通过选择不同的随机种子来驱动。这种模拟
	 * 应该被重复执行以探寻可能的空间结果。即使没有随机性,通常也应运行模型灵敏度分析参数扫描,以确定模型对输入值变化的响应。Repast提供了本地的和分布
	 * 的工具,用于自动完成随机执行运行和参数扫描。 有关详细信息,请参阅Repast Simphony Batch Runs入门文档。
	 */
 //1.3外部工具
	/* 我们也可以连接一些外部分析工具.
	 * 某些工具要求您(用户)下载其他软件,其许可与Repast Simphony不同。其中三个工具是Repast Simhony的内部工具,应该可以开箱即用。
	 * 如果将鼠标悬停在按钮上,您将看到按钮所指的分析工具的名称。可以使用以下分析工具集成。
			•RStudio统计计算应用程序
			•代理商及其属性表
			•电子表格(默认为Excel)
			•JUNG(在网络上提供一些统计数据的内部工具)
			•将地理图层导出到Shapefile
			•Weka数据挖掘应用程序
			•Pajek网络分析应用程序
			•JoSQL(运行SQL就像模拟组件上的查询 - 上下文等)
		我们现在将尝试与Excel集成。再次启动jzombies模型初始化并运行模型几百个滴答。单击Spreadsheets工具插件按钮(带有计算器图标的按钮),
		然后单击Next。如果您的计算机上有Excel,则默认位置可能正确。否则,请通过“浏览”按钮选择适当的位置。单击Next,您将看到
		File Sink'Count Output'被选中(图21)。单击“完成”,Excel将启动,并显示电子表格中显示的数据。我们建议您自己尝试各种其他外部工具插件。
	 * */
 //1.4 分布式模型
	/*	     可以通过install builder将Repast模型分发给模型用户。此功能将您运行它所需的所有软件以及正确配置的Java运行时环境所需的所有软件打包到一个
	 * 可以提供给模型用户的一个Java归档(“JAR”)文件中。生成的安装程序可以在Java版本等于或大于您用于编译的版本的任何系统上执行该模型。例如,如果使用
	 * Java 1.8编译模型,则必须使用Java 1.8或更高版本来运行已安装的模型。用户只需将安装程序文件复制到Windows,Mac OS或Linux计算机上,然后双击
	 * 该文件即可启动安装程序。安装程序启动后,将显示一个安装向导,该向导将提示用户输入安装模型所需的信息。如果需要,安装程序也可以在命令行模式下运行。
		     为模型构建安装程序非常简单。在Eclipse中,只需选择“为此<模型名称>模型构建安装程序”,并提供安装程序文件的位置和名称。安装程序文件的默认名称
	      是“setup.jar”,适用于大多数用途。然后,安装构建器将打包并压缩您的模型和支持Repast软件。生成的安装程序文件大约为70 MB,加上模型代码和数据的
	      大小。 75 MB到80 MB是常见的总大小。
	      Repast安装构建器使用IzPack系统。有关安装程序自定义和使用的更多信息,包括命令行激活,可以在IzPack网站上找到。
	*/
}

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值