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(OrderSpecifierselectFrom(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:由速率和匹配变量定义的到达的主要内容,如果未能解决你的问题,请参考以下文章