在运行时在 Anylogic 中更改队列块的优先级规则
Change priority rule of a Queue block at runtime in 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}
}
这里给出了我的queue block的表达式。 .
这里提到RL参数。
从 doAction(action) 函数动态设置优先级规则的代码应该是什么?
您始终可以使用 2 个队列块,并使用前面的 SelectOutput
块将代理发送到一个。
每个代理根据您的情况决定使用哪个队列。
要使用优先级,您可以在队列的“代理优先级”或“代理 1 优先于代理 2”中指定一个表达式来确定代理的优先级 属性(取决于您使用的优先级方案使用)。
因此,让该表达式调用一个函数(在相关代理类型中定义),returns 出发日期或等待时间选项。
此外,您没有说明这是否是全局设置 --- 即,对整个 运行 使用基于出发或等待时间的优先级 --- 还是可以动态更改;如果你想要后者,你可能需要在适当的时间(即,当你的优先级排序时)调用 Queue 块(可能在 Service 或 Seize 块内,取决于你在做什么)的函数方案更改)以重新计算当前在队列中等待的代理的所有优先级。
编辑:我从您的其他评论中看到您正在尝试使用强化学习,大概是学习如何决定如何确定代理的优先级。 (你应该把它放在你的问题的编辑中,因为它非常重要和相关!)
因此,如果您将队列视为 'learning agent',则需要将学习操作(它将设置/决定您正在使用的优先级方案)与在优先级中使用该方案分开。
这取决于您是单独使用队列(基于优先级或代理比较队列),还是在服务或占用块中执行此操作。这很重要,因为后者 运行s 在 优先级计算表达式之前的输入操作,但是对于普通队列,它 运行s 在优先级计算之后。
案例 1:使用服务或占用块
让 on-enter 动作成为 RL 动作,然后,比如说,设置一些变量来说明它选择了哪种优先级方案,然后在其嵌入式队列上调用 sortAgents
(self.queue
) 重新计算所有优先级。然后在上面的优先级计算表达式中进行切换,使用所需的方案对传入代理进行计算。
案例 2:使用普通队列块
同上,但是在所有紧接在前的块的 on-at-exit 动作中执行优先级方案决策(即,运行 就在代理到达 Queue 块之前它的优先级已分配)。
我建议在队列中动态设置优先级规则。
我假设您有一些具有 departmentTime 和 waitingTime 字段的代理。
然后您可以执行以下操作:
如果优先级选项发生变化,您只需为每个代理设置不同的优先级即可。
我在这里使用布尔值 useDaprtureTime,但您可以根据需要将其设置得尽可能复杂,甚至可以在“Agent Priority”字段中设置 returns 优先级的函数。
请记住,如果您更改规则,则需要调用 queue.sortAgents(),因为只有到达的新代理会被排序,而不是队列中等待的整个代理列表,因为这会占用太多资源-密集型。
我正在尝试使用 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}
}
这里给出了我的queue block的表达式。
这里提到RL参数。
从 doAction(action) 函数动态设置优先级规则的代码应该是什么?
您始终可以使用 2 个队列块,并使用前面的 SelectOutput
块将代理发送到一个。
每个代理根据您的情况决定使用哪个队列。
要使用优先级,您可以在队列的“代理优先级”或“代理 1 优先于代理 2”中指定一个表达式来确定代理的优先级 属性(取决于您使用的优先级方案使用)。
因此,让该表达式调用一个函数(在相关代理类型中定义),returns 出发日期或等待时间选项。
此外,您没有说明这是否是全局设置 --- 即,对整个 运行 使用基于出发或等待时间的优先级 --- 还是可以动态更改;如果你想要后者,你可能需要在适当的时间(即,当你的优先级排序时)调用 Queue 块(可能在 Service 或 Seize 块内,取决于你在做什么)的函数方案更改)以重新计算当前在队列中等待的代理的所有优先级。
编辑:我从您的其他评论中看到您正在尝试使用强化学习,大概是学习如何决定如何确定代理的优先级。 (你应该把它放在你的问题的编辑中,因为它非常重要和相关!)
因此,如果您将队列视为 'learning agent',则需要将学习操作(它将设置/决定您正在使用的优先级方案)与在优先级中使用该方案分开。
这取决于您是单独使用队列(基于优先级或代理比较队列),还是在服务或占用块中执行此操作。这很重要,因为后者 运行s 在 优先级计算表达式之前的输入操作,但是对于普通队列,它 运行s 在优先级计算之后。
案例 1:使用服务或占用块
让 on-enter 动作成为 RL 动作,然后,比如说,设置一些变量来说明它选择了哪种优先级方案,然后在其嵌入式队列上调用 sortAgents
(self.queue
) 重新计算所有优先级。然后在上面的优先级计算表达式中进行切换,使用所需的方案对传入代理进行计算。
案例 2:使用普通队列块
同上,但是在所有紧接在前的块的 on-at-exit 动作中执行优先级方案决策(即,运行 就在代理到达 Queue 块之前它的优先级已分配)。
我建议在队列中动态设置优先级规则。
我假设您有一些具有 departmentTime 和 waitingTime 字段的代理。
然后您可以执行以下操作: 如果优先级选项发生变化,您只需为每个代理设置不同的优先级即可。 我在这里使用布尔值 useDaprtureTime,但您可以根据需要将其设置得尽可能复杂,甚至可以在“Agent Priority”字段中设置 returns 优先级的函数。
请记住,如果您更改规则,则需要调用 queue.sortAgents(),因为只有到达的新代理会被排序,而不是队列中等待的整个代理列表,因为这会占用太多资源-密集型。