领土巡逻计划


14

我正在开发一个游戏/模拟,代理商在其中争夺土地。我的状况如下图所示:

绿色和红色的瓷砖区域,带有类似颜色的“生物”

这些生物走来走去,占据一块土地,如果他们有空的话,他们会踩到它们。为了使这一点变得更有趣,我想介绍“巡逻”行为,以便探员实际上是在他们的土地上走来走去,从任何可能想要入侵的入侵者那里巡逻。

在技​​术方面,每个正方形均表示为x,y位置以及表示其边长的尺寸。它还包含有关谁占据广场的信息。所有正方形均存储在中ArrayList

如何介绍巡逻行为?我想要的是让每个特工巡逻该区域的某个部分(他们在他们将巡逻的区域之间划分)。我发现的主要问题如下:

  • 如图所示,土地面积非常随机。很难理解各个方向的界限。
  • 特工应如何分割地区巡逻?
  • 土地区域可能是不相交的,因为对方的队伍可能会从中间占据领土。

我的想法是在每个方向上取最远的正方形,将其视为该区域的边界,并根据这些边界划分区域,但这可能包括许多无关的土地。

我应该如何解决这个问题?


1
也许您可以考虑一些图像处理技术的想法?可以从每个代理发出并发运行的各种区域增长算法,直到将属于其团队的所有图块都分配了巡逻代理为止。
Quetzalcoatl

@Quetzalcoatl:好主意,易于实现,但这会导致巡逻区域非常不平等。考虑上图中的绿色代理。右上方的特工将覆盖约15个正方形,中间的那个仅2个
。– Junuxx

嗯,这有点像从当前区块中挑选出属于他们团队的下一个最近区块。
Tohmas

1
确实,这是不完美的。也许不使用该药剂作为该地区的种子来生长,而是可以最初随机种植种子(每个药剂一个)。一旦区域增长完成,也许可以执行一个平衡步骤,将每个区域像一个以图块为节点的类簇一样对待。KNearestNeighbour或KMean或类似的对象可以迭代直到某种形式的收敛,然后可以将这些区域视为大致平衡,然后将每个代理分配给最近的种子(欧式距离?)。(我想我可能使这个问题复杂化了,必须采用一种更简单的方法...)
Quetzalcoatl

1
也许每个代理都可以通过排斥所有其他代理(例如磁铁)来开始。这将迫使特工前往该地区的不同角落。当特工休息时,像Quetzalcoatl建议的那样分割土地。区域应该大致均匀。
tyjkenn

Answers:


9

有趣的问题。我认为您必须解决的第一个问题是您希望巡逻行为是“最佳”巡逻还是“栩栩如生”的巡逻。我只是在编造这些词,但我的意思是:

最佳:代理以一种完美地分布其覆盖整个系统范围的方式移动。

栩栩如生:代理人四处走动,并尝试尽可能平均地分布自己,但每个人只能访问其视角本地的数据。

我将重点介绍第二种方法,我认为您可以使用Craig Reynolds的“ 自主角色的操纵行为 ”中的各种操纵模式的加权混合来解决。转向行为的基本思想是使用简单的力相结合以在环境中产生即兴导航。就您的情况而言,我认为您想结合以下操纵行为:

  • 回避(境外)-特工试图留在其境内并避免移出境外。但是对于某些现实主义来说,“走出”领土的影响在这里不一定是100%。在该区域外一点点“偷工减料”可能会使动作更加逼真。

  • 徘徊 -特工试图不断移动和探索。您将要对此进行沉重的考虑,否则代理商将试图找到彼此之间的最佳分离点,然后“保持原样”。

  • 分隔(其他座席)-座席试图与其他座席保持一定距离(这样它们可以覆盖最大的地面并且不会结块)。

  • 寻求(入侵者)-代理尝试对发现的任何入侵者进行封闭。

我认为您想动态地处理相对权重。例如,如果特工检测到入侵者,则分离权重应降低。(换句话说,他们只需要在狩猎时散布,而不是在找到某人时就散开。)我认为,如果您按照上述四种模式的权重进行测试,那么您所得到的东西将非常接近您所需要的东西。重新寻找。

在线上有很多资源,涉及如何按照所描述的行为模式来实现“ boids”。我推荐开源实现opensteer


2

一个方法是为每个牢房记录“警卫”最后一次访问的时间,并让警卫不断地移动到未被访问时间最长的相邻牢房。

当然,这是假定领土已连接。

这不是一个完美的解决方案,但是易于编码,适应不断变化的环境并且高效。我在前一段时间写的rts中成功地使用了该算法进行侦察和骚扰攻击。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.