用Java实现Nagel-Schreckenberg模型
对于交通模拟中的每个给定车辆,Nagel-Schreckenberg模型规定,必须对模拟中的所有车辆应用以下四个步骤,以并行方式,顺序如下:用Java实现Nagel-Schreckenberg模型,java,multithreading,algorithm,threadpool,Java,Multithreading,Algorithm,Threadpool,对于交通模拟中的每个给定车辆,Nagel-Schreckenberg模型规定,必须对模拟中的所有车辆应用以下四个步骤,以并行方式,顺序如下: 加速:所有未处于最大速度的车辆的速度都会增加一个单位。例如,如果速度为4,则增加到5 减速:检查所有车辆与前方车辆之间的距离(以单元为单位)是否小于其当前速度(以每个时间步的单元为单位)。如果距离小于速度,速度将减少到汽车前面的空单元数,以避免碰撞。例如,如果一辆车的速度现在是5,但前面只有3个自由单元,第四个单元被另一辆车占用,则车的速度将降低到3 随机
有什么想法吗 算法背后的思想是,您需要在计算之前维护模型的状态,然后计算所有车辆,然后更新整个模型 这就是所谓的并行更新 如果要在计算时进行更新,则在计算下一个时间步时,模型会发生变化,因此模型中存在不一致的行为
Concurrent
意味着您确实可以使用1-n
线程来执行相同的操作,因为您的计算可以对每辆车同时进行,因为模型不应该更改
就我个人而言,只要你的模型的计算成为瓶颈,我就不会同时进行,很可能当你有很多车的时候。在这种情况下,我将分配一个线程池,其线程数等于CPU内核的线程数,并将car列表分为等量的car
然后让每个线程计算其模型的新状态,然后再次组合各个部分。算法背后的思想是,您需要在计算之前维护模型的状态,然后计算所有车辆,然后更新整个模型 这就是所谓的并行更新 如果要在计算时进行更新,则在计算下一个时间步时,模型会发生变化,因此模型中存在不一致的行为
Concurrent
意味着您确实可以使用1-n
线程来执行相同的操作,因为您的计算可以对每辆车同时进行,因为模型不应该更改
就我个人而言,只要你的模型的计算成为瓶颈,我就不会同时进行,很可能当你有很多车的时候。在这种情况下,我将分配一个线程池,其线程数等于CPU内核的线程数,并将car列表分为等量的car
然后让每个线程计算其模型的新状态,然后再次组合各个部分。我认为wikipedia文章中呈现的方式有点误导 如果您检查这4个步骤,您将看到前3个步骤可以逻辑上折叠为1(根据当前速度、前方自由单元的数量和随机因子调整车辆速度)。对于每辆车,只有一个是外部状态-自由单元的数量-并且仅在步骤4中更新。步骤4不受外部状态的影响-车辆根据其当前速度盲目移动。这就是本文中“并行性”的含义——2个逻辑动作不是按每辆车的顺序执行的,而是针对整个车型执行的 因此,线程问题是没有意义的,因为所有需要发生的是,所有的汽车都修改了它们的速度,然后所有的汽车都被移动。除了提高效率之外,在这两个步骤中都不需要多线程 因此,最简单的实施方式是: (给定一组汽车)
- 迭代所有车辆,应用速度修改规则
- 迭代所有车辆,应用位置更改
- 重复,直到完成