我创建了一个非常简单的网络,其中包含一些节点和一些路径。现在应该将有限数量的代理(人员)从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 Personal Learning Edition 8.3.2。
答案 0 :(得分:2)
由于AnyLogic路径提供了这些方法(getNumberOfTransporters
等),所以这肯定是一个错误;这些方法在任何情况下都不应引发内部异常。
如果您的模型中没有运输车队,则快速测试可以确认这些方法会抛出此异常(因此,可以更宽恕地抛出异常)。如果您的车队设置了归属位置,则不会抛出异常,即使该位置与您要检查的路径位于不同的网络中也是如此;即,即使任何运输商都永远不可能在那条路上。 (如果您没有为舰队设置家乡位置,则与此相关的例外情况将有所不同。)
因此,您似乎正在尝试使用正常的移动资源代理(例如,来自Process Modeling库)作为“运输者”,而不是使用“物料搬运”库运输者舰队。
如果您想限制网络中的“运输”运动,则有两个概念上不同的选项:
(如您所做的那样)使用流程建模资源池,并通过使用RestrictedAreaStart
和RestrictedAreaEnd
之类的内容来控制流程建模模块内部的移动 (即,将运动细分为相关部分,并控制控制相关部分的块中的流程)。请参见Job Shop示例模型,以获取一个很好的(复杂的)示例。请注意,从概念上讲,空间标记只会为您提供在模型中使用的距离(而不是任何模型行为)。这是常态:只有空间标记才能可视化模型并提供距离。 (它还控制哪些运动是有效的,因为需要通过网络进行路由,但是如果不允许进行必要的运动,则通常是设计错误,因此这并不是真正的模型行为。)
改为使用TransporterFleet
。它们可以与正常的Process Modeling模块进行交互操作(请参见下面的屏幕截图),并且被精确设计为支持这种样式“通过限制路径上的运输器数量来控制其流量”(此外,还具有内置的加载/卸载时间,行为功能)下车后等)。请注意,从概念上讲,使用物料处理库空间标记定义了模型行为(而不仅仅是提供距离和可视化)。这是“物料搬运”库的一个重大概念偏离。 (同样,您使用物料搬运空间标记定义的输送机网络也定义了模型行为;例如,其中的Station
元素类似于过程建模库中的Service
块。)
P.S。我要补充一点,除非您使用运输车队,否则 没有直接的方法来获取哪些代理在哪些路径上。最接近的是网络支持getNearestPath
函数(请参阅帮助中的Network
的API参考),其中一种将为您提供最接近代理的Path
。 (因此,通过循环访问所有资源代理并对其进行检查,您可以倾斜地确定每条路径上“有多少”,尽管您必须小心,因为这只会使最近 { {1}}。)但这与您想要实现的目标无关。