java - 在 Java 中实现 Nagel-Schreckenberg 模型

标签 java multithreading algorithm threadpool

对于交通模拟中的每辆给定汽车,Nagel-Schreckenberg 模型指定以下四个步骤必须应用于模拟中的所有汽车,按以下规定的顺序并行:

  1. 加速度:所有未达到最大速度的汽车的速度都会增加一个单位。例如,如果速度为 4,则增加到 5。
  2. 减速:检查所有汽车以查看其与前方汽车之间的距离(以单元格为单位)是否小于其当前速度(每个时间步长具有单元格单位).如果距离小于速度,则速度会降低到汽车前方空单元格的数量——以避免碰撞。例如,如果一辆汽车的速度现在是 5,但它前面只有 3 个空闲单元格,而第四个单元格被另一辆车占用,则汽车速度将降低到 3。
  3. 随机化:所有速度至少为 1 的汽车的速度现在以 p 的概率降低一个单位。例如,如果 p = 0.5,那么如果速度为 4,它会在 50% 的时间内降低到 3。
  4. 汽车运动:最后,所有汽车向前移动的单元数等于它们的速度。例如,如果速度为 3,则汽车向前移动 3 个单元格。

( Nagel Schreckenberg Model )

我明白这背后的逻辑,我明白为什么它必须并行执行才能正常工作。但是,我不确定如何在 Java 中实现它。既然它必须并行执行,那一定意味着分配了一个单独的线程来大致同时为每辆车运行所有这些步骤?

在模拟中我一次可以运行多达 30 辆汽车,这不是很多线程吗?我能想到的唯一方法是拥有一个线程池并重用它们以避免每次都创建线程。我仍然不确定它是否是最佳解决方案。

有什么想法吗?

最佳答案

该算法背后的想法是,您需要在计算之前维护模型的状态,然后对所有汽车进行计算,然后更新整个模型。

这就是并行更新的通常含义。

如果您在计算时进行更新,那么在您为下一个时间步计算模型时,模型会发生变化,因此您的模型会出现不一致的行为。

并发 意味着您确实可以使用 1-n 线程来做同样的事情,因为您的计算可以为每辆车并发完成,因为模型不应该改变.

就我个人而言,只要模型的计算成为瓶颈,我就不会并发执行,当您有很多汽车时很可能。在这种情况下,我会分配一个 ThreadPool,其线程数与 CPU 核心数相等,并将汽车列表分块为等量的汽车。

然后让每个线程计算模型的新状态,然后再次组合这些部分。

关于java - 在 Java 中实现 Nagel-Schreckenberg 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15460484/

相关文章:

java - Selenium 断言存在和不存在的元素

linux - 当线程堆栈使用的内存被释放时

java - volatile 引用是在线程之间传递 MotionEvents 的安全方式吗?

c++ - Trie 中的最短路径

r - 在 R 中使用 k-NN(类包)的最近邻索引

java - 如何从类型输入类下的表列表中选择值

java - Kotlin:公共(public) getter 返回不可变列表,但私有(private) getter 应该返回可变列表

java - Android Studio 将 java 模块转换为 android 模块

Python如何用信号杀死阻塞在队列上的线程?

c# - 从 2 个数据表中高效地选择与列的总和匹配的行