用Java实现Nagel-Schreckenberg模型

用Java实现Nagel-Schreckenberg模型,java,multithreading,algorithm,threadpool,Java,Multithreading,Algorithm,Threadpool,对于交通模拟中的每个给定车辆,Nagel-Schreckenberg模型规定,必须对模拟中的所有车辆应用以下四个步骤,以并行方式,顺序如下: 加速:所有未处于最大速度的车辆的速度都会增加一个单位。例如,如果速度为4,则增加到5 减速:检查所有车辆与前方车辆之间的距离(以单元为单位)是否小于其当前速度(以每个时间步的单元为单位)。如果距离小于速度,速度将减少到汽车前面的空单元数,以避免碰撞。例如,如果一辆车的速度现在是5,但前面只有3个自由单元,第四个单元被另一辆车占用,则车的速度将降低到3 随机

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

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

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

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


    有什么想法吗

    算法背后的思想是,您需要在计算之前维护模型的状态,然后计算所有车辆,然后更新整个模型

    这就是所谓的并行更新

    如果要在计算时进行更新,则在计算下一个时间步时,模型会发生变化,因此模型中存在不一致的行为

    Concurrent
    意味着您确实可以使用
    1-n
    线程来执行相同的操作,因为您的计算可以对每辆车同时进行,因为模型不应该更改

    就我个人而言,只要你的模型的计算成为瓶颈,我就不会同时进行,很可能当你有很多车的时候。在这种情况下,我将分配一个线程池,其线程数等于CPU内核的线程数,并将car列表分为等量的car


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

    算法背后的思想是,您需要在计算之前维护模型的状态,然后计算所有车辆,然后更新整个模型

    这就是所谓的并行更新

    如果要在计算时进行更新,则在计算下一个时间步时,模型会发生变化,因此模型中存在不一致的行为

    Concurrent
    意味着您确实可以使用
    1-n
    线程来执行相同的操作,因为您的计算可以对每辆车同时进行,因为模型不应该更改

    就我个人而言,只要你的模型的计算成为瓶颈,我就不会同时进行,很可能当你有很多车的时候。在这种情况下,我将分配一个线程池,其线程数等于CPU内核的线程数,并将car列表分为等量的car


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

    我认为wikipedia文章中呈现的方式有点误导

    如果您检查这4个步骤,您将看到前3个步骤可以逻辑上折叠为1(根据当前速度、前方自由单元的数量和随机因子调整车辆速度)。对于每辆车,只有一个是外部状态-自由单元的数量-并且仅在步骤4中更新。步骤4不受外部状态的影响-车辆根据其当前速度盲目移动。这就是本文中“并行性”的含义——2个逻辑动作不是按每辆车的顺序执行的,而是针对整个车型执行的

    因此,线程问题是没有意义的,因为所有需要发生的是,所有的汽车都修改了它们的速度,然后所有的汽车都被移动。除了提高效率之外,在这两个步骤中都不需要多线程

    因此,最简单的实施方式是:

    (给定一组汽车)

    • 迭代所有车辆,应用速度修改规则
    • 迭代所有车辆,应用位置更改
    • 重复,直到完成

    我认为维基百科文章中的表述方式有些误导

    如果您检查这4个步骤,您将看到前3个步骤可以逻辑上折叠为1(根据当前速度、前方自由单元的数量和随机因子调整车辆速度)。对于每辆车,只有一个是外部状态-自由单元的数量-并且仅在步骤4中更新。步骤4不受外部状态的影响-车辆根据其当前速度盲目移动。这就是本文中“并行性”的含义——2个逻辑动作不是按每辆车的顺序执行的,而是针对整个车型执行的

    因此,线程问题是m