在 Anylogic 中在运行时更改队列块的优先级规则

问题描述

我正在尝试使用 pathmind 库在 Anylogic 中实现强化学习,RL 代理可以采取两种操作中的任何一种来改变队列块的优先级规则。

我有一个队列块,我在其中使用基于优先级的排队。我有两个优先规则:使用代理的出发日期代理的等待时间。我想在运行时使用另一个名为 doAction(action) 的函数来执行这些规则中的任何一个。值 0 或 1 将传递给此函数函数体应该是这样的:

doAction(action){

if(action==0){
//set departure_date as priority rule of Queueblock}

else{
//set wait_time as priority rule of Queueblock}

}

这里给出了我的队列块的表达式。

QueueBlock

这里提到了RL参数。

RL Params

从 doAction(action) 函数动态设置优先级规则的代码应该是什么?

解决方法

我建议在队列中动态设置优先级规则。

我假设您有一些代理,其中包含一个用于离开时间和等待时间的字段。

然后您可以执行以下操作: 如果优先级选项发生变化,您只需为每个代理设置不同的优先级。 在这里,我使用布尔值 useDaprtureTime,但您可以根据需要使其变得复杂,甚至可以在“代理优先级”字段中使用一个函数来返回优先级。

请记住,如果您更改规则,则需要调用 queue.sortAgents(),因为只有到达的新代理会被排序,而不是队列中等待的整个代理列表,因为这会占用太多资源。

enter image description here

,

要使用优先级,您可以在队列的“代理优先级”或“代理 1 优先于代理 2”属性中指定一个表达式来确定代理的优先级(取决于您使用的优先级方案)。

因此,该表达式将调用一个函数(在相关代理类型中定义),该函数返回出发日期或等待时间备选方案。

此外,您没有说明这是否是全局设置 --- 即,在整个运行中使用基于出发或等待时间的优先级 --- 或者可以动态更改;如果您想要后者,您可能需要在适当的时间(即,当您确定优先级时)调用 Queue 块(可能在 Service 或 Seize 块内,具体取决于您在做什么)的方案更改)重新计算当前在队列中等待的代理的所有优先级。

编辑:我从您的其他评论中看到您正在尝试使用强化学习,大概是学习如何就如何确定代理的优先级做出决定。 (你应该把它放在你的问题的编辑中,因为它非常重要和相关!)

因此,如果您将队列视为“学习代理”,则需要将学习操作(将设置/决定您使用的优先级方案)与在优先级中使用该方案分开。

这取决于您是单独使用队列(基于优先级或代理比较队列),还是在 Service 或 Seize 块中执行此操作。这很重要,因为后者的输入操作在优先级计算表达式之前运行,但是,对于普通队列,它在优先级计算之后运行。

案例 1:使用 Service 或 Seize 块

让 on-enter 动作成为 RL 动作,然后设置一些变量来说明它选择了哪种优先级方案,然后在其嵌入式队列 (sortAgents) 上调用 sortAgents 以重新计算所有优先级。然后在上面的优先级计算表达式中使用 switch 来使用所需的方案对传入代理进行计算。

案例 2:使用普通队列块

同上,但在所有紧接在前面的块的退出时执行优先级方案决定(即,在代理到达队列块之前运行并分配其优先级)。

,

您始终可以使用 2 个队列块,并使用它们前面的 SelectOutput 块将代理发送给一个。

每个代理根据您的条件决定使用哪个队列。