在模拟引擎中的节点之间的交互建模时,有没有办法降低复杂性?

问题描述

我正在使用带有JavaFX UI的Java构建仿真。

这个想法是,我可以创建许多Person对象(在一个数组中),其中将包含(x,y)坐标以表示要在屏幕上呈现的位置。在每个时间步骤中,我都会遍历数组并将一些对象应用于Person对象以计算其下一个位置(基于当前速度等)。到目前为止一切顺利...

但是,我还想对Person对象之间的交互进行建模(确保它们例如不会重叠,并且只会彼此反弹)。我能看到的唯一方法是遍历每个人的数组,以将其x,y值与其他人进行比较,例如

Person [] population = initialisePopulationArray(); //Helper function to just set initial values

//A step in time occurs just before I render the new positions on screen
void step(){

   //Do basic initial calculation on positions O(n)
   for(Person person: population){
      updatePosition(person); //Based on trajectory etc
   }

   //Determine if new positions mean that people are overlapping and resolve O(n ^ 2)
   for(int i=0; i<population.length; i++){ //For every person
      Person person = population[i];

      for(int x=i+1; i<population.length-(i+1); i++){ //Compare against every other person
         compareAndResolve(person,population[x]; // Some function to compare and resolve any issues
      }

   }
}

如您所见,这带来了指数级的复杂性-这只是在这样的模拟中必须采用的方式,还是我错过了更好的方式?

任何帮助将不胜感激!!!

解决方法

如果两个人只要不离开某个距离( d )就不会互动,那么您可以将您的世界划分为大小为 d x d 的正方形。然后,您只需要检查每个人是否与其他人位于相同或相邻的正方形中即可。

在Java中,您可以使用Hashmap<java.awt.Point,List<Person>>来跟踪每个广场上的人。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...