Anylogic叉车碰撞记录
Posted
技术标签:
【中文标题】Anylogic叉车碰撞记录【英文标题】:Anylogic forklift collision logging 【发布时间】:2021-12-26 11:32:44 【问题描述】:我需要测量叉车在碰撞中花费的时间,但是移动日志
对于由运输商管理的叉车代理类型,车队不可用。我也不能使用状态图,因为它使用了很多性能。
情况:我正在模拟一个带有单向通道的仓库,这些单向通道的容量是 2 辆车。有几种情况
叉车(黄色的)需要在单向过道中等待另一辆叉车,我目前已正确建模,只是不知道如何检测这种情况并记录它。
谢谢
【问题讨论】:
您是否使用点和路径移动车辆? 是的,我使用节点和路径 明白了,请分享更多关于此的信息或屏幕截图...我目前已正确建模。然后您需要准确记录哪些信息?时间? X,Y坐标?叉车的名称? 如图2,叉车在单向走道无法移动时停止,因为前面有另一辆叉车在拣货,我需要测量一下时间已经过了多久等待 【参考方案1】:我会这样做:
创建一个名为collisionLog
的新二维变量。
每 1 秒检查一次速度 [getSpeed()
函数] 和状态 [TransporterState getState()
函数]。
将这些写入collisionLog
。
模拟完成后,删除状态为idle
的行。
然后根据速度为零且运输车繁忙的事实进行计算,然后您有等待的车辆。
【讨论】:
你好,谢谢你的回答,但这对我来说不可行,我有一个巨大的模型,有大量的叉车,每秒检查任何属性都会导致巨大的性能损失 我想 AnyLogic 内部必须知道并检测到叉车应该停止,我想我需要了解那个逻辑/事件 从 8.7.4 版开始没有这样的自动日志... Anylogic内部怎么知道叉车需要停下来,因为他面前有东西?一定有什么东西已经在检测到它 这是一个很好的问题,我认为只有 AnyLogic 支持才能回答。【参考方案2】:当运输机发生碰撞时,没有可访问的触发点(通常是块的动作)来捕获。是的,显然必须在内部捕获这种情况,以使运输者避免碰撞,但在这种情况下,它不会暴露为块动作或其他任何地方的动作。 (AnyLogic 空间标记元素永远不会有动作,除了一些较新的材料处理库,如 Station,因为它们有效地代表了一个流程步骤。)
Transporter Control 块具有碰撞检测和避免的所有设置,但没有相关操作。
所以你的选择是真的
“扫描”这种情况发生:Yashar 的回答,推断非空闲时的零速度意味着“由于碰撞而等待”(可能是也可能不是 100% 稳健)是一种方式。
明确分解运动(从流程的角度)以定义潜在的“冲突”和流程中的决策(例如,如果您试图移动到过道,移动到入口节点,使用资源池或类似资源在通道中预留空间,只有在空闲时才能进入)。显然,这并不能涵盖所有可能的情况,但在某些情况下可能很有用。
Transporter Control 块中存在的执行 操作在这里可能会有所帮助(对于两种选择),因为至少您在进入路径和节点时有操作点。 (您也可以向 AnyLogic 提出增强请求,以在此处添加与碰撞相关的操作......)
我有一个庞大的模型,有大量叉车,每秒检查任何属性都会导致巨大的性能损失
我也不能使用状态图,因为它使用很多性能
你真的试过了吗?有些事情不会像您想象的那样对性能造成太大影响,而且性能不应该是先验的“太慢”的事情;理想情况下,您对可接受的性能有要求,并且您可以解决这个问题。 (性能、功能和可维护性之间总是需要权衡取舍。)
[你也没有说你认为使用状态图会有什么帮助。您的意思是通过状态图执行“扫描”方法,例如从扫描状态循环进入/退出?]
【讨论】:
我已经为叉车实现了一个状态图并在循环事件(每秒1次)中添加了onChange,性能下降并没有我预期的那么严重,这是我在使用时性能下降很大的主要原因之前使用这种方法是我启用了所有日志记录数据库,并且在模拟运行期间也在更新状态图 是的,打开模型执行的日志记录(即使您“禁用”大多数表)会大大减慢速度,即使这些表包含您可能想要的一些信息,您通常也只使用这用于测试/调试,这确实是它们的目的。 (它们在每次新运行时都会被覆盖,并且根本不会为多运行实验生成,这是有道理的,因为它们目前不包含任何列来标识它们所针对的运行——它们本质上只是用于“最后一个”运行”。) 您可以从模型记录表中获取的任何数据通常都是您可以通过模型代码显式提取的数据(有些比其他的更努力),因此您始终可以准确地创建自己的持久输出你想要的格式。以上是关于Anylogic叉车碰撞记录的主要内容,如果未能解决你的问题,请参考以下文章