我正在模拟一个安全控制过程,但我不能做到每个乘客都拿起行李。我已经尝试过使用“匹配”,“合并”,“拾取”,但是仍然无法正确执行命令。
我创建了以下流程图,问题出在wReclaimPax,pick和wReclaimBags块中(您可以在图片中看到它们)。 https://ibb.co/v3V57Tm
我看到此链接Anylogic - Combined multiple items back to original owner可以理解某些内容,但我仍然需要帮助。
我已经创建了3个函数:
isMatch:
if(equipaje.pasajeroLink.equals(pasajero.equipajeLink)){
return true;
}
return false;
paxBags:
for(int i=0;i<wait.size();i++){
Pasajero p=(Pasajero)wait.get(i);
if(isMatch(p,bag))
return p;
}
return null;
bagsPax:
for(int i=0;i<wait.size();i++){
Equipaje e=(Equipaje)wait.get(i);
if(isMatch(pasajero,e))
return e;
}
return null;
答案 0 :(得分:0)
您还没有真正解释您的代码与流程之间的关系,但我假设以下内容:
因为这是行李提取,所以您要确保一名乘客
代理人(Pasajero)仅进入分拣区(代表从
旋转木马),当他的包(从外观上看是伊基帕耶特工)
到达wReclaimBag
等待中,并从中释放到
queue4
队列。
为此,您需要在以下情况下触发(从“等待”块中删除代理)
要么乘客(Pasajero)到达wReclaimPax
,要么等待行李(Equipaje)到达
在wReclaimBag
等待中(因为您不知道乘客或其行李将先到达各自的“等待”区)。
因此,您的paxBags
函数在wReclaimBag
等待的进入动作中被调用,而您的bagsPax
函数在wReclaimPax
等待的进入动作中被调用。
在不了解更多模型的情况下,很难说,但是根据您提供的内容,我可以想到的问题是:
如果有匹配的函数,则您的函数将返回Pasajero或Equipaje。您的匹配检查似乎依赖于Pasajero和Equipaje之间的双向连接(链接)。显然,如果未正确安装它们,则该模型将无法正常工作;如果使用双向连接,则无需检查两端。
您的函数需要调用,以便如果它们返回非null,则它们将匹配的代理从另一个Wait块中释放出来,并释放自己。你在那样吗如果不进行检查,则在您输入Wait块时可能自己调用free
可能会出现问题(因为这种情况取决于AnyLogic内部,是否在此阶段您是否算在该块中并且可以释放) )。如果这似乎是问题,则可以创建一个超时0动态事件实例来进行释放,以免在on-enter动作范围内执行该操作。
您的提取块(因为已经设置好了,以便进入的业务代表始终希望提取queue4
中的第一个业务代表(Equipaje))只需设置为等待数量1(尽管请参见下面)。
完成所有这些操作后,最可能的问题是AnyLogic的基础事件顺序正在影响事物。当您释放代理时,我可以肯定释放实际上发生在计划在暗中安排的超时0事件中。因此,如果您将“接客”设置为“确切数量(等待)”,那么乘客可能会在他们的设备到达queue4
之前先到达接客 ,它应该可以处理。
过程的动画效果(每个块中的进/出/内数字以及单击块时的详细信息)还应该帮助您调试出了什么问题;例如,应将本应放开的行李留在“等待”中,等等。
P.S。有了这种东西,您应该始终创建一个最小的示例模型,以使问题/解决方案的测试变得更加容易(并在诸如此类的帮助论坛中共享,而其余的模型复杂性都不相关)。通常,您会在尝试构建以最小方式重现问题的模型的过程中“自然地”发现问题。