You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AnyLogic中为Mt/M/c队列模型实现非齐次泊松过程智能体生成?

在AnyLogic中实现非齐次泊松过程(NHPP)生成智能体的方法

核心思路

AnyLogic原生Source模块不支持直接输入自定义时变速率函数(如a+b*sin(t)),但可以通过事件模块手动控制触发逻辑或自定义Source的到达间隔表达式实现非齐次泊松过程的智能体生成,核心是通过概率采样方法计算下一个智能体的到达时间。


方法一:使用事件模块手动生成

这是最灵活的实现方式,完全自定义到达逻辑:

  1. 添加Event模块,设置为「Repeatable」(重复触发)。
  2. 在事件的「Action」面板编写智能体生成逻辑:
    // 创建智能体并发送到后续端口,替换AgentType为你的智能体类
    AgentType newAgent = agentType.create(this);
    send(newAgent, out);
    
  3. 实现非齐次泊松过程的到达时间采样函数:
    对于速率函数λ(t) = a + b*sin(t),可以用拒绝采样法(实现简单,适合速率波动不大的场景),先在模型全局定义参数:
    double a = 3; // 基础到达速率
    double b = 1; // 速率波动幅度
    double lambda_max = a + b; // 速率函数的最大值
    
    然后编写采样函数:
    double nextNHPPArrivalTime() {
        double currentTime = time();
        while(true) {
            // 生成候选到达时间(基于最大速率的指数分布)
            double u1 = uniform(0, 1);
            double candidateTime = currentTime - Math.log(u1) / lambda_max;
            // 生成均匀随机数判断是否接受候选时间
            double u2 = uniform(0, lambda_max);
            double currentRate = a + b*Math.sin(candidateTime);
            if(u2 <= currentRate) {
                return candidateTime;
            }
        }
    }
    
  4. 在事件的「Next time」面板填写nextNHPPArrivalTime(),让事件在计算出的时间点触发生成智能体。

方法二:自定义Source模块的到达间隔

如果想保留Source模块的封装性,可以修改其到达模式:

  1. 将Source的「Arrival pattern」设置为「Inter-arrival time」,选择「Expression」作为间隔类型。
  2. 复用上述nextNHPPArrivalTime()函数,在间隔表达式中填写:
    nextNHPPArrivalTime() - time()
    
    (因为Source的间隔是相对于当前时间的差值,需要用下一次到达时间减去当前仿真时间)

注意事项

  • 若速率函数的最大值随时间变化,需动态更新lambda_max,否则拒绝采样的效率会大幅降低。
  • 对于复杂的速率函数,拒绝采样效率低时,可改用数值积分+二分法求解累积强度函数的逆来得到到达时间,适合精度要求高的场景。

内容的提问来源于stack exchange,提问作者obiwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:25:15