抢占剩余服务时间最短的座席

Preemption of agent with the lowest service time remaining

尊敬的 AnyLogic 社区,

我是 AnyLogic 的新手,希望大家能帮帮我!

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

实际上,新进入的代理可能会抢占并终止正在服务的代理的服务,更具体地说,是剩余服务时间最短的代理。我在 seize 块中看到了抢占选项,但是我无法定义应该终止谁的服务。

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

非常感谢您的宝贵时间和帮助!

我实际上会写一些脚本来完全控制它。在下面的方法中,我没有 seize/release 块。 AnyLogic 的延迟块可以有一个容量并报告返回统计数据。我通常发现它可以满足我的需要。如果我有多个区域来自同一个资源池,我倾向于只使用实际的 seize/release 块。如果它像你的图表,我只是使用一个容量延迟块并避免 seize/release.

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

需要注意的一点是,您可能希望按某种优先级或代理比较对队列进行排序。这会将新到达的代理放在队列的前面(如果那是他们应该在的地方)。否则,如果你在队列的前面找到一个决定它不够重要以抢占延迟的人,它将被卡在第一个位置并阻止其他人评估。如果您使用优先级,请务必在代理进入队列后优先级发生变化时使用 sortAgents()。

如果您想要 seize/release 块,这种使用自定义函数的一般方法也可以使用。您只需要从 seize 中调用该函数,并确保在延迟块和 enterPreempted 块之后释放资源。

有人可能会回复您如何在 AnyLogic 中开箱即用。但是,我倾向于默认保持块尽可能简单并编写我自己的函数。可以想象,我们可以很容易地修改这个函数来寻找其他更高级的条件 who/when 我们希望从延迟块中删除某人。