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

AnyLogic: Arrivals defined by rate & matching variables

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

例如:

  1. 起点= city1,depatures_per_week = 2,目的地= dest1
  2. 开始= city1,depatures_per_week = 0.5,目的地= dest2

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

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

谢谢!

如果您愿意假设源可以建模为泊松过程,那么您可以以它们的组合速率生成它们,然后将它们分解为与各个目的地的速率成比例的组件目的地,因为您注意到了。

对于您的示例,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 <= 0.8,这批货物去dest1,否则去dest2。

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

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

的例子
 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 中构造 Window 函数。 Window 然而,函数在 JPA 中不可用。