我创建了一个非常简单的网络,其中包含一些节点和一些路径。现在,有限数量的代理人(人)应该从A到B再回到循环中。到目前为止工作。
接下来,我想使用路径的常规部分中的“限制传输器数量”选项限制可以在特定路径上同时处理的代理程序数。这没用。当我想知道路径上有多少传输器时,我尝试调用(并显示输出)各种函数,如“getNumberOfTransporters()”,“getTransporters()”等(由“pathname.functionname()调用”) “,每个都导致异常,通常看起来像这样:
Exception during discrete event execution:
NullPointerException
java.lang.NullPointerException
at com.anylogic.engine.markup.Path.getNumberOfTransporters(Unknown Source)
at movetest.Main.executeActionOf(Main.java:141)
at com.anylogic.engine.EventTimeout.execute(Unknown Source)
at com.anylogic.engine.Engine.c(Unknown Source)
at com.anylogic.engine.Engine.gc(Unknown Source)
at com.anylogic.engine.Engine.a(Unknown Source)
at com.anylogic.engine.Engine$i.run(Unknown Source)
函数“getMaxNumberOfTransporters()”确实有效,它只输出“限制传输数”选项字段中指定的数字。
所以问题是:为什么抛出这个异常?我做错了什么,或者Anylogic是否存在与这些与运输商相关的功能/功能的错误?
顺便说一下,我在64位Windows 10计算机上使用AnyLogic 8个人学习版8.3.2。
由于AnyLogic Paths提供这些方法(getNumberOfTransporters
等),这绝对是一个bug;在任何情况下,这些方法都不应该抛出内部异常。
快速测试确认如果模型中没有运输车队,这些方法会抛出此异常(因此抛出异常会更加可原谅)。如果您拥有设置了归属位置的车队,则不会抛出异常,即使该位置与您正在检查的路径位于不同的网络中;即使任何运输商都不可能在那条路上。 (如果您没有为车队设置起始位置,则会得到与此相关的其他异常。)
因此,您似乎正在尝试使用正常的移动资源代理(即,来自流程建模库)作为“传输器”而不是物料处理库传输器机群。
如果您想限制网络中的“传输”移动,您有两个概念上不同的选项:
RestrictedAreaStart
和RestrictedAreaEnd
块之类的东西控制流程建模块内的移动(即,您将运动分解为相关的段并控制通过控制流的块的流量相关部分)。请参阅Job Shop示例模型,以获得一个好的(和复杂的)示例。请注意,从概念上讲,空间标记仅为您提供模型中使用的距离(不是任何模型行为)。这是常态:空间标记仅用于显示模型并提供距离。 (它还控制哪些移动是有效的,因为需要通过网络的路线,但如果不允许所需的移动通常是设计错误,所以这不是真正的模型行为。)TransporterFleet
。它们可以与普通的过程建模模块进行互操作(参见下面的屏幕截图),它们的设计正是为了支持这种“通过限制路径上传输器数量来控制流量”的风格(还有内置的加载/卸载时间功能,行为下车后等)。请注意,在概念上使用材料处理库,空间标记定义了模型行为(而不仅仅是为您提供距离和可视化)。这是材料处理库的主要概念偏离。 (类似地,您使用材料处理空间标记定义的传送网络也定义模型行为;例如,其中的Station
元素类似于过程建模库中的Service
块。)附:我想补充一点,除非您使用运输车队,否则没有直接的方法可以让哪些代理商在哪条路径上。最接近的是网络支持getNearestPath
函数(请参阅帮助中的Network
的API参考),其中一种风格将为您提供最接近代理的Path
。 (因此,通过循环遍历所有资源代理并为每个资源代理检查它们,你可以倾斜地确定每条路径上有多少',但你必须要小心,因为这只会给出最接近的Path
。)但这与你想要实现的目标。