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

Posted

技术标签:

【中文标题】抢占剩余服务时间最短的代理【英文标题】:Preemption of agent with the lowest service time remaining 【发布时间】:2018-12-20 13:06:37 【问题描述】:

亲爱的 AnyLogic 社区,

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

有人可能会回答如何在 AnyLogic 中开箱即用地做你想做的事。但是,我倾向于默认保持块尽可能简单并编写自己的函数。正如您可以想象的那样,我们可以轻松地修改此函数以查找其他更高级的标准,即我们希望谁/何时将某人从延迟块中删除。

【讨论】:

亲爱的艾米,非常感谢您的详细回答!它对我帮助很大,您的代码允许我实现删除逻辑!也感谢您提供有关编码的提示以及关于获取/释放模块的必要性。由于稍后我有一个资源池拆分,我确实需要它们,但我设法使您的建议适应了占用块。

以上是关于抢占剩余服务时间最短的代理的主要内容,如果未能解决你的问题,请参考以下文章

leetcode.1574 删除最短的子数组使剩余数组有序 - 阿里笔试 双指针 二分

PHP 使用PHP解压缩服务器上的ZIP FILE FOLDER - 最短的代码。

python实现24点游戏(地球上最短的24点游戏代码?)

操作系统-处理机调度详解(调度层次及FCFSSPFRR等算法)

操作系统基础知识

最短剩余时间优先:Java多线程