首页 > 解决方案 > 如何在回收区为乘客匹配行李?

问题描述

我正在模拟一个安全控制过程,我不能让每个乘客都拿起他们的行李。我尝试过 Match、Combine、Pickup,但我仍然无法正确执行命令。

我创建了以下流程图,问题出在 wReclaimPax、pickup 和 wReclaimBags 块中(您可以在图片中看到它们)。 https://ibb.co/v3V57Tm

我看到此链接Anylogic - 将多个项目组合回原始所有者以了解某些内容,但我仍然需要帮助。

我创建了 3 个函数:

匹配:

if(equipaje.pasajeroLink.equals(pasajero.equipajeLink)){
  return true;
}
return false;

包:

for(int i=0;i<wait.size();i++){
   Pasajero p=(Pasajero)wait.get(i);
   if(isMatch(p,bag))
     return p;
}
return null;

包包人:

for(int i=0;i<wait.size();i++){
   Equipaje e=(Equipaje)wait.get(i);
   if(isMatch(pasajero,e))
     return e;
}

return null;

标签: anylogic

解决方案


假定的上下文

你还没有真正解释你的代码是如何与你的流程相关的,但我假设如下:

  1. 因为这是取行李,所以您要确保乘客代理(Pasajero)仅在他的行李(从外观上看是 Equipaje 代理)到达wReclaimBag等候区时才进入 Pickup 区(代表从传送带上取行李),并且从它释放到 queue4队列。

  2. 为此,当 乘客 (Pasajero) 到达Wait 或行李 (Equipaje) 到达 Wait时您需要触发器(从 Wait 块中移除代理) (因为您不知道乘客或他们的行李是否会到达首先是他们各自的等待块)。wReclaimPaxwReclaimBag

所以你的paxBags函数在等待的入口动作中被调用,你的函数在wReclaimBag等待的入口动作中被调用。bagsPaxwReclaimPax

当前方法可能存在的问题

在不了解您的模型的情况下很难说,但根据您提供的内容我能想到的问题是:

  • 如果有匹配的函数,您的函数将返回 Pasajero 或 Equipaje。您的匹配检查似乎依赖于 Pasajero 和 Equipaje 之间的双向连接(链接)。显然,如果它们没有正确设置,模型将无法工作,如果您使用的是双向连接,则不需要检查两端。

  • 您的函数需要调用,这样,如果它们返回非 null,它们就会从另一个等待块中释放匹配的代理,释放自己。你这样做吗?如果不检查,当您进入等待块时,可能会出现调用free自己的问题(因为这种情况取决于 AnyLogic 内部,以确定您是否在此阶段被视为“在”块中并且可以被释放)。如果这似乎是问题所在,您可以创建一个 timeout 0 动态事件实例来执行免费操作,这样您就不会在 on-enter 操作的范围内执行此操作。

  • 您的取件块(因为它已被设置,因此进入代理将始终想要取走第一个代理(Equipaje)queue4)只需要设置为等待数量 1(尽管见下文)。

  • 如果你已经完成了所有这些,最可能的问题是 AnyLogic 的底层事件排序正在影响事物。当您释放特工时,我相当确定释放实际上发生在计划在幕后的超时 0 事件中。所以可能是乘客在他们的设备到达之前queue4到达了皮卡,如果你将皮卡设置为“确切数量(等待)”,数量为 1,它应该处理。

进程的动画(每个块的输入/输出/内部的数字以及单击块时的详细信息)也应该可以帮助您调试出了什么问题;例如,袋子在应该被释放的时候被留在等待中,等等。

PS 对于这种事情,您应该始终创建一个最小的示例模型,以便更轻松地测试问题/解决方案(并在诸如此类的帮助论坛中共享,其中模型的其他复杂性无关紧要)。通常,您在尝试构建以最小方式重现您的问题的模型的过程中会“自然地”发现问题。


推荐阅读