Java 剩余服务时间最短的代理抢占

Java 剩余服务时间最短的代理抢占,java,simulation,anylogic,Java,Simulation,Anylogic,亲爱的AnyLogic社区: 我是AnyLogic的新手,希望你们中有人能帮助我 我有一个简单的流程模型,由多个源、队列、捕获、延迟、释放和接收()组成。我正在建模的系统是一个服务器容量问题。我有不同的服务时间和有限的服务器容量的代理,我感兴趣的KPI是资源池耗尽时没有得到适当服务的客户数量。目前,我允许客户在使用所有资源时在队列块处超时,但这并不能准确表示系统在现实生活中的表现 实际上,新的传入代理可以抢占并终止正在服务的代理的服务,更具体地说是剩余服务时间最短的代理。我已经在jack块中看到

亲爱的AnyLogic社区:

我是AnyLogic的新手,希望你们中有人能帮助我

我有一个简单的流程模型,由多个源、队列、捕获、延迟、释放和接收()组成。我正在建模的系统是一个服务器容量问题。我有不同的服务时间和有限的服务器容量的代理,我感兴趣的KPI是资源池耗尽时没有得到适当服务的客户数量。目前,我允许客户在使用所有资源时在队列块处超时,但这并不能准确表示系统在现实生活中的表现

实际上,新的传入代理可以抢占并终止正在服务的代理的服务,更具体地说是剩余服务时间最短的代理。我已经在jack块中看到了抢占选项,但是我很难定义应该终止谁的服务

你们中有人知道我如何在完全消除队列的同时,以最短的剩余服务时间对代理的抢占进行建模吗


非常感谢您的时间和帮助

我实际上会编写一些脚本来完全控制它。在下面的方法中,我没有卡住/释放块。AnyLogic的延迟块可以具有容量并报告统计数据。我通常发现它能满足我的需要。如果我有多个区域从同一个资源池提取,我倾向于只使用实际的捕获/释放块。如果它和你的图一样,我只使用一个电容延迟块,避免卡住/释放

在队列的出口处,我调用一个函数来确定是否要将某人从延迟块中拉出。如果我这样做了,我会将它们发送到另一个代码分支。如果需要,可以设置enterPreempted返回延迟

需要注意的一点是,您可能希望通过某种优先级或代理比较对队列进行排序。这将把新到达的代理放在队列的前面(如果它们应该在队列的前面)。否则,如果在队列前面有一个队列认为它不够重要,无法抢占延迟,它将被卡在第一个位置,并阻止其他人进行评估。如果使用优先级,请确保在代理进入队列后优先级发生变化时使用sortAgents()

如果您想拥有“抓取/释放”块,这种使用自定义函数的通用方法也可以起作用。您只需要从抓取中调用函数,并确保在延迟块和enterPreempted块之后释放资源


在AnyLogic中,有人可能会用开箱即用的方式回答你想做什么。然而,我倾向于默认保持块尽可能简单,并编写自己的函数。正如您所想象的,我们可以很容易地修改此函数,以寻找其他更高级的标准,即我们希望从延迟块中删除某人的时间

亲爱的艾米,非常感谢你详细的回答!这对我帮助很大,你的代码让我实现了删除逻辑!还感谢您提供有关编码的提示以及关于扣押/释放模块必要性的提示。因为我以后有一个资源池拆分,所以我确实需要它们,但我成功地使您的建议适应了捕获块。