Anylogic运行时动态修改Queue块优先级规则的代码实现咨询
解决方案
首先你需要先在当前模型的Main或者对应Agent页面新增一个int类型的全局控制变量,命名为priorityRuleSwitch,默认值可设为0。
步骤1:修改Queue块优先级表达式
将你当前Queue块的优先级判断表达式替换为如下内容:
priorityRuleSwitch == 0 ? agent.departure_date : time() - agent.getEntryTime()
该表达式会根据priorityRuleSwitch的值动态返回对应优先级计算结果:
- 变量值为0时返回代理的出发日期作为优先级依据
- 变量值为1时返回代理的已等待时长作为优先级依据
步骤2:补全doAction函数代码
完整的doAction函数代码如下:
doAction(int action){ if(action == 0){ priorityRuleSwitch = 0; } else { priorityRuleSwitch = 1; } // 若需要队列中已存在的代理立刻按照新规则重新排序,取消注释下一行代码 // myQueue.sort(); }
注意事项:
- 请将代码中的
myQueue替换为你自己模型里Queue块的实际名称- 若你的代理的出发日期参数名、等待时间的计算逻辑和示例不一致,将表达式中对应部分替换为你原有规则的代码即可
- 若仅需要新进入队列的代理遵循新优先级规则,无需调用
sort()方法;若需要队列中已有代理立刻重新排序,保留该调用即可。
内容的提问来源于stack exchange,提问作者Chhandosee Bhattacharya
相关产品推荐
相关产品推荐

