AnyLogic:由速率和匹配变量定义的到达

Posted

技术标签:

【中文标题】AnyLogic:由速率和匹配变量定义的到达【英文标题】:AnyLogic: Arrivals defined by rate & matching variables 【发布时间】:2020-09-03 02:52:40 【问题描述】:

我想通过源块将车辆插入特定工厂。我的工厂是基于代理类型的群体,我想在其中编写普遍适用的逻辑。 到达率由我想从数据库中读取的到达率(例如每周 5 次)定义。该数据库由以下列组成:start(车辆应启动的工厂名称)、depatures_per_week(费率)、destination(车辆目的地)。

例如:

    start= city1, depatures_per_week = 2, destination= dest1 start= city1, depatures_per_week = 0.5, destination= dest2

现在我对一个源块有 2 个费率。我想将它们加到一个费率,并根据车辆的变量 v_destination 中的每周出发次数写下目的地。所以 0.2 % 会得到 dest2 而 0.8 % 会得到 dest1。

如何编写代码来根据个别费率定义车辆的目的地?

谢谢!

【问题讨论】:

样本数据和期望的结果可以让其他人理解您所说的内容。 【参考方案1】:

如果您愿意假设源可以建模为 Poisson 过程,那么您可以按照它们的组合速率生成它们,并将它们分解为与各个目标的速率成比例的组件目标,如您所指出的。

对于您的示例,city1 的综合费率为 λc = (λd1 + λd2) = 2 + 0.5 = 2.5。其中,比例 λd1 / λc = 2/2.5 = 0.8 和 λd2 / λc = 0.5/2.5 = 0.2 应该分别路由到目的地 1 和 2。所以以 2.5 的速率生成货件,然后生成一个 U,一个 Uniform(0,1) 随机数。如果 U

这概括了目的地的数量。如果目的地 d1、d2 和 d3 的比例为 p1、p2 和 p3,然后当 U 1, d2 时将它们路由到 d1 > 当 p12 时,否则为 d3。换句话说,使用一系列 if/else 逻辑与累积比例进行比较。

【讨论】:

也许你可以帮助我定义 p 和 d 的代码。我用 querydsl 尝试了以下操作:p1=selectFrom(trains) .where(trains.start.eq(p_name) .orderBy(trains.percentage.asc()) .limit(1) .offset(0) .fetch(trains.percentage)); 但是我收到一条错误消息,上面写着“说明:方法 orderBy(OrderSpecifier) 未定义类型 BooleanExpression。”你知道我的错误在哪里吗? @Kristina 抱歉,我的知识领域是模拟,但我不使用 AnyLogic,并且十多年来没有使用 SQL。也许您应该将其作为一个单独的问题提出?这在 SO 上并不少见。 括号错了。您尝试使用 order by 子句作为 where 子句。应该是:selectFrom(trains) .where(trains.start.eq(p_name)) .orderBy(trains.percentage.asc()) .limit(1) .offset(0) .fetch(trains.percentage);【参考方案2】:

首先,您似乎需要获取给定源的每个目的地的概率。您可以使用连续加入主查询的子查询或使用窗口函数来执行此操作。个人觉得窗口函数比较清晰一些,所以这里是一个使用窗口函数的例子

 SELECT
      start,
      destination,
      depatures_per_week / SUM(depatures_per_week) OVER (
            PARTITION BY start
            ORDER BY  destination
            ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
      ) * 100 as percentage
 FROM trains

完整示例:

postgres=# select start, destination,     departures_per_week / 
SUM(departures_per_week) OVER (  PARTITION BY start  ORDER BY  destination     
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) * 100 as percentage  
from (values ( 'city1', 2.0, 'dest1') , ('city1', 0.5, 'dest2' )) as 
trains(start, departures_per_week, destination);
 start | destination |       percentage
-------+-------------+-------------------------
 city1 | dest1       | 80.00000000000000000000
 city1 | dest2       | 20.00000000000000000000
(2 rows)

可以使用WindowFunction 在QueryDSL SQL 中构造窗口函数。然而,窗口函数在 JPA 中不可用。

【讨论】:

以上是关于AnyLogic:由速率和匹配变量定义的到达的主要内容,如果未能解决你的问题,请参考以下文章

AnyLogic 的到达率是泊松分布吗?

Anylogic - 从其他代理访问变量

Anylogic变量未更新

Anylogic : 油码头模拟

设置 AnyLogic 状态图以给定速率加 1

在 AnyLogic 多目标优化中引用非决策/非优化变量