Agent建模之Repast建模编程介绍

来源:互联网 发布:怎么查看计算机端口80 编辑:程序博客网 时间:2024/04/30 14:16

Repast下载地址:http://www.10pig.cn/index/repast.aspx

Repast J的编程使用详细内容可以参考安装目录下的how-to目录中各文件说明,api目录,demo目录的例子,简要介绍参考:http://l-eme.gdcc.edu.cn/ztzs/fzxt/4-3.htm

安装了Repast J后,在其安装目录下有如下几个文件夹:

api:给出了Repast主要包中类及方法的API,供编程时候查阅

how-to:介绍了如何建立agent模型,如何调用库进行画图、画表、设置输入参数、多次运行、图、空间等

demo:给出了十多种不同的agent模型的案例源码供参考和学习。有哪些不会用的就可以到这里来参考。


需要注意的地方:

将lib中的所有包导入,但不要忘记导入repast.jar包,uchicago在此包中。

以下内容来源于:http://l-eme.gdcc.edu.cn/ztzs/fzxt/4-3.htm

尽管不一定必须应用SimModel接口,但应用这个接口可将底层和表层的建立过程分到不同的方法组中,使得模型的结构与设计过程清晰明了。

用 SimModel和 Template类建模的典型的模型结构包括以下三个方法:

(l)private void buildModel()

buildModel负责创建代表模型的底层结构部分。主体对象、环境对象,还有一些可选的数据收集对象常在此创建。如,在糖域模型中,SugarModel在 buildModel()里构建了 SugarAgents和 Sug-arSpace

(2)private void buildDisplay()

bllildDi8PIPy建立了那些用于处理向用户显示模拟的表层结构部分,所以那些只以批处理方式运行的模型很可能不需要实现这个方法。SugarModel通过它建立了显示主体和图的类。实际创建 Dis-playsurface对象则通常放在一个预定义的 setup()方法中,稍后再说明这个方法。

(3)private voidbuildschedule()

buildschedule建立负责改变模型状态的时间表——何时运用什么方法调用什么对象的时间表。

SimpleModel作为模型类的基类,可根据需要继承扩展(特定化)。具体实现如下:

Import uchicago.sre.sim.engine.SimpleModel;

Public class MyModle extends SimpleModel{…

}

第一行导人了SimpleMOdel,第二行继承了SimpleModel。下面按建模过程的两步法建立完整的模型类:

第一步:设t模型

SimPleModel提供了两个方法作为实现这一步方便填充的框架:setuP()和 buildModel()。他们可以按如下方式使用(以 IPD为例):

Import uchicago.src.sin.engine.SimpleModel;;

Public class MyModle extends SimpleModel{

Public static final int TIT_FOR_TA=0;

Public static final int ALWAYS_DEFECT=1;

Private p1Strategy=TIT_FOR_TAT;

Private p2Strategy= ALWAYS_DEFECT;

??? Public voide setup () {

????? Super.setup();

????? P1Strategy=TIT_FOR_TAT;

????? Private p2Strategy= ALWAYS_DEFECT;

???? }

Public voide buildModel () {

????? Player1 p1=new Player(p1Strategy,p2) ;

????? Player2 p1=new Player(p2Strategy,p1) ;

????? agentList.dss(p1) ;

????? agentList.dss(p2) ;

??? }

}

在 setuP()中,首先调用 super.setup()使 SimpleModel实现自身的创建,然后设定了行为者的策略。这里假设行为者的策略可以通过用户的干预,或者可能在先前的模型运行过程中从缺省值改变。setup()让模型的变量值重新回到缺省值。setup()在模型启动时或单击控制条中“setup”键时被调用。当setup()启动一个模型时,调用 buildModel()来创建模型所需的对象,所以应在这里创建主体对象,并将其加人对象的列表 agentList中。agentList是由 SimPleModel为此提供的一个ArrayList。在Setup时所有的参数都恢复到缺省值,所以在这里不能构造基于参数值的对象。在上面的例子中,两个参与者中一个根据其初始策略决策,另一个根据对手的策略决策。

模型的执行顺序是:setup()调用在先,buildModel()调用在后。如上所述setup()在模型一被启动就被调用,当点击“set-up”键时也会被调用。buildMOdel()在模型运行时(即“ run”或“step”键按下时)被调用,这就为用户通过图形界面接口改变变量提供了机会。

第二步:实际运行模型的动作规定

完成模型的设置后,第二步考虑的就是要如何限定模型在每一个时间步上的行为。SimpleModel为完成这一步提供了三种方法:prestep()、step()和 poststep()。在每一个“标记”(tick)上他们依照次序被执行:首先是PresteP(),然后是step(),最后是postStep()。要特别注意的是,区分steP()中的核心行为与必要的之前和之后的过程。由于下面的例子并不需要之前和之后的过程,所以只实现step()一个方法。

Import uchicago.src.sim.engine.SimpleModel;

Pulic class MyModel extends SimpleModel {

Public static final int TIT_FOR_TAT=0;

Public static final int ALWAYSZ_DEFECT=1;

Private p1Strategy= TIT_FOR_TAT;

Private p1Strategy= ALWAYSZ_DEFECT;

Public voide setup () {

????? Super.setup();

????? P1Strategy=TIT_FOR_TAT;

????? Private p2Strategy= ALWAYS_DEFECT;

???? }

Public voide buildModel () {

????? Player1 p1=new Player(p1Strategy,p2) ;

????? Player2 p1=new Player(p2Strategy,p1) ;

????? P1.set()therPlayer(p2)

????? P2.set()therPlayer(p1)

????? agentList.dss(p1) ;

????? agentList.dss(p2) ;

??? }

Public void step() {

??? Int size=agentList.size();

??? for(int i=0;I<size;i++) {

????? Player p=(Player)agentlist.get(i) ;

???? p.play();

??? }

}

}

?? 此处的steP()方法中,首先将每个参与者从对象列表agentList中调出,然后逐个调用play()。此时的假设是,当调用play()时,一个参与者与另一个参与者博弈。在 step()方法中,常常需要遍历所有的主体,并且调用任何有关它们之间交互的方法。当模型运行的时候,step()方法将会在每个时间步(标记)中被执行。

一个不同的决策可能需要一个 PresetP()或者 PoststeP()方法。例如,在一个有许多参与者的合作决策中,在每个参与者与它的邻居进行博弈并产生结果后,每个参与者选出邻居中最好的策略,并将自己的策略相应地进行调整。在这种情况下,实际的决策将在steP()方法中决定,对邻居的选择和策略调整将在PoststeP()方法中发生。

Repast还可实现更为复杂的主体行为、模型事件等时间序列安排,甚至可实现动态的时间序列,而使用SimpleModel的目的是为了简化时间序列的设计。时间序列机制的相关内容,包括具体的使用方式,将在后文“典型内部机制”部分做更详细的介绍。