AnyLogic:到达率和匹配变量定义
AnyLogic: Arrivals defined by rate & matching variables
我想通过源块将车辆插入特定工厂。我的植物是基于代理类型的种群,我想在其中编写普遍适用的逻辑。
到达由我想从数据库中读取的到达率(例如每周 5 次)定义。数据库由以下列组成:start(车辆应启动的工厂名称),depatures_per_week(速率),destination(车辆目的地)。
例如:
- 起点= city1,depatures_per_week = 2,目的地= dest1
- 开始= 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 中不可用。
我想通过源块将车辆插入特定工厂。我的植物是基于代理类型的种群,我想在其中编写普遍适用的逻辑。
到达由我想从数据库中读取的到达率(例如每周 5 次)定义。数据库由以下列组成:start(车辆应启动的工厂名称),depatures_per_week(速率),destination(车辆目的地)。
例如:
- 起点= city1,depatures_per_week = 2,目的地= dest1
- 开始= 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 中不可用。