AnyLogic使用帮助文档.docx
《AnyLogic使用帮助文档.docx》由会员分享,可在线阅读,更多相关《AnyLogic使用帮助文档.docx(21页珍藏版)》请在冰豆网上搜索。
![AnyLogic使用帮助文档.docx](https://file1.bdocx.com/fileroot1/2023-4/2/91d9dadc-53ce-4f52-9702-8a554e320f76/91d9dadc-53ce-4f52-9702-8a554e320f761.gif)
AnyLogic使用帮助文档
AnyLogic使用帮助文档
一概要
本文档内容包含AnyLogic的简单介绍,AnyLogic使用入门以及在使用过程中常见的一些问题。
且所有内容仅针对pedestrian模型。
二安装
除按正常模式安装AnyLogic以外,我们还需要额外添加一个shp文件导入控件,以及安装neatbean。
控件的安装方法很简单,把InputShape_1.0.0.jar和openmap.jar复制到C:
\ProgramFiles\AnyLogic6Professional\plugins下即可(具体路径请参考自己的anylogic安装路径)。
三创建一个简单的pedestrian模型
1打开anylogic程序,File->new->model。
2输入模型文件相关信息,next。
3选择usetemplatetocreatemodel,并选择PedestrianDynamics。
Next。
4Addwaitingarea和Addserviceandqueue都不勾选。
Finish。
5运行程序观察效果。
四基础对象介绍
关于各个对象的属性行为,仅说明一些比较常用的。
构建一个完整的模型,以下对象是必不可少的。
PedConfiguration,PedGround,PedSource,PedSink,PedGoTo。
下面一一介绍。
1PedConfiguration
PedConfiguration主要标示模型中的一些配置信息。
1)Timestep,seconds
时间步长,即pedestrian每隔多久移动1次。
0.3是通过社会调查获得的一个比较合理的数据。
这个值越小,peds移动的更精确,但是需要更多的计算。
2)Animationscale,pixelspermeter
PedConfiguration中需要格外关注一个数据,即多少像素为1米。
模型中的单位分为像素和米,所以在使用中需要注意他们之前的差别。
3)Renderpedas
Ped的显示样式。
circle在表现上要好看一些,但是会让程序慢一下。
Cross会让程序跑的快一些,point会更快,但是point无法表现出ped的大小。
2PedGround
PedGround主要表示模型的模拟器环境。
可以简单的理解为墙的设置。
1)Walls(group,optional)
peds不能穿过的地方,简称为墙。
可以通过walls来表示实际的模拟器环境。
参数可以null,不为null时必须为group。
2)Wallstouchtolerance,pixels
人与墙之间的间隔,单位为像素。
0.2米是一个比较合适的值。
3)Additionalties(groupoflines,optional)
额外的ties
当PedGoto的寻路方式为manual时会使用到该参数。
可以为空
4)Showadvancedparameters
勾选将显示一些高级设置。
a)Gapbetweentieandwall,meters
系统自动生成的tie和墙之间的距离。
缺省值为0.3米。
这个值必须大于0。
b)Maximumtielength,meters
系统自动生成的tie的最大长度。
缺省值为5米。
在某些模型里面,将该参数设置到最小,可以显著提高性能。
c)Minimumanglebetweenties,radian
tie之间的最小角度。
单位为弧度。
缺省值为0.3。
由两点之间生成的tie,如果与角平分线之间的角度小于该值,将会被移除。
d)Deletecrossingties
是否删除相交的tie。
e)Shownodes
程序运行过程中,是否显示节点。
f)Colorfornodes
节点颜色。
g)Showedges
是否显示边缘。
h)Colorfor edges
边缘颜色。
i)Showties
是否显示tie
j)Colorforties
tie的颜色
k)Showobstacles
显示障碍
l)Colorforobstacles
障碍的颜色
3PedSource
PedSource主要作用是生成ped。
通常作为模型的起点。
1)Creationmode
选择ped生成模式,是单个模式还是组模式。
2)Pedarrivalsdefinedby
指定生成ped的模式。
a)Arrivalrate,pedspertimeunit
按时间比率生成。
如1000/hour()。
b)Pedinterarrival time
间隔时间生成。
如:
exponential(1000/hour())。
具体时间间隔由AngLogic内部定义,该参数仅定义生成比率。
c)Ratetable,pedsperminute
生成比率有TableFunction提供。
d)Arrivaltable
生成比率有TableFunction提供。
TableFunction中一个条目(20,10)表示第20s生成10个人。
e)Manual(callinject()method)
手动调用inject(intn)函数生成人。
3)Grouparrivalsdefinedby
group和ped的区别主要在于,ped每次生成时单个的。
group生成每次生成是以group的size大小的人为1个单位生成的。
如group的size为10,则每次生成人的时候都是10人。
生成模式与ped相同。
4)Limitednumberofarrivals
是否限制生成ped的数量。
如果选择是,则需要输入人数上限。
5)Newped
ped实例化。
可以实例为newped()或者ped的子类。
6)Diameter,meters
ped的大小。
单位为米。
7)Comfortablespeed,meterspersec.
ped的速度,米/秒。
默认值为uniform(0.5,1)。
8)Animationshape
设定动画演示时的形状。
具体用途还没摸索出来^^
9)color
设定生成的ped的颜色。
默认情况下为空,随机设置颜色。
10)Arrivalground(PedGround)
ped生成时所处的环境。
11)Appearsat(line,polyline)
ped生成时所处的位置。
12)InitialSpedd,meterpersecond
初始速度。
单位为米/秒。
13)Withoffset,meters
定义ped生成位置位于线上的位置。
缺省位置为uniform(0,length)。
如果改成uniform(0.5*length,0.75*length),则表示生成的均匀分布在线段/折线距离起点1/2线段/折线长度到3/4长度的这一部分。
起点为折线/线段上带+的点。
14)initialdirection,radian
ped生成时的初始朝向。
单位为弧度。
可选择下拉单提供的North,South,East,West。
15)Onexit
可以在这里编码。
ped离开该组件时会调用这段代码。
16)advancedparameters—Pedsimulationalgorithm
ped的模拟器算法。
默认值为pedConf.algorithmSocialForceModel。
这个参数我没有深入研究过。
高端人士可以自己编写模拟器算法来试验一下。
4PedGoTo
设定ped的行走目的地和路线。
1)Target(point,line)
ped的目的地,可以是line,也可以是point。
2)Pathchoicemode
有两种模式,auto和Manual。
auto模式,ped会自动计算到达目的地的路径。
Manual模式,ped则根据指定的path行走。
若选择Manual模式,则必须在Parameters栏path项填写设定的path。
path为ShapePolyLine。
3)Targetreachtolerance,meters
定义ped距离目的地多少范围内算完成pedgoto。
4)Onenter,Onexit,Oncancel
分别定义ped进入,离开,取消pedGoto时的行为。
5)Blockingdetectiontimeout
当ped进入一个死角,从该位置无法沿既定路径到达目的地,则会进入timeout计时,超时后会重新计算路径。
5PedSink
ped的最终端,进入该对象的ped会从画面消失。
1)Onenter
自定义进入该对象的行为。
以上为该模型中对象的基本介绍。
其他模型介绍请参考help文档。
关于其他对象的示例,请查看help->SampleModels。
PedestrianDynamics的三个示例。
五进阶功能。
这一块内容比较乱,基本上以我在做地铁疏散遇到的问题为主。
1path的画法
可以这样理解,ped按path行走,实际是按于path关联的一连串ties行走。
表示path的polyline,以+点为起点,每条tie必须放在polyline的点上面。
以上polyline2位path。
左下带+的点为path起点,ped先到达line2上一点,再通过line3上一点,以此来完成该path。
line2和line3为ties。
创建一个group,把这两条line加入这个group,并把group名填入PedGround的Addtionalties,这些ties才被认可,可以起作用。
2pedGototarget缓冲区的实现。
本身PedGoto有一个参数Targetreachtolerance来实现该功能,但是由于实际效果来看,该参数对pointtarget效果很不错,但是对linetarget支持很不好。
实现该方法时,需指定pedGotocancel端口连接的对象。
方法一:
自定义算法计算缓冲区。
代码如下:
distanceLine(doubleax,doubleay,doublebx,doubleby,doublecx,doublecy)
{
doublef=(bx-ax)*(cx-ax)+(by-ay)*(cy-ay);
//c到直线ab的投影点不在线段ab上,而且离a点最近
if(f<0)returndistancePoints(ax,ay,cx,cy);
doubled=(bx-ax)*(bx-ax)+(by-ay)*(by-ay);
//c到直线ab的投影点不在线段ab上,而且离b点最近
if(f>d)returndistancePoints(bx,by,cx,cy);
//c在ab线段上的投影点在线段ab上
f=f/d;
doublefDx=ax+f*(bx-ax);
doublefDy=ay+f*(by-ay);
doublefDistanceCD=sqrt(pow((cx-fDx),2)+pow((cy-fDy),2));
returnfDistanceCD;
}
distanceLine(doubleax,doubleay,doublebx,doubleby)
{
doublefDistance=sqrt(pow((ax-bx),2)+pow((ay-by),2));
returnfDistance;
}
该方法主要是计算ped与targetline的距离。
如果距离小于某个值,判定ped已经实现该pedGoto,调用PedGoto.cancel(ped)进入下一个对象。
方法二:
利用pedArea自定义缓冲区。
当ped进入pedArea以后,判定ped已经实现该pedGoto,调用PedGoto.cancel(ped)进入下一个对象。
3pedArea的几个用途
1)电梯。
pedArea有一个参数GroundisMoving。
可以设定地面的移动速度。
2)可以控制区域开关。
Enableaccesscontrol可以控制区域开关。
当选定该参数之后,可以调用pedArea.setOpen(booleansOpen)来设置区域开关。
一个比较常见的用法就是当区域内人数达到一定限制后,就不允许再继续进去了。
3)可以实现靠边行走。
Keepdirection参数会给进入区域的每一个ped指定方法的加速度,该方向就是Keepdirection的值,可以是下拉列表的east,west,sourth,north,也可以是特定的弧度值。
4)限制区域内peds的行走速度。
可以通过SpeedisLimited来限制ped的最大速度。
5)每个ped的速度增加百分比的速度。
可以通过Speedismultiplied来给每个ped设定百分比。
pedArea的缺陷。
由于pedArea在计算时,会把当前pedGround里所有的ped都计算一遍,所以,当pedArea的数量过多时,会极大地增加数据计算量。
4函数的用法。
函数的用途主要体现在复杂数据的处理。
比如main的初始化,比如多对象的选择。
函数的使用,在一定程度上可以大幅度的简化模型的复杂度,把流程相同的对象画在同一条流程图上面。
下面举个例子,当进入pedGoto的peds有同一个目的地,但是可以选择两条不同的路径时,选择函数来实现路径的选择是一个很好的办法。
从General中拖一个Function控件到模型中。
设置参数,返回值,然后编码。
请注意返回值类型必须与path的类型保持一致,都必须是ShapePolyLine。
5事件的用法。
事件有三种模型,一个是时间模型,当时间到了触发事件。
具体又可以分为Occursonce,Cyclic和usercontrol。
第二个是Rate,比率模型。
第三个是Condition,条件模型。
结合函数,基本可以满足我们的需求。
6队列的实现。
AnyLogic提供了一种队列的模型,PedService。
PedService中有一个名为Service的参数,参数类型为PedServices。
PedServices具体实现队列模型。
PedServices包含两种队列,一个是服务队列,Services,该队列存在两种模式,justdelay,Delayandpassthrough。
就好比地铁买票和过闸机。
买票接受服务时,只需要站在原地和地铁工作人员交流就可以了,可以选择justdelay模式,而过闸机接受的服务则是先刷卡,然后沿着闸机口过去,则是Delayandpassthrough。
PedServices的另外一个队列则是Queues,即排队队列。
该队列存在两种选择模式,一是选择队列的方式,Shortestqueue,Closestqueue,Manual一个是选择服务队列的方式Longestqueue,Closestqueue,Manual。
可以根据具体的需求来选择。
7环境切换。
环境的切换。
例如从二楼走到一楼这种。
两个环境原本是相互独立的,可以通过Pedchangeground来实现切换。
该模型的参数设置很简单,仅Destinationground一个。
但在在画的时候有些地方需要注意,切换ground前需要到达的目的地和两种环境的边缘保持一定的空间,以方便进行切换。
8导入shp文件。
其中原点坐标X,原点坐标Y需要记录下来,因为后续录像时会用到。
比例需要与PedConfiguration中的Animationscale,pixelspermeter一致。
数据名称自定义。
其他数据自定义,相互关联不大。
六NetBeans下的Anylogic
已经有了AnyLogic,为何还需要一个专门把AnyLogic中的代码拷贝到NetBeans下运行?
主要是因为之前我们重载的时候,都在netbeans中进行的。
我们制作录像时,需要记录每个ped的坐标位置,还有其他一些信息,但是这里面有很多数据是我们无法直接调用的,需要首先继承一些类,然后通过重载等方法,使这些数据可以为我们所用。
例如要获取ped的坐标,但是,在ped中,坐标变量是friendly类型的,所以我们就需要在com.xj.anylogic.libraries.pedestrian包中创建一个ped的子类MyPed。
然后在MyPed中新建一个public函数,返回ped的x,y坐标。
这样就可以实现我们的要求了。
在使用既有工程中的代码时,有几个注意点。
1SimMain中有个函数chargePos(MyPedped,doublex,doubley),该函数的作用是将录像中的xy坐标还原为实际的xy坐标。
我们在导入地图数据的时候,记录了一个原点坐标,那么现在模型中的坐标只需要按照这个原点坐标进行偏移就可以还原为实际坐标了。
2Simulation里面的Main全部改为SimMain,因为我们在SimMain里重载了一些函数。
3Simulation仅仅是一个模拟器的一些运行设置,可以不用拷贝。
直接使用工程原有的代码。
但是main的代码必须从AnyLogic从拷贝到NetBeans的工程中。
为了拷贝方便,可以将NetBeans的包名称与AnyLogic的包名称保持一致。
4ped等的子类,应该放在com.xj.anylogic.libraries.pedestrian下面。
并注意修改代码中的package,改为packagecom.xj.anylogic.libraries.pedestrian;
5现在的NetBeans对AnyLogic的支持并不完美。
在使用6.5的库的时候,并不支持PedSelectOutput。
我们在建立模型的时候需要SelectOutput替代。
6可以使用java的反编译器查看库的源代码。
7当从别人那里拷贝NetBeans工程到本地之后,请确认项目属性的项目文件夹是否一致。
七AnyLogic创建自己的对象
AnyLogic现有的对象,不一定可以完全满足我们的需求,在某些特定的需求之下,我们需要创建属于自己的对象,来实现我们的目标。
一个很简单的例子,我们需要在一个特定的多边形范围内随机生成指定数量的peds。
而现有的对象,都是在线或者点上生成。
为了实现这一需求,我们需要自己创建一个新的对象。
建立一个新的对象,需要考虑是out还是in。
我们创建的对象,没有进,只有出,所有只有一个out端口。
右键选项目名称->new->ActiveObjectClass。
Name定义PedDispose。
首先添加一个out端口。
将General中的port拖到界面中。
命名为out。
并将showname的勾选去掉。
在Constructorcode中填入OutPortPush(this),指定该port的构造函数。
若是in端口,则填InPort(this).
然后画PedDispose在模型中的显示图标。
画一个圆,并用一条line连接起来。
注意圆和line都要勾选icon。
下面就要定义一些生成ped所相关的信息。
创建一个参数。
例如生成多少人。
从general中拖Parameter控件到界面中。
填写所需的一些参数设置。
编写注释。
使用同样的方法添加其它参数。
在这里我们需要的有speed,diameter,color三种初始属性。
pedGround,pedConfig,初始配置信息。
pedInitNumber,pedInitShape,生成ped数量和生成范围。
onCreaterPed,onOut,生成ped和ped离开时自定义代码。
创建一个变量,pedVector,用来保存生成的peds。
创建4个函数,InitPed,GoOut,GoOutAll,PedDisposeCreate。
由于ped的成员变量都是friendly,只能在同一个包中访问,所以要实现该对象,必须NetBeans的工程下完成。
public
boolean
PedDispose(){
if(pedInitShape==null||pedConf==null)
returnfalse;
ArrayListary=pedInitShape.getShapes();
for(inti=0;i{
doublexmin,xmax,ymin,ymax,x1,y1;
ShapePolyLinepl=(ShapePolyLine)ary.get(i);
intn=pl.getNPoints();
xmin=xmax=pl.x+pl.getPointDx(0);
ymin=ymax=pl.y+pl.getPointDy(0);
for(intj=1;j{
x1=pl.x+pl.getPointDx(j);
y1=pl.y+pl.getPointDy(j);
xmin=xminxmin:
x1;
xmax=xmax>x1?
xmax:
x1;
ymin=yminymin:
y1;
ymax=ymax>y1?
ymax:
y1;
}
for(intp=0;p{
MyPedped=newMyPed();
InitPed(ped);
doublex=uniform(xmin,xmax);
doubley=uniform(ymin,ymax);
while(pl.contains(x,y)==false)
{
x=uniform(xmin,xmax);
y=uniform(ymin,ymax);
}
ped.e=x/this.pedConf.animationScale;
ped.f=y/this.pedConf.animationScale;
ped.selectFlag=i+1;
onCreatePed(ped);
pedVector.add(ped);
}
}
returntrue;
}
这一段的代码其实很简单,想要生成ped,首先要确定ped生成的位