我正在做一个植绒类群的模拟只是为了好玩,我想稍微优化一下。 需要工作的区域是在给定的 boid 附近找到 boids。我认为,执行某种适合该任务的空间数据结构将是我最好的选择(请参阅 here 并向下滚动一点。)。
无论我选择什么,我都会从头开始用 Java 实现自己。与仅调用一堆库函数相比,这样我将更多地了解我选择的数据结构。
我知道 R-Trees , k-d trees , 和 Quadtrees .在我看来,它们都是可行的选择。但是我对这些数据结构没有任何经验,我也不确定什么最适合我的目的。 我不需要 this scale 上的任何东西- 我说的可能是几百个 boid,也许最多一千个,而不是一百万个,但请记住,我最终可能最终会在 Android 手机上运行它。
请为此推荐一种数据结构(当然不限于上述),并给我一个选择它而不是其他选择的充分理由。
是的,我见过this question .不,我对答案不满意 - 根本没有给出任何推理。
哦,还有一件事 - 正如标题所说,这仅适用于二维。
最佳答案
九年来不及帮忙Iskar Jarak但我会插话,因为其他人可能会在搜索中找到这个老问题。
关键是,几乎任何事情都比查看每一对 boids 的天真 O(n²) 方法要好。因此,正如 Iskar 所建议的,任何一种基于树的空间数据结构都是一个巨大的改进,基本上是 O(n log n)。也就是说:n 个 boid 中的每一个都需要查找它的邻居,每个邻居都是 O(log n)。
需要注意的是Desmond Vehar提到的“命中检测”是一个稍微不同的问题,询问“这个查询位置是在我的数据结构中的任何‘对象’‘内部’吗?”在多代理模拟中,我们希望找到多个邻居。有时是“最近的 N 个邻居”或“查询位置给定半径内的所有邻居”。通常将一个 boid 描述为它的中心点并根据点之间的距离进行过滤,从而产生一个“查询球体”就足够了。
在他的算法类(class)中 Tim Roughgarden不断问“我们能做得更好吗?”事实上,虽然查找邻居的 O(log n) 比 O(n) 好,但最好的是恒定时间查找,O(1)。这里的哈希表(又名未排序的映射)是我们的 friend 。
这两个想法,多个邻居和散列,导致加速多智能体模拟的好方法:空间散列到体素(/boxes/lattices)。每个体素都包含一组机器人/代理。代理的连续空间位置(通常是 2 或 3 个 float )被转换为体素坐标(2 或 3 个整数,通过缩放的“floor”操作),它们被散列在一起以产生一个“体素 ID”,用作体素哈希表中的键。因此,在 O(1) 恒定时间内,就像数组引用一样,您可以查找包含当前在同一体素中的所有代理的集合的体素。 “查询球体”通常会与多个体素重叠。这些可以通过将查询点偏移体素间距的倍数来找到。这几个体素的内容合并在一起形成潜在邻居的集合,然后按距离过滤。当 agent/boid 移动时,它们会比较新旧“体素 ID”,如果不相等,它们会将自己从数据结构中移除,然后重新插入到新位置。
资源:
“空间数据结构”/“空间数据库”大致有无数种。请参阅此维基百科文章进行调查:Spatial database .另见 Hanan Samet 的早期论文:1989 年的 Hierarchical Spatial Data Structures和 1995 年的 Spatial Data Structures .
在 2000 年代初期我自己的工作中,我使用了固定大小的体素集合,用 i、j、k 坐标寻址: Interaction with Groups of Autonomous Characters 2000 年,和 Big Fast Crowds on PS3在 2006 年。后来,我转而使用“空间散列到体素”方法,它不需要 3d 体素网格尺寸的先验规范,并且对于具有许多空体素的稀疏代理分布具有零开销。
关于java - 适用于Java中Flocking Boids的二维空间数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867825/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_