【问题标题】:Preemption Priorities and Movement抢占优先级和移动
【发布时间】:2021-07-19 06:21:09
【问题描述】:

我正在尝试为使用单个码头的静态资源(使用流程图)的船舶队列建模。 队列中有三种类型的代理 A、B 和 C,它们的优先级分别为 1、2 和 3(这意味着船舶 C 在队列中具有优先使用码头的权限)。 现在我需要对以下两种与抢占相关的行为进行建模:

  1. 卸船任务(扣押时码头的任务)必须在 C 船到达时抢占,但在 A 或 B 船到达时不能。这意味着“任务优先级”字段中定义的优先级对于定义关注的队列顺序是有效的,但对于抢占无效。抢占的优先级应该是:优先级为 1 的船舶 A 和 B,优先级为 2 的船舶 C。 如何将队列的优先级“评级”与用于确定抢占的优先级区分开来?

shows the issue of having the same priority for queue and preemption

  1. 任务抢占时,我需要将当前正在使用码头的船移动到等待区,当导致抢占的任务结束时,抢占的船必须返回静态资源所在的位置(码头)并恢复其延迟块。我怎样才能做到这一点? 我尝试使用 Seize 块的 outPreempted 端口添加一个 moveTo 块以将代理移动到等待区域,但该端口似乎仅在抢占导致任务结束时才起作用(终止服务选项)。 我正在尝试建模的所描述队列的流程图显示在图像上,其中一些红线试图直观地解释(但错误)我正在尝试做什么:

enter image description here

【问题讨论】:

  • 我刚刚使用 agent.moveTo(...) 函数通过“任务暂停”和“任务恢复”字段解决了第 2 点。

标签: anylogic


【解决方案1】:

为什么不把两者分开呢?您可以做的是在 Seize 之前放置一个 Queue 对象,顺序为 A=1、B=2、C=3,然后设置 的队列大小Seize 对象为 0 并将抢占优先级(A,B=1;C=2)放入 Seize 任务优先级字段,就像您在此处所做的那样。

更新 再看一遍,Seize 上的队列大小似乎不能为零。在这种情况下,实现是使用 Wait 块完成的。

另外,seize 块的on enter 动作包含以下代码:

List<TestTwoSeizes_Demand> toFree = new ArrayList<>();

// there should be one agent in 'wait' and this will 
// mark it for removal
wait.forEach(waitingAgent -> {
    if (!waitingAgent.agent_type.equalsIgnoreCase("C")) {
        waitingAgent.preempted_by_C = true;
        toFree.add(waitingAgent);
    }
});

if (!toFree.isEmpty())
    toFree.forEach(a -> wait.free(a));

此外,流经进程的代理有 2 个属性:

  1. agent_type - 字符串 A、B 或 C
  2. preempted_by_C - 布尔值,最初设置为 'false'

这就是它的工作原理:

  1. selectOutput 对代理进行排序,以便“C”进入 seize,A、B 进入 seize1
  2. wait 配置为在超时时退出,因此通常它的行为类似于延迟
  3. seize 定义了优先级 3,seize1 分别为 A 和 B 定义了优先级 1、2,因此 seize 中的“C”代理将始终排在第一位
  4. 当“C”代理出现时,它将退出,A 或 B 代理退出等待
  5. selectOutput1 检查是否未设置 preempted_by_C 标志,如果是,则被踢出的代理返回到 seize1,但可以给他们任何行为

希望这可行。不是最干净的解决方案,但似乎无法使用标准配置选项进行排队抢占优先级分离。

【讨论】:

  • 嗨。占用队列的大小不能设置为 0。
  • 您好 Artem P。非常感谢您的回答!我找到了一个更简单的解决方案,即创建一个函数来设置抢占队列中的优先级。此函数评估静态资源在哪里忙或在等待下一个代理。如果资源繁忙,则将船舶 C 的优先级设置为 2,将 A 和 B 的优先级设置为 1,并且当码头准备好接收队列中的下一个代理时,设置优先级 C=3、B=2、A=1。这个实现的关键是退出释放块时队列的函数 recalculatePriorities。
  • 感谢分享,这是一个有趣的方法!另外,我建议始终将 C 优先级保持为 3,因为您可能会造成这样一种情况,即优先级为 2 时被 C 船占用的资源被优先级为 3 的 C 船抢占。
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 2014-11-26
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多