ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:4.08MB ,
资源ID:4909128      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4909128.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RePast如何使用中文版非常全面的翻译.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

RePast如何使用中文版非常全面的翻译.docx

1、RePast如何使用中文版非常全面的翻译RePast如何使用,中文版,非常全面的翻译A RePast Tutorial by John T. Murphy, University of Arizona & Arizona State University (contact) (请尊重作者版权)译者:Brian Yang, Anhui Normal University (*)原文链接:1.如何生成一个 RePast 模型RePast仿真工具箱是一个预先制作好的编程元素的集合,这些元素可以让你相对容易地构建基于主体(Agent-Based)的仿真模型。但是,有些步骤,明显不是直觉上的,却也没有在

2、任何我所找到的文档里解释清楚;这个简短的向导能让你按照步骤一点一点实现我们的目标。概要/*译者注:为了使用RePast,你的电脑需要配备JDK(安装后最好配置一下环境,如果装有Apple的QuickTime,那么恭喜你,请卸载QT吧,否则配置会出问题;不配置也行),再下载Eclipse和RePast J,给出三个下载的页面链接(2011/7/28):JDK ,Eclipse: 点击直接下载RePast J: (点击直接下载)注意这里并没有使用RePast官网主页面的RePast Simphony的链接,因为我们做的例子是基于Java的,Repast J足够了,注结束*/一个基本的RePast模

3、型包括以下几个元素(这个太重要了!):1.一个Model对象,它用来作为模型本身,运行也是从这个文件运行2.一个Space对象,即空间对象,它控制行为发生的环境3.一个Agent对象,即行为主体对象其实理论上有的时候是可以忽略掉详细的Space对象的,即不去创建这个Space.java,但是我们很少去这么做。因为一旦它被忽略,那么agents就可能被默认在一个无限的空间内生存,或者是默认在一个极小的空间内,以至于无法和别的agents进行交互,那么就丧失了仿真的意义。在这几个元素当中,建立起来最复杂的是Model对象,它会被第一个执行并且控制着整个仿真过程,因此我们从Model对象来一步一步往

4、下说比较合理。2.The SimModel Object (Repast J中的一个对象)Model对象会继承RePast的SimModelImpl对象。我想,你绝对不会看许多SimModelImpl对象实现的代码,但是事实上这些代码是最重要的,因为它控制了整个RePast环境和仿真的过程。而且,它预期在你创建的Model对象中找到一些东西 不幸的是这些东西没有一个真正的Interface(接口)正式,但是思路是差不多的。你创建的Model对象将会被分块在Eclipse上设计,其实就是一个功能一个功能往上加,并且最终由RePast J的工具条上的按钮触发运行。第一个按钮用来打开一个模型,红叉用

5、来关闭一个模型,红叉左边的小灯泡用来设置参数;最重要的是第三、四、五个按钮,第三个表示运行,第四个表示单步运行,第五个表示初始化模型;第六个表示停止,第七个表示暂停,第八个按钮(循环箭头)表示截断并将仿真恢复到未初始化状态。(这些按钮的名称务必记住,后面讲到时不再附图)我们先做一个小小的测试模型,下面译者一步一步实现给大家看:/*译者注1.打开Eclipse,文件,新,Java项目,项目名填上MyFirstRePastModel,Next此时界面应该是:2.选择第三个标签:库,右边按钮“添加外部JAR”3.(3,4两步很重要)选择安装RePast的文件夹RePast 3,进入后打开RePast

6、 J,单击选中repast.jar文件,点击打开4.重复步骤2,进入RePast J文件夹后,直接双击打开lib文件夹,Ctrl+A实现全选,点击打开,然后完成 (如果以后写代码时出现包未导入的提示,说明这两步你没有导入成功,这两步其实很no-brainer的:就是把repast.jar和lib文件夹下所有的jar文件都导入就行了)5.最后点击完成不要管我其他的项目此时,就完成了与RePast J的连接,说白了就是在Eclipse中写代码,然后让RePast J 环境运行,导入外部的这些jar文件,目的是写程序时需要导入诸多Repast包,此时再回头看看教程1里的第一句话:RePast仿真工具

7、箱是一个预先制作好的编程元素的集合。6.双击打开MyFirstRePastModel,右键src,新建,包,包名填上demo(随意),完成7.右键demo,新建,类 (分别新建三个类,我这里分别取名为Model,Space,Agent) 8.对于Model.java,仅保留第一行代码(如右上图所示),然后开始在Model里,请一步一步添加代码,自己敲一遍的过程可以把我们以后要用到的基本方法都熟悉一遍 */9.我们的模型,主类首先继承SimModelImpl,还必须自己扩充一些方法(methods)。比如,必须有一个getName方法来返回正在仿真模型的名字,这个名字出现在设置参数的面板的工具栏

8、里。这里默认你懂得Java基本的知识,虽然译者对于Java也只能算是初级的水平。下面是getName实现的代码,注意,为加深大家印象,我特意截图,你们不得不自己敲。这里说明一下,教程2的代码全部在package demo; 这一句下方添加。10.但是,这里还有更多的需要。当你在RePast 工具栏上点初始化按钮的时候,RePast将会触发一个在你模型当中叫做begin的方法,这个方法是为了初始化仿真器。注意,从这里开始,每新加入的代码都用红色粗体标注。11.用技术上的术语来说,SimModelImpl类是一个抽象类,它实现了一个接口;接口需要实现某些方法,我们已经看到的begin()和getN

9、ame()就是其中的两个需要实现的方法,马上还会看到更多;然而,有一个附加的框架,虽然不是Java也不是RePast包必须要求的,但是它是更加简单更加传统的方法,用来组织程序。就是将begin()方法分块:buildModel,buildSchedule和buildDisplay。因此,此时代码变为:我前面说了,这种结构不是必须的,你可以按照你自己的方法来。但是,unfortunately,当你发现许多其他RePast模型都这么写的时候,你就不淡定了。而且事实上这样写有很多优点,所以你以后也这么写吧。12.没有必须的、明确的方法用来实现运行、暂停和停止函数,尽管他们依赖于模型中核心的成分。但是

10、有另外的三个函数是必须实现的。第一个是setup函数,当循环箭头被按下时调用该函数,我通常把这个setup函数放在begin函数前面,个人喜好。13.第二个是getSchedule函数,它必须返回一个Schedule类型的对象。每一个RePast模型将至少有一个schedule对象。一般的,通过加一个schedule对象作为类变量来生成。注意:Schedule是一个对象,schedule是一个变量,这是Java传统规范规定的。因此:注意到,为了添加一个schedule对象,必须导入该类的包,一个schedule变量在变量域声明,其方法在下方添加。/*到这里,译者简单说下,schedule主要是

11、运行方法,尤其指时间上的安排*/这里有一点奇怪,schedule对象是model的内部的,却被声明为private,这样的话,就不能直接被外部程序或者是对象获取。然后,getSchedule方法作为公共方法被给出,从而间接的将schedule对象传递给外部程序或者是其他对象。显然,直接把schedule给它们似乎更高效,所以把schedule声明为public类型的岂不是更好?当然不行,这简直糟透了。马上RePast引擎就要启动了,它必须要获得模型的schedule,这就必须通过调用getSchedule方法,而这个方法有时SimModelImpl接口所必须实现的。所以,编译器强迫你得这么写。

12、好吧,如果你真的把schedule设成public类型的了,那么RePast引擎就会直接找schedule,这就无法确保编译器是不是温柔了,改了值也不一定。更加重要的是,通过遵守内部变量一律设置成private而且有对应的方法可以间接存取,程序员就轻松了,想怎么实现内部schedule就怎么实现,they are free 在这个例子中,我命名我的schedule对象为schedule,但是这不是必须的,可能有更加间接的名字,比如sch等等。更更更加重要的是,我可以生成一个Schedule类的子类并且添加更多的功能函数,或者干点其他的事来满足我的需要;只要getSchedule方法返回一个合适

13、类型的对象就行了,根本不用管它是不是还做了其他额外的工作,RePast引擎都会很开心,因为getSchedule的工作圆满完成了。最后,我们注意到public/private在这里的重要性并没有它应该有的那么大;我们可以让我们的schedule对象是public的,并且不用太在意它,因为相对于使用我们构建的API的其他程序员来说,我们更加懂得这个模型是怎么使用的,因为模型就是我们做的。14.最后一个必须的函数比较复杂,它叫做getInitParam,它返回一个字符串变量数组,该数组列出了一组特殊变量的名字。你将在RePast控制面板设置这些变量。假设你想要一个实现了N个实体的仿真器,但是你又想

14、能够通过点击setup和initialize按钮来运行不同的N个实体来进行仿真实验,巧了,RePast允许这样,但是:你必须提供给RePast一个参数列表,这个例子里叫做numAgents你必须为每一个列表中的参数创建get和set方法,注意,是每一个下面是控制面板和这一步的代码: 15.典型的编程实例和特殊的RePast结构需要我们提供get和set方法;最后,你得告诉RePast你想能够通过控制面板来设置这些变量,你需要实现getInitParam方法,完整代码:其实你们不知道,大写是件很难搞的问题,因为变量是NumAgents但是get和set方法变成了getNumAgents(注意这里

15、N是大写)和setNumAgents。事实上,RePast到时候会自动寻找名为”get” + ”NumAgents”和”set” + “NumAgents”的方法,因此找到了”getNumAgents”和”setNumAgents”方法,具体的你们不必深究。注意:getInitParams返回的是一个字符串数组;但是到目前为止我们只有一个字符串会被返回,那就是”NumAgents”;我们学到后面会发现要返回的有很多,绝对不止一个,那么可以这么写:即使只有一个返回的参数名,返回类型也必须是数组类型。其中的告诉我们,返回的其实是一个指向字符串数组的指针。/*译者注:到这里为止,原作的教程2部分就完

16、全结束了。我想大家跟我第一次看这个的时候心情是一样的,估计早就已经迫不及待的点了运行,然后发现竟然要配置运行环境,然后又不管三七二十一直接点了运行,发现Eclipse在苦苦的找main函数,最后弹出个令你灰心丧气的窗口,不得不放弃了。这时候你心想,这不坑爹呢嘛我敲了那么久的代码,压根不能运行啊。这时候请你回想当初说RePast需要的三个因素,我们到底实现了几个?即使是Model我们也没有实现啊同志们!这个教程2只是为了让我们了解我们今后为Model编程时一些必须的参数或者是方法,这些只是基础中的基础。或者可以说,这些是任何Model的框架,我们今后写项目,就是往这里面填内容,RePast很难的

17、,等你继续往后再学个十几个教程你就知道了。等到学完了教程,实现了那个例子,你又跃跃欲试想写个新的,你又会发现自己什么都不会!就是这样的,哪有随随便便就学会一个新工具的,何况主要的部分是在扩充别人的东西,如果你对那些预先做好的元素不熟,做一个新项目简直就是自杀行为。到这里,我现在把主要的内容总结一下,求求你们了,一定要耐着性子再看几分钟:继承SimpleModel类a)buildModel:创建模型中的智能体对象、空间对象等。b)buildDisplay:建立显示界面内容,包括空间对象的显示、统计图表等。c)buildSchedule:建立程序的运行方法d)Setup:设置/初始化程序(与仿真界

18、面中的setup图形按钮相对应)e)Step:每个仿真时钟向前推进一个单位时,需要执行的操作(与仿真界面中的step图形按钮相对应)f)Begin:程序开始运行,其中需要调用buildModel, buildDisplay, buildSchedule三个方法g)getInitParam:在Settings窗口中显示和编辑的参数名序列h)getSchedule:显示模型中的运行schedule(buildSchedule方法中创建)i)getName:返回模型的名字单单教程1和2,翻译加上做Word文档就用了6个小时!从下一个教程3到最后一个教程,长达30个!而且都只是围绕一个模型来的,如果一

19、步一步来做,收获会非常大!有人把这个例子实现了,又抄了抄帮助文档,竟然发了一篇文章,真是唉,中国的学术3.The CarryDrop model (掉钱捡钱模型)假设我们想创建一个基本的RePast模型,该模型有以下以下特点:Agents只在有限的网格区域内移动Agents总是沿上、下、左、右、左上、左下、右上、右下八个方向呈直线移动区域内每个格子都有可能放着一些钱;当agents走入一个有钱的格子后就会捡起所有的钱,并且之后也带着这些钱移动当一个agent移入一个格子,而恰巧格子里已经有了一个agent,那么碰撞发生,新移入的agent需要付给原先占据格子的agent一个单位的买路钱,并且立

20、刻选择一个新的方向在下一个时间片到来时移出格子,新的方向同样允许八个方向Agents有生命期,这个生命期由参数给出,参数有一定的范围(min, max);当一个agent死亡后,它生前拥有的钱全部随机分散到区域中的格子里,然后把这个agent从格子里抹掉,即清空格子,但是随即又有一个新的agent在不同的格子里诞生,其拥有新的移动方向规律和新的生命期为了达到这个目的,我们需要三个文件:一个实例化SimModel对象的类,一个指定agents的类,一个描述space的类。请按照之前的教程,新建名为CarryDrop的工程(别忘了添加外部JAR!),在src里新建名为demo的包,在demo里新建

21、三个Java类:CarryDropModel / 与之前不同的是,需要加入Main方法,代码如下图CarryDropAgent / 新建后暂时不管CarryDropSpace / 新建后暂时不管细心的话,你应该会发现,这个时候右键,运行,就会出现一个运行方式是“Java应用程序”,而不是先前的运行配置,但是现在依然运行不起来,到底缺少的是什么呢?缺少的东西有很多,事实上。4.添加用户可设定的参数让我们考虑一下哪些参数需要设置为用户可设定:Agents数量 (NumAgents) 区域X轴方向长度 (WorldXSize) 区域Y轴方向长度 (WorldYSize)既然要引入两个新的变量,就需要

22、:在类变量域添加新的变量在面板上加入变量与变量之间相隔的线添加变量相应的get和set方法从这里开始,由于代码越来越长,对截图造成极大不便,所以只截出添加新代码的那部分:还有:5.编译和运行基本模型我想大家等待着一刻都快疯了吧?别着急,直接运行还不行,得再加几个东西。还有Main函数导入包不多解释,需要解释一下Main函数里的三条语句:第一行创建了一个SimInit类型的对象,导入部分就是为了它第二行创建了CarryDropModel类型的对象,就是实例化了模型对象第三行用Init对象里的loadModel方法装载模型在CarryDropModel.java编辑区,右键,运行方式,Java应用

23、程序,然后出现:看右上方的工具条和参数面板的GUI,你发现可以输入数字,但是现在输没有任何意义,我们运行只是为了看一下效果,帮大家缓解一下欲望。你要真是实在忍不住点击了运行按钮,你会发现它蹦出一个窗口:6.用户可设定的参数的 默认值看上上一张图,你会发现参数面板上各个参数值都为0,这样的话,不太可能启动模型,所以我们来为三个参数设定默认值:要修改的代码就这一部分,添加三个常量并赋值为100,40,40,再用常量为初始化变量域,对于Java不熟悉的人来说,你不要管常量怎么声明的,按照上面的方法声明就对了。有些人认为为这些用户运行时要设定的参数赋上初值没有什么意义,确实没意义,但是这是一个非常好的

24、编程习惯,很多小细节的把握会让你的编程水平越来越高。7.子程序的提醒为了示范和教学目的,现添加以下代码,来输出提示信息,在CarryDropModel.java中:现在再运行一下模型看看效果吧!这些代码是完全无害的。在Eclipse运行之后点击工具条上的运行,除了之前说的效果之外,你会发现RePast Output会出现:8.Space 对象从这节教程开始,我们暂时先跳出model对象的构建,来考虑其他两个对象:CarryDropSpace和CarryDropAgent。首先我们考虑一下Space对象。Space对象似乎一个单独的对象,它将包括预先打包好的RePast空间环境因素;这个例子我们

25、使用的是RePast的Object2DGrid对象。一开始我们来为网格空间对象定义变量。Object2DGrid是一个RePast里专门为我们做好了的Space对象;有些它提供的函数还不得不使用,所以先导入这个包:这个例子中,只创建space对象是不够的。不管怎样我们先把这个对象必须的一些东西写好。这个moneySpace存储的是一些整数对象,好吧你可以认为是整数,但是实际上与整数相差甚远。整数对象的值代表着在网格里放着的钱的总数,为了方便,我们一律初始为0:上面的代码告诉我们,Object2DGrid对象的构造器需要两个整数作为参数,分别对应的是X和Y的大小。你肯定问你怎么知道?!开始,所有

26、程序,RePast 3,RePast J,docs,API。既然提到了钱,那么肯定不能全部都是0,所以我们现在来为space对象初始化一些钱。我们的策略将是创建一个构造器,它需要一些钱的参数来初始化space对象。这个时候,肯定需要一个参数:钱的数量。仔细考虑一下这个参数放在哪,Space空间吗?不,个人认为放在Model对象里好一些,为什么?自己想(参数初始化明白了么?):还有下面:别忘了get和set方法:9.在SimModel里的Space对象space对象需要更多的工作来做,但是现在又可以回到model对象了,因为我们需要在model对象里为space对象做点集成性的工作。我们要做三件

27、事:1.为space对象分配一个变量2.在一个合适的时间创建space对象3.在一个合适的时间销毁space对象space对象必须在模型构建起来的时候创建;也就是说,begin方法被调用时,它会在buildModel里被触发。但是奇怪的是,它也会在这会儿被销毁。讲白了就是我一运行,space对象就被销毁了,这不坑爹嘛!所以我们需要在model对象里加一些代码,这些代码生成一个对象变量,它可以维持住space对象,让它不会那么快就挂了;我们需要在setup方法中设置这个变量的值为null,并且需要在buildModel方法中创建space对象。听懂没?10.初始化Space对象我们现在需要存一些

28、钱,放在网格里。这需要为CarryDropSpace对象创建一个新方法,用来在对象空间objectSpace周围随机的在网格里放一些钱。在对象空间被创建后不久这个方法就会被立即调用,在buildModel方法里调用。还有这个方法的具体实现过程:下面简单解释一下这段代码:11.小小的跑题取钱事实上,部分spreadMoney方法里的代码的用处可能远不止散钱这么简单;因此我们把几行代码单独提出来放到一个新的方法里。很不幸的,刚写好的代码又要改了:自习体会一下,这么写是不是更简洁易懂了?貌似没有。但是扩展性就强了。12.一些可见输出概念上说,我们继续谈论model部分是有意义的,我们已经创建了环境,

29、但是没有主体和行为(agents and actions)。但是,如果我们开始创建图形显示界面,很多部分我们会越来越清晰。这就是RePast其中一个非常方便的地方,但是依然有些小问题需要注意。首先我们要定义我们的目标:说到现在我们都还没实现二维网格的可视化呢。背景是白色的;格子里的钱应该是能看见的(如果有的话),意思就是钱的颜色应与背景颜色不同。为了实现这些,我们需要使用三个预先构建好的RePast对象:DisplaySurface, Value2DDisplay, 和 ColorMap.DisplaySurface对象是基本的窗口。一个ColorMap对象是特定值到特定颜色间的单映射,比如0

30、是黑色,1是暗红,2是亮红,3是更加亮的红,通过颜色的深浅可以显示出网格里的数量多少(很直观不是么?但是可惜的是网格太小了,颜色差异不易区分)。Value2DDisplay是一个对象,它连接了一个地图和你模型中要显示的值相对应,它连接了窗体,功能函数,颜色地图于一身。为了使用这些对象我们必须:创建一个DisplaySurface类型的变量来储存它1.在setup方法里,撤销一个display surface,这通过执行dispose方法来实现(但是只要对象被实例化了,对object != null进行测试就是合适的),然后设置对象值为null2.实例化一个新的display surface;为

31、了实现这个目的你必须传递两个参数:a)display surface将要服务的模型对象b)被创建的display surface的名字(这将出现在窗体的标题栏里)3.注册display surface,告诉RePast它的存在,并且让RePast知道它的名字4.创建一个color map并指定初始值5.创建一个Value2DDisplay对象来连接我们想要设置的值的集和color map6.把Value2DDisplay对象加到DisplaySurface对象中去听起来很复杂,其实做起来容易,但是仍然有许多小的步骤,所以我们慢慢来。DisplaySurface对象的变量将在变量域声明;撤销display surface,重新实例化它,注册,这几步都在setup方法中完成,看下图(注意到有新的import语句!)。注意创建display surface对象的参数是this,这就是说,运行setup方法的model对象将把它自己作为参数传递给display surface。在CarryDropModel.java中加入新代码:13.创建一个Color Map干嘛要创建一个color map,前文书已经

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2