#离散事件 #DES #转换

sequent

交互式离散事件模拟库

4 个版本 (2 个破坏性更新)

0.3.0 2022年12月22日
0.2.1 2022年11月25日
0.2.0 2022年11月25日
0.1.0 2022年11月25日

#169模拟


sequent-repl 中使用

MIT 许可证

60KB
1.5K SLoC

Sequent

交互式离散事件模拟库。

Crates.io docs.rs Build Status codecov

模拟概念

什么是DES?

离散事件模拟(DES) 将系统建模为一系列事件,其中每个事件都将系统从一种状态转换为另一种状态。这与使用一组微分方程在时间上“平滑”地改变系统状态的 连续模拟 相对照。

DES 对于模拟那些事件(相对)不频繁发生,并且对底层状态有影响的系统工作得很好。这种看似稀疏的特性使我们能够使用 有限状态机(FSM) 来建模系统。

初始状态和事件时间线

每个DES都可以表示为一些 初始状态 和一个顺序的 事件时间线 的组合。一些系统仅模拟未来(即待办)事件,通常使用队列。Sequent 将时间线视为过去和未来事件的连接,使用一个浮动的 光标 来分隔这两个序列。Sequent 的 DES 是 交互式 的;即,它不仅能够自主执行事件,而且还允许用户介入并改变模拟的进程。由于用户可以提出一个替代的时间线,Sequent 保留所有事件,以便它们可以保存到磁盘并在以后(如果用户选择的话)重新播放。这也意味着 Sequent 没有时间线引导需求(与非交互式模拟不同,非交互式模拟至少需要一个初始事件)——您可以将其初始化为空的时间线,并从 REPL 风格(读取-评估-打印循环)界面添加新事件。

DES 通过按 时间顺序 评估事件来工作;一个事件将系统从当前(事件前)状态转换为下一个(事件后)状态。一个例子可能是向集合中添加一个元素:在某个现有状态中,集合缺少一个元素。在执行(假设的)add-element 事件后,该元素将成为集合的成员。

时间线中的事件是按索引的,第一个事件的索引为零,第二个事件的索引为一,依此类推。光标充当指向下一个待评估事件的指针。

The event timeline

交互性和时间线截断

当与用户界面结合时,Sequent 允许您逐步通过模拟,观察每个中间状态。您可以“跳转”到任何状态,这意味着可能是倒退或快进模拟。

然而,真正的交互性来自于手动通过在任意位置注入新事件来改变时间轴的能力。有一个值得注意的限制:将事件插入时间轴的中间需要截断插入点之后的所有事件。

我们都看过好莱坞电影,其中角色穿越时空,不小心改变了(当时)的未来,回到了一个非常不同的现在。还记得埃米特·布朗博士的著名引言——“它可能引发连锁反应,将时空连续体的本质撕裂”——吗?事实证明,“博士”是对的。

考虑一个涉及金融投资组合优化的场景。在某个时间 _T__M_,手动向持仓注入资金。在稍后的时间 _T__N_,模拟重新平衡了投资组合,用资金交换股票,并且相应地更新了模拟状态。假设我们将模拟回滚到 _T__M_ 并注入更少的资金。返回到 _T__N_ 时,我们会观察到不一致的状态——似乎是凭空出现的过多股票。为了避免这种异常,DES 要求我们在时间轴的任何位置插入新事件时放弃所有未来的事件。

开始使用

添加依赖

cargo add sequent

示例

请参阅一个简单的离散事件模拟示例,其中一只高度决定的蜗牛爬墙,请参阅 examples/snail.rs

依赖项

~2–2.7MB
~58K SLoC