1

我正在尝试使用 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}

}

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

这里提到了 RL 参数。强化学习参数

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

4

3 回答 3

1

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

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

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

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

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

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

案例 1:使用 Service 或 Seize 块

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

案例 2:使用普通的 Queue 块

如上所述,但在所有紧接在前的块的退出操作中进行优先级方案决策(即,在代理到达队列块并分配其优先级之前运行)。

于 2021-06-27T08:14:41.280 回答
1

我建议宁愿使优先级规则在队列中动态化。

我假设您有一些具有离开时间和等待时间字段的代理。

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

请记住,如果您更改规则,则需要调用 queue.sortAgents(),因为仅对到达的新代理进行排序,而不是对队列中等待的整个代理列表进行排序,因为这将过于占用资源。

在此处输入图像描述

于 2021-07-01T13:57:52.600 回答
-2

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

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

于 2021-06-26T16:22:26.177 回答