AnyLogic培训翻译7.0版_第1页
AnyLogic培训翻译7.0版_第2页
AnyLogic培训翻译7.0版_第3页
AnyLogic培训翻译7.0版_第4页
AnyLogic培训翻译7.0版_第5页
已阅读5页,还剩557页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用AnyLogic 多方法仿真建模,此演示文档是AnyLogic 标准培训计划的一部分,?,建模,解决方案,问题,模型,模型层次上的解决方案,真实世界,模型的世界,零风险空间,模型的种类,用线连接的方框,一张纸的公式,仿真模型,Excel电子表格,物质模型,最流行的建模工具是:,MS Excel,Y = f(X),解析解(公式和脚本),但是,?,你能够找到解析解,如果: 参数数量可控 行为是线性的 有明确的依赖性,容易建立心智模型 但是如果: 参数过多 非线性,非明显影响 时间和因果依赖 反常的行为 不确定性 (随机系统),示例: 银行,一个简单的案例: 平均每小时10位客户 柜台只有一名柜

2、员 平均服务时间为5分钟 我们想找出: 排队平均等待时间 可以从此推导出的其他指标,银行. 分析方法设想,这些假设意味着什么? 客户独立到达 这应是适合于银行的假设 指数分布的服务时间:,银行. 如果不是简单的案例?,有几个(K) 出纳员 这就是所谓的“多服务排队模型”。解析解*:,银行案例. 总结,在真正的银行,过程复杂得多: 只有一些特定的员工可以做一些交易 客户可能被引导给其他员工 出纳员可能共享资源,如打印机或复印机 不用的员工可能有不同的技术和能力 等等 解析解不存在几乎是肯定 的 如果解析解存在,谁将为你找到他? 几乎过程中的任何变化都使得原有的解析解无效 对于这种系统,有可预见的

3、复杂性和保证结果的唯一分析方法是:仿真建模,仿真模型,这是一个“可执行”模型 一套规则使我们从目前的状态获得系统在时间上的下一个状态 模型生成系统在时间上的轨迹 当我们前进时,输出被“观察到,仿真模型的更多优势:,你可以在任何时间测量任何事物 当然,你所测量的不能低于你抽象的级别 你可以直观地观察你所建模系统的动态 仿真仿真模型实际上是一个具有图形用户界面的互动游戏,有时甚至是三维的 在这个意义上,仿真模型的说服力远高于任何分析模型,例如:一个Excel文档,应用领域,聚合、全局反馈回路、影响、趋势,制造,行人动态,保健,交通运输,市场和竞争,社会系统,供应链,项目和产品管理,健康经济学,物理

4、控制系统,生态系统,服务系统,仓储物流,计算机硬件,资产管理,能源供应网络,人力资源动态,业务流程,战场,指挥和控制,单独对象、确切的大小、速度、距离、时间,高抽象层次 最小细节 宏观层次 战略层次,中抽象层次 中等细节 中观层次 战术层次,低抽象层次 最大细节 微观层次 操作层次,仿真建模方法,离散事件 (基于过程) 建模,系统动力学,基于智能体 建模,聚合、全局反馈回路、影响、趋势,单独对象、确切的大小、速度、距离、时间,高抽象层次 最小细节 宏观层次 战略层次,中抽象层次 中等细节 中观层次 战术层次,低抽象层次 最大细节 微观层次 操作层次,系统动力学 Jay Forrester 50

5、年代,存量,流量 相互作用的反馈回路,巴斯扩散模型,系统动力学 Jay Forrester 50年代,- , - , - , , , , ,+,+,+,+,-,+,+,+,+,存量,流量 相互作用的反馈回路,巴斯扩散模型,离散事件建模 G. 戈登60年代,实体和资源. 流程图 排队和延迟,银行,基于智能体建模,我们专注于单个对象,并描述它们的局部行为,局部规则 有时也专注环境的动态,环境,智能体的行为,儿童,青少年,成年人,老年人,Arena ExtendSim SimProcess AutoMod PROMODEL Enterprise Dynamics FlexSim ,MATLAB Vi

6、sSim LabView Easy5 ,学术工具: Swarm RePast NetLogo ASCAPE,VenSim PowerSim iThink,仿真建模软件,传统的工具旨在支持一种特定的建模方法,系统动力学,离散事件建模,基于智能体建模,动力系统,AnyLogic 多方法仿真工具,容易选择和调整抽象层次 可以在不同方法间转换 可以在一个模型中混合方法 现代和灵活的面向对象平台,AnyLogic 模型开发环境,此演示文档是AnyLogic 标准培训计划的一部分,工作空间布局,AnyLogic图形用户界面,当前选中项 的属性,问题视图。显示并有助于定位到错误,面板视图。 模型项目依模板分

7、组,菜单和工具栏,大部分命令的快捷方式 自动适应当前视图,文件菜单(新建模型,打开模型,保存模型,保存所有模型。),模型菜单(构建模型,构建所有模型,调试,运行),编辑菜单(撤销,重复,剪切,复制,粘贴,删除),绘图菜单 (缩放到100%,放大,缩放,缩小,视图区域,显示/隐藏网格,),模型结构 所有元素组成树,所有模型项目分层次 组织,控制板,默认显示在左侧 没有更多的选项卡,在垂直的导航栏上只有图标 (界面) 为面板元素提供更大空间 可折叠内置项 (如: Data, Charts) 折叠/展开: 单击该项选项卡 使用下列菜单: 全部折叠, 全部展开, 折叠其他,控制板间导航,1.将鼠标悬停

8、在 垂直导航栏,2. 将会看到带有控制板名称的下拉列表。 从列表中选择控制板的名称。,在图中添加控制板条目,常见方式,矩形对象 (状态,矩形,椭圆形, 圆角矩形),多点对象 (折线,曲线,变迁,连接器),1.,2.,3.,图形编辑器 选择并复制,Shift+单击 对象以添加到选择中,Ctrl+拖 (Mac OS: Cmd+拖)以在同一窗口复制选中的 对象,属性,垂直 默认停靠到右边 单页(没有其他选项卡) 可折叠项,静态值,动态评估表达式,小三角形表示可在设计时间(静态的)和运行时间(动态的)之间进行转换。,图例:,属性视图,单击项目标题以将其打开,运行模型,1.单击运行按钮,4.单击该按钮以

9、运行模型,并切换到 主类视图,2. 选择要运行的实验,3.你将看到演示窗口 ,显示为 该实验设计的演示,演示窗口,动画流程图,检查模型元素,二维动画,统计图表,三维动画,控制,主要工具栏命令,可以自定义工具栏和状态栏,AnyLogic帮助,帮助系统支持 搜索机制,AnyLogic支持,使用内置的获得支持功能,这是建模支持不只是技术支持。你可以问“我该如何建模”,提高你的建模知识,而不仅是调试问题。,AnyLogic中的 离散事件建模,此演示文档是AnyLogic 标准培训计划的一部分,Event,我们只考虑系统生命期中“重要时刻”,它们被称为事件。 事件可以导致模型中的任何变化 示例: 客户到

10、达银行营业厅 账单处理完 原料数量达到最低水平 事件: 不花费时间 引起模型中的变化 可能安排或取消未来的其他事件,时间按事件顺序 离散时间,我们只考虑一个序列的即时“离散”事件,它们之间没有事件发生,非“连续时间”过程 事件可能在同一时间(同时)按预定发生然后它们被序列化 模型时间从一个事件“跳”到另一个事件,离散事件建模. G. 戈登60年代,实体和资源. 流程图 排队和延迟,银行,AnyLogic过程建模库,过程建模库是高级对象的集合 支持广泛接受的流程图方法 可使用拖放建模 模型可伸缩和扩展 所有块由事件、状态图和Java构建它们可与AnyLogic中其它模型交互操作。,最简单的离散事

11、件模型,过程模型库 基本对象(1/2),过程模型库 基本对象(2/2),过程模型库对象的参数,简单的静态参数: 评估 一次,但可能在模型执行期间改变 动态评估表达式(动态参数) 每次在需要它们时评估,例如,实体需要获得的每次延迟时间,速度或其他属性 相应的实体可以作为 “实体”等来访问。 动态执行代码块(代码参数): 在对象每次某个事件发生时评估: 实体进入/离开它,传送带停止等。,100,容量,entity.type = VIP,exponential( 1 ),延迟时间,选择条件,entity.cruiseSpeed,速度,D,D,D,entity.setColor( red );,离开时

12、,if( entity.airline = “AF” ) entity.destination = gate17;,进入时,C,C,2.5 +uniform( 2, plexity * 60 ),延迟时间,D,entity.setColor(blue );,进入时,C,serviced+;,离开时,C,100,容量,进入时,容量(静态),V,serviced,2,参数. 示例,延迟,离开时,在代码参数中每一行Java代码的末尾添加一个分号 在静态/动态参数表达式的末尾不用添加一个分号,过程模型库模型的动画,你可以关联流程中包含实体的任何对象到“指导”图形以定义它的动画。将这画在动画上,并选择动

13、画类型。,实体,资源单元,实体“内部”图形化定义,基于网络的建模,过程模型库为某些类型的问题提供了更好的支持 如,复杂服务/ 物流 / 医疗保健系统 布局很重要 它们之间有位置和路径的网络 实体沿路径移动,路线长度事物 资源(人员、设备、房间等)可能有归属位置,在网络中旅行,用例,医疗保健系统: 急诊部,物流系统: 终端网络,定义网络拓扑,从CAD或位图布局开始 使用图作为动画背景 使用AnyLogic图形定义其上的所有重要区域,点和路线(节点和路径),定义位置和部门,从Space Markup控制板中用矩形节点、多边形节点和点节点定义网络中的所有节点和位置 从Space Markup控制板中

14、用路径连接各矩形,一条路径连接两个矩形节点,两条路径连接三个矩形节点,网络将会自动创建,定义网络过程,流量控制,资源,使用过程模型库对象定义过程流程图,资源类型,静态(不能移动且不能被移动):一个房间、一台非可携带设备、一个通道等。 可携带(不能自己移动,但可以被移动):一个轮椅、可携带x光机等。 可移动(可以移动,可携带资源):一名医生、 一名护士、一台叉车等。,灵活的资源管理,所有资源类型(正规的和网络) 是统一的 实体可以请求特定的资源且可以选择集合 立刻获取, 一个接一个地获取 可以添加准备/总结性的过程 资源可以获取其他资源 抢先,中断 转移,改变,“医生” 资源单元被派 往高优先级

15、工作,当前病人 需要等待,新的资源,普通的和“网络”资源合并到资源 资源池不需要使用流程图中的资源图形化地连接到块 (获取,集合,释放等),“普通” 资源,基于网络的资源,资源,静态的 可携带的 运动的,创建自定义实体/ 资源类型,1. 拖动实体类型/ 资源类型,2. 选择动画,使用向导设置参数,3. 你可以在实体关系图中添加其他元素(状态图等),为资源准备和结尾分支,主病人流,护士准备便携式超声波,护士返回超声波,资源的准备流程图分支,结尾流分支,这些过程不是并行运行的;准备过程只在实体进入seizeNurse后开始。,优先级和任务抢占策略,当其他任务开始时,你可以选择如何处理当前正在执行的

16、任务: 禁止抢占(当前任务继续执行) 等待原始资源 (中断任务,等待同样的资源完成它) 终止服务(任务中断且不再执行) 获取其他资源(任务中断,努力获取其他指定类型的资源) 没有资源,任务继续 (在没有资源的帮助下完成任务),获取,服务,装配,资源. 故障/维修,在这里考虑资源使用统计中如何选择故障时间,用延迟模拟故障/修复,你可以用一个描述过程的流程图来进行模拟。流程图的开始用指定的ResourceTaskStart 块来定义。,资源池,资源. 分解,资源池,若选中,改变将抢占当前执行的任务(如果在人物属性中允许,事件 - 定期或单一离散事件,状态图 操作的模式 operation,SD模型

17、中随机元素,d(x)/dt = uniform( 5, 10 ),使用右边的随机方程是不准确的 例如,否则模型结果将取决于当前集成的步骤 随机只能在离散步骤中引入 变量或参数的随机变化 事件的随机延迟间隔,Vensim 模型的导入,SD模型的动画. 程序,你可以为你的SD模型构建非常复杂的前端 标准或定制的互动业务图 多个视图之间切换 控制(滑块、按钮、复选框等)可以被用于设置、开始、暂停和重新启动模型 全功能的SD模型可以作为小程序运行,这不是AnyLogic,这是微软的 Internet Explorer!,用这种方法,你可以立即交付模型,甚至给远程的客户或同事,巴斯扩散模型,此演示文档是

18、AnyLogic 标准培训计划的一部分,巴斯扩散. 阶段 1,产品或创新扩散的SD经典教科书模型 一群人包括潜在采纳者和采纳者;所有人的行为方式完全相同 潜在采纳者以采纳率成为采纳者,采纳率取决于广告,广告在所有时间进行,每个时间单位,它将潜在采纳者广告效果的部分转换成采纳者 最初: 潜在l 采纳者 = 10000 采纳者 = 0 参数值: 广告效果 = 0.011,巴斯扩散. 阶段1. 步骤1,1.添加两个存量参数到图上,2.在由下角拖动句柄调整存量的大小,创建新模型,命名其为巴斯扩散 打开系统动力学面板 添加两个存量到图中。命名它们为潜在采纳者和采纳者,巴斯扩散. 阶段1. 步骤2,从潜在

19、采纳者到采纳者创建采纳流量,2. 单击存量,这里流量流出,流量出现,如果绘制正确,在选中时其终点将用小绿圆圈指示.,1.双击面板中流量元素,3.单击存量,这里流量流进,巴斯扩散. 阶段1. 步骤3,命名流量为采纳率 检查存量的公式,存量公式自动改变,引用为采纳率,巴斯扩散. 阶段1. 步骤4,创建 总人口和广告效果参数,巴斯扩散. 阶段1. 步骤5,指定潜在采纳者的初始值,你可能会看到一个错误发生,因为变量在表达式中提到,但这两个变量之间的依赖没有在存量-流量图中定义。,巴斯扩散. 阶段1. 步骤6,绘制一个链接定义总人口和潜在采纳者的因果依赖关系,2. 单击在方程/初始值中首先提到的变量,类

20、似于流量,如果链接被正确绘制,在选中时其终点将用小绿圆圈指示.,1. 双击链接,3. 最后单击因变量,从自变量到因变量绘制链接是非常重要的!,巴斯扩散. 阶段1. 步骤7,添加辅助变量 AdoptionFromAd,2. 单击错误指示器,3. 通过选择相应的菜单项,创建缺失的链接,你将看到链接自动被创建,1. 指定公式,巴斯扩散. 阶段1. 步骤8,通过拖画在中间的句柄调整圆的半径。,为链接定义极性(在极性属性中)。所有这些链接是正(+).,从AdoptionFromAd 到采纳率绘制链接 为采纳率指定公式,巴斯扩散. 阶段1. 步骤9,添加循环来表示由市场饱和造成的平衡因果循环,在这里添加循

21、环标识符,设置循环分析、类型,并指定一个简短的描述,巴斯扩散. 阶段1. 步骤10,运行模型,使用检查窗口观察动态,切换窗口到绘图模式,单击变量以打开其检查窗口,巴斯扩散. 阶段1. 问题,每天由于广告有多少人成为采纳者? 在8年时,采纳者的数量是多少?,巴斯扩散. 阶段2,现在添加产品扩散的口碑效果 假设每个人都联系其他人 每个时间单位联系的人的数量是联系率 如果采纳者联系一个潜在采纳者,后者将以概率采纳比例采纳,采纳比例的相应部分将是: 来自口碑的采纳 = 采纳者 * 联系率 * 采纳比例 * 潜在采纳者/ 总人口 为什么? 参数值: 联系率 = 100 采纳比例 = 0.015,巴斯扩散

22、. 阶段2. 步骤 1,默认值: 100,默认值: 0.015,AdoptionFromWOM = : 采纳者 *联系率 *采纳比例 *潜在采纳者/ 总人口,添加联系率和采纳比例参数 添加辅助 AdoptionFromWOM 绘制依赖项链接,巴斯扩散. 阶段2. 步骤 2,AdoptionRate = : AdoptionFromAd + AdoptionFromWOM,加强由WOM导致的循环,绘制从 AdoptionFromWOM 到 采纳率的连接 修改采纳率的公式 再添加一个循环标识符,巴斯扩散. 阶段2. 步骤 3,3. 在复发时间字段输入 0.1,4. 指定时间窗: 8,2. 设置潜在

23、采纳者和采纳者变量由折线图显示,1. 在图上添加时间折线图,以显示潜在采纳者和采纳者的人口如何随时间变化,巴斯扩散. 阶段2. 步骤 4,1. Ctrl+拖 (Mac OS:Cmd+拖)折线图以创建副本,2. 在折线图上添加 AdoptionFromAd 和 AdoptionFromWOM 变量,巴斯扩散. 阶段2. 步骤 5,1. 添加按钮,它将停止产品广告,2. 修改按钮的标签:关闭广告,3. 指定行动:AdEffectiveness = 0;,巴斯扩散. 阶段2. 步骤 6,设置模型以在8个时间单位后停止,1. 单击仿真项,3. 这里输入8,2. 单击 模型时间选项卡,巴斯扩散. 阶段2

24、. 步骤 7,1. 经典的S-图形,2. 钟形,3. 按住按钮,4. 你将看到广告被成功地停止,但是过程动力学没有改变,运行模型,并使用折线图观察动态 停止广告,并查看它如何影响采纳过程,巴斯扩散. 阶段2. 问题,在80年代,他是系统动力学爱好者: (a) Boris Johnson,伦敦市长 (b) Milos Zeman,捷克共和国总统 (c) Anthony Lake,联合国儿童基金会执行主任 请解释为什么一个循环是平衡的,而另一个加强。,巴斯扩散. 阶段3,现在我们想研究采纳过程如何取决于采纳者的联系率 我们将使用参数变化实验 这个实验执行多个模型,运行模型的一个或多个不同的参数,巴

25、斯扩散. 阶段3. 步骤 1,创建新的参数变化实验,2. 选择参数变化,1. 选择文件|新建|实验,3. 输入实验名称: ContactRateVariation,4. 单击完成,巴斯扩散. 阶段3. 步骤 2,设置实验以在范围为0-10内以步长10改变联系率,1. 对于联系率 参数,设置类型 :范围, 最大值: 100 ,步长:10,3. 你将看到控制出现在这里,2. 单击创建默认用户界面按钮,巴斯扩散. 阶段3. 步骤 3,在ContactRateVariation 实验的图上放置时间折线图,3. 指定时间窗: 8,2. 选择不自动更新选项,1. 向上拖动边界,以扩大折线图的图例区域,巴斯

26、扩散. 阶段3. 步骤 4,添加数据集以存储采纳者变量的历史,1. 右键-单击(Mac OS:Ctrl+单击) 采纳者 变量,并从弹出菜单选择创建数据集,2. 数据集AdoptersDS 被创建,巴斯扩散. 阶段3. 步骤 5,在ContactRateVariation实验图上添加数据集 添加折线图以显示在模型仿真结束时采纳者的数量与联系率,修改ContactRateVariation实验的属性以用每次仿真运行后的新值更新折线图,并防止并行评估,巴斯扩散. 阶段3. 步骤 6,2. 在仿真运行后字段中输入代码: plot.addDataSet(root.AdoptersDS, CR = + r

27、oot.ContactRate); dataset.add(root.ContactRate, root.Adopters);,1. 打开Java行为属性页,3. 清除允许并行评估复选框,巴斯扩散. 阶段3. 步骤 7,运行模型,1. 单击运行按钮,3. 单击按钮以运行试验,2. 选择巴斯扩散/ContactRateVariation,4. 观察采纳过程如何取决于联系率。仅通过选择相应图例项,你可以展示某些特定模型运行的曲线,巴斯扩散. 阶段3. 问题,如果联系率增长,采纳者的最终数量会发生什么? 如果最后联系率等于零,那么: (a) 0 适用者 (b) 多余1 (c) 总人数的一半多,练习.

28、 SEIR模型,传染病动力学模型: 一个易感染的人,被感染,暴露,经过潜伏期,确认感染,然后恢复 暴露和传染人可能感染,但他们具有不同的传染性(在接触中传播疾病的概率)和不同的接触率 恢复后对该疾病免疫 参数: 总人数: 10000 暴露人接触率: 4, 传染人接触率: 1.25 暴露人传染性: 0.05, 传染人传染性: 0.06 平均潜伏时间: 10 天 平均疾病持续时间: 15 天 初始: 一个人暴露, 其他人 易感染,呼叫中心练习,可选的离散事件练习。可被纳入课堂或作为家庭作业。,练习. 呼叫中心(1/3),两种呼叫到达: 第一种类型到达速率 ArrivalRate1 = 1.5 (每

29、秒) 第二种类型到达速率 ArrivalRate2 = 1 如果呼叫等待时间过长,则放弃 放弃时间是指数分布 对于第一种类型,指 AbandonmentTimeMean1 = 100 (秒) 对于第二种类型,指 AbandonmentTimeMean2 = 100 两个操作员组应答呼叫 容量是 NOperators1 = 100 和 NOperators2 = 100 服务时间分布为 triangular( mean/2, mean, 2*mean) ,这里 ServiceTimeMeanXX 定义为: 对于操作员组1应答类型1呼叫 ServiceTime11 = 100 对于操作员组2应答类

30、型1呼叫 ServiceTime12 = 200 对于操作员组2应答类型2呼叫ServiceTime22 = 100,练习. 呼叫中心(2/3),每个操作员组有一个队列 组1队列的最大容量为QCapacity1 = 50 组2队列的最大容量为QCapacity2 = 50 当呼叫到达时,应用的路由选择逻辑如下: 如果类型1呼叫到达,组1的队列未满,它将应用组1队列,否则,如果组2的队列未满,它将安排组2队列;如果两个队列都是满的,呼叫被拒绝。 如果类型2呼叫到达,组2的队列未满,它将安排在组2队列,否则,它将被拒绝,练习. 呼叫中心(3/3),构建呼叫中心的仿真模型 测量呼叫百分比(按呼叫类型

31、): 被拒绝 被放弃 被服务 获得系统内应答呼叫的时间分布(按呼叫类型) 添加改变到达速率和调整队列动态容量的能力,观察对服务质量的影响,呼叫中心. 阶段1. 步骤1, 创建一个新模型呼叫中心。 不要使用任何模板,用如下默认值创建这些参数: 1.5 / second() 1 / second() 100 * second() 100 * second() 100 100 50 50 100 * second() 200 * second() 100 * second(),创建独立于时间单位设置的模型 例如,如果你指定“10”作为平均服务时间,它意味着什么:10 秒, 10 分钟, 10 天?

32、10意味着10 模型时间单位,在实验属性的模型时间页中设置 。如果你改变那项设置,你的时间常数也将改变,这并不可取。 要使你的模型独立于时间单位设置,你应在时间相关表达式中使用函数,如 second()、 minute()、 hour()等。这些函数将分别以秒、分钟、小时返回时间数量。,呼叫中心.阶段1. 步骤2, 源 到达速率: ArrivalRate1, 资源池 容量: NOperators1, 服务 资源池: operators1 延迟时间: triangular( ServiceTime11/2, ServiceTime11, 2*ServiceTime11) 队列容量: QCapac

33、ity1 队列: exit on timeout: 到时: exponential( 1/AbandonMeanTime1 ) 队列: 启用先占:,队列对象中到时和先占 你可以设置队列对象,让实体在它们已等候给定时间后离开。为此,你需要选择启用到时时离开选项,指定到时,这将为每个实体动态评估,所以它取决于实体,并可能是随机的。放弃等待的实体将通过右上方端口退出。 如果你选择启用先占选项,队列将让所有实体进入,但是如果队列已满,具有低优先级的实体将通过左上方端口退出。评估每个实体的优先级。如果实体优先级字段为空,所有实体将被视为具有相等的优先级,当队列满时,新实体将被拒绝,并从端口退出。,呼叫中

34、心. 阶段1. 步骤3, 选择仿真实验来显示其属性, 在模型时间页,设置停止: 从不, 运行模型,观察被拒绝,被应答和被放弃的呼叫数量, 默认情况下,仿真时间设置为100时间单位,默认时间单位为分钟。由于此时间对于用呼叫中心进行的实验来说太短,我们重置停止时间。,呼叫中心. 阶段2. 步骤1, 源 到达速率: ArrivalRate2, 资源池 容量: NOperators2, 服务 资源池: operators2 队列容量: QCapacity2 此时不要改变其他参数, 选择这些流程图对象,Ctrl+拖(Mac OS: Cmd+拖)它们已创建副本,Ctrl+drag (Mac OS: Cmd

35、+drag), 这里我们创建一个新的过程,到目前为止完全独立于原始的过程。这两个源,两个资源池等将并行工作。,呼叫中心. 阶段2. 步骤2, 创建一个新的实体类, 将其命名为呼叫,选择无为其动画类型,然后单击下一步,单击 参数: type 类型: int, 单击完成,Drag and drop,自定义实体类 默认的实体类允许最少的自定义(如,你可以改变其默认动画的颜色)。如果你以后需要自定义实体(如,添加属性、函数或收集客户统计数据),那么你需要创建一个自定义实体。 新的实体类型创建向导允许你为新的实体设置动画、添加各类区域及设置其默认值。,呼叫中心. 阶段2. 步骤3, 新实体: new C

36、all( 1 ), 新实体: new Call( 2 ), 改变service2 对象的参数: 这个参数在这里 实体类: Call 延迟时间: entity.type = 1 ? triangular( ServiceTime12/2, ServiceTime12, 2*ServiceTime12) : triangular( ServiceTime22/2, ServiceTime22, 2*ServiceTime22) 到时: entity.type = 1 ? exponential( 1/AbandonMeanTime1 ) : exponential( 1/AbandonMeanTi

37、me2 ), new Call( 1 ) 是我们早期创建的Java类Call的构造器。由源对象使用以创建新实体。 现在,service2中延迟时间和到时按呼叫类型(1或2)的不同进行评估。 参数“实体类”和访问实体的自定义字段 你已声明了一个自定义实体类,设置源对象将那个类的实体注入到过程中。在过程流程图对象中,你希望访问实体的自定义属性,例如,在创建的模型中,你需要了解服务对象的延迟时间和到时 扩展点中实体类型(1或2)。为直接访问实体字段类型,你需要告诉服务对象 ,流经的实体是呼叫类型。通过在服务的字段实体类中输入类名称call来完成。然后在延迟时间,到时和其他扩展点中可用变量实体将是呼叫

38、类型,你将能够输入entity.type.,呼叫中心. 阶段3. 步骤1, 重新定向被组1拒绝的呼叫到组2,插入三个 SelectOutput 对象。 重新定向再次打过来的类型1呼叫的路径。为它们设置如下参数: 实体类: Call 选择真输出:如果条件为真 条件:entity.type = 1, 由于我们已经发送部分类型1呼叫到第二操作员组,在第二个过程中,我们现在有两种类型的呼叫。由于我们将分别收集两种类型呼叫 的统计数据,我们需要“重新路由”类型2实体到第一个过程,由三个 SelectOutput 对象完成。就像前一步骤中一样,我们告诉流经的实体是类 Call,这样我们可以访问字段 类型。

39、,呼叫中心. 阶段3. 步骤2, Insert two TimeMeasureStart objects here, 插入三个 TimeMeasureEnd 对象。为它们设置: TimeMeasureStart 对象: tmStart1 , 插入另外三个TimeMeasureEnd 对象。为它们设置: TimeMeasureStart 对象: tmStart2 , 在这里插入两个TimeMeasureStart 对象, 注意花括号是用来提供TimeMeasureStart 对象的列表到TimeMeasureEnd 中,即使在列表中仅有一个对象。 测量过程模型中时间 在过程模型中,我们经常需要知

40、道在过程的特定部分实体花费的时间,例如,待在医院或急诊室或在服务系统等待的时间长度, 测量时间的最简单方法是使用一对标准库对象:TimeMeasureStart 和 TimeMeasureEnd。 TimeMeasureStart 对象应置于所测量时间流程图部分的每个进入上,TimeMeasureEnd 在每个退出上。每个 TimeMeasureEnd 需要知道所有对应的 TimeMeasureStart 对象。 TimeMeasureEnd 对象收集统计时间和花费在过程选定部分的时间分布。 重要的是不要让已经通过TimeMeasureStart对象的实体不通过TimeMeasureEnd而退

41、出模型:后者保持类在列表中,前者则删除它们。在我们的模型中,我们只需要收集被应答的呼叫的统计数据,但是我们需要在三种退出的每个上面设置 TimeMeasureEnd。,呼叫中心. 阶段3. 步骤3, 从分析面板上将直方图 对象放在这里。 在其属性的外观页上,设置: 显示图例: 垂直轴标签: None 如下图所示添加数据项:, Ctrl+拖 (Mac OS: Cmd+drag第一个图表以创建副本。 设置直方图: tmEndAn2.distribution,Ctrl+拖 (Mac OS: Cmd+拖),tmEndAn1,tmEndAn2, 记住TimeMeasureEnd 对象收集在过程所选部分实

42、体花费的时间分布,即 频率的直方图。分布可以以 .distribution 可用,并用直方图显示。,呼叫中心. 阶段3. 步骤4,从分析面板上将饼状图放在这里。 在其属性设置中: 图例: 如图所示添加三个数据项:, 终对象有一个函数count() 返回通过那个对象曾退出系统的实体数量。 获取已经通过一个端口的实体数量 通常,通过调用.count(),I你可以获取已经通过任何标准库对象的任何端口的实体数量。例如,你可以调用typeB.outT.count()。 对于由其他对象(如服务)组成的对象,或许不能以外部端口工作,仅是内部对象端口的代理。例如,要获取通过端口outTimeout 退出对象s

43、ervice2 的实体数量,你应该调用:service2.seize.queue.outTimeout.count().,呼叫中心. 阶段3. 步骤5, 运行模型。观察被应答的呼叫的“在系统中时间”的分布,及两种类型呼叫中被拒绝,被放弃和被应答的呼叫的百分比。(你或许需要扩展窗口或使用平移来查看图表), 你如何解释“在系统中时间”分布的差别?为什么类型2呼叫的服务质量低?,呼叫中心. 阶段4. 步骤1,从控制面板上将滑块对象放在这里。在其属性视图中: 单击C添加标题按钮。 链接滑块到 ArrivalRate1 参数,如图所示:, Ctrl+拖(Mac OS:Cmd+拖)滑块以创建副本。添加标签

44、,并用相同的最小和最大值链接到 ArrivalRate2 参数。, 相似地,创建另外两个滑块,用最小值1和最大值200链接到 NOperators1 和 NOperators2 。,呼叫中心. 阶段4. 步骤2,运行模型并改变到达速率。观察类型1和类型2呼叫的服务质量的差别。, 注意,到达速率的滑块标签显示值的范围为0-600,而速率值是每秒0-10。 那是为什么?你知道如何显示“每秒呼叫”的值吗?,呼叫中心. 问题,提出一种类型1呼叫路由到类型2操作员的替代方式,不使用服务对象的“先占”功能。 我们测量的“系统中时间”包括等待和服务时间。我们如何仅测量等待时间? 你使用滑块动态改变模型参数时

45、,统计数据总是包含改变前后的所有数据。你如何在每个模块一移动时重置统计?,呼叫中心. 问题. 提示,呼叫路由:关掉两个服务对象的先占。当且仅当service1.queueSize() 0 ? x : 0 y = max( 0, x ) x = 5 true if x equals 5, otherwise false, whereas: x = 5 assign 5 to x,?,?,?,?,?,?,?,?,?,?,?,?,调用方法和访问字段,方法调用 要调用一个方法,输入其带括号的名称。如果有必要,将括号中的参数用逗号分隔。示例: x = time(); moveTo( getX(), ge

46、tY() + 100 ); traceln( “Population is increasing” ); 访问对象的字段和方法 要访问模型元素(状态图、定时器、动画)的字段或方法 ,使用带点.的模型元素名称,后面再跟字段/方法名称。示例: statechart.fireEvent( “go” ); sum = sum + agents.get(i).x;,在Java代码中写注释,有两种类型的注释:,/* text */,/ text,传统的注释:从ASCII 字符 /* 到ASCII 字符 */ 间的所有文本被忽略(如C 和 C+中),行尾注释: 从ASCII字符 / 到行尾间的所有文本被忽略

47、(如C+中),/* * The class represents AnyLogic 3D animation. It contains the canvas object. * * author Daniil Chunosov * version 5.0 */ public class Animation3DPanel extends javax.swing.JPanel ,/ Prepare Engine for simulation: engine.start( root ); engine.runFast(); / fast mode no animation,复制对象,重复对象存在集合

48、中。 项目索引从 0 到 N-1 获取当前集合的大小: people.size() 获得集合的 i-th 项目: people.get( i ) 添加一个新对象到集合中: add_people(); 从集合中删除一个对象: remove_people( person );,内置函数,系统函数 time, date, getOwner, pause, isStateActive(), 等等 数学函数 基本: sqrt, sin, cos, tan, exp, log, round, 等等 特殊函数 随机数: uniform, exponential, bernoulli, beta, 等等 打印

49、操作符: trace, traceln 还有更多 见AnyLogic 类参考中 Utilities, Presentable, ActiveObject 和 Agent 类,概率分布,最小,最大,最大,最小,众数,三角( 最小, 众数, 最大),指数( 比率),均匀( 最小, 最大),指数 已证明如果事件以恒定速率发生且相互独立,两个后来事件之间的时间是指数分布的。 示例:呼叫中心的电话呼叫,客户达到等。 三角 用于关于随机变量有限知识的条件中,即我们所知的最小、最大和最常见的值 示例:服务时间 均匀 我们只知道最小和最大值,但是不知道它们中间值的出现是否一个比另一个更频繁,主语言结构,赋值/

50、 行动语句: y = f(x1,x2) + 5*z; event.restart( uniform( 10, 20 ) );,决策语句: if ( friendsRatio attackConstant ) attack(); else escape(); ,循环语句: double total = 0; for ( Person p : people ) total += p.income; for( int i=0; i数据库连接-Excel文件 文件夹,以获得方法的全部列表及其参数的描述。,指定一个单元的方式 常用方法有三个符号,其区别于单元编址的方式:,供应链. 阶段1. 步骤7, 放

51、置行为图,在启动代码中调用,为执行行为图定义的算法,你应该像调用其它函数那样调用它。我们将该调用放置在主类的启动代码中。它将在模型开始时执行。 模型初始化顺序 就安排各种操作的顺序来讲,理解模型的初始化顺序比较有帮助。 创建模型(主)根对象,设置其参数,调用方法create() 。初始化动态变量,创建动画。方法create()对于其嵌入的副本对象具有相同的步骤。 此时完成了模型和动画的创建。 调用每个对象的方法start() 。每个对象创建并初始化其状态图(每个状态图进入初始状态) 。最后执行启动代码, 首先是最里面的对象,并沿着活跃对象树依次执行。 模型执行开始。 因此,启动代码在模型初始化

52、的最后阶段执行,在实体模型的所有对象创建、;连接、初始化之后,但在其他完成之前。这是一些额外的初始化和启动对象的行为如事件的一个地方。,供应链. 阶段1. 步骤8, 运行模型。你将会看到放置在地图上的分销商。,供应链. 阶段1. 步骤9,按照分销商同样的方法创建五个零售商。将其智能体类命名为Retailer,群体对象-retailers,在现有的环境中放置零售商(从同样的Excel文件中读取零售商坐标),表示地图上的零售商。 从数据库中读取分销商的名称,并在地图中显示它们。 请解释幻灯片步骤6解释中的“for”循环。,供应链. 阶段1. 步骤10, 运行模型。你应该会看到一张如图所示的图片。,

53、供应链. 阶段2,现在我们将模拟零售商如何请求产品以及产品如何从分销商运往零售商。 这要求我们在模型中添加卡车,生成产品请求并将它们分配到卡车上,让卡车移动到零售商后返回到他们分销商处的原始位置。 我们将对其实现进行说明: 动态地创建和销毁智能体 移动智能体并作用于它们的到达,供应链. 阶段2. 步骤1, 单击完成, 创建一个新的智能体类Order, 添加新的int类参数,Animation: None,最后一步,手动添加Retailer类的第二个参数retailer,现在我们定义模型中的订单。我们将把订单表示为内部定义了所需数据的智能体。 - 创建新的智能体类表示订单。我们为这个智能体类定义

54、了两个参数一个用来存储产品数量(类为int的数量),另一个用来记住发起订单的零售商(类为Retailer 的零售商)。,供应链. 阶段2. 步骤2, 添加智能体群体GIS环境中存在的卡车(初始群体大小:0), 在此添加卡车图片。将它缩小一点。, 类: 订单, 输入: 经销商, 添加一个新的智能体类卡车。由于我们假设事先不知道卡车的数量(不同的分销商具有不同的车队规模)我们告诉AnyLogic不要最初创建智能体。我们将动态地创建卡车,因此我们设置0为车队的初始大小。 在智能体类中添加数据: 卡车应该知道其所有者!因此我们将添加一个参数来存储到特定分销商的引用。 我们将把订单分配给卡车这就是我们需

55、要一个变量来存储当前订单的原因。 问题: 为什么这两个数据项用不同的元素定义:参数和变量? 创建异构智能体网络 你可以通过使用参数和变量定义其内部的特征数量来创建异构智能体网络。 你可以在智能体内添加AnyLogic元素:状态图,事件、绘制复杂动画、添加系统动态存量和流量图或离散事件图等所有的AnyLogic元素均没有任何限制。与其他模型方法相比,基于智能体建模没有任何限制,这也使它成为一个灵活的、有力的建模方法。,供应链. 阶段2. 步骤3, 类:int 默认值: uniform_discr(1,5), 集合 元素类: 卡车,每个经销商都有一队卡车。添加一个定义这个分销商卡车数量的参数。让每

56、个经销商具有随机数量的卡车 (从1到5均匀分布)。 添加一个集合来存储这个分销商所属的卡车的调用。,供应链. 阶段2. 步骤4,触发于: 智能体到达,触发于: 智能体到达 行为: order = null; moveTo(owner.getX(), owner.getY();,触发于: Message 信息类型: Order 行为: moveTo(msg.retailer.getX(), msg.retailer.getY();,用状态图定义卡车行为。卡车的初始位置位于分销商处。(因此这是第一个状态 AtDistributor)。此时该卡车能够接收订单并移动到零售商处订单的发起人。现在我们假设

57、卡车到达零售商处,迅速返回。移动是连续动作,我们用一个状态来表示。因此,这里就又有了两个状态MovingToRetailer和MovingToDistributor。为结束一个状态,我们在实体到达定义的目的地时使用变迁触发。 局部变量 我们使用状态的行为代码中的msg变量。Msg在给定的环境中是一个局部变量。为查看局部变量列表,在此区域单击鼠标,然后将鼠标悬浮在区域左侧的灯泡处。,智能体连续运动和GIS空间 为移动智能体到一些新的位置,调用这个智能体的moveTo() 方法,通过坐标作为参数的新目的地。 也可用下列方法,查询AnyLogic帮助获取完整列表:,智能体到来的反应 你可以在智能体类的到达目标位置属性中通过写入代码定义智能体到达的任何反应(智能体属性页)。 在智能体的连接属性中,我们使用另个一选项 使用带有智能体到达类触发的变迁更改智能体状态图的活跃状态。为使消息能够转发到状态图,你应该对转发消息到表中的相应状态图选择复选框来。,供应链. 阶段2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论