如何构建“交通AI”?


21

我目前正在从事的一个项目具有很多“交通”的含义,例如汽车在道路上行驶,飞机在停机坪上行驶等。

到目前为止,可用路径已预先计算,因此会自动生成交叉点,这些交叉点本身通过边相互连接。当角色/代理生成时,它从某个节点开始,并通过简单的A *算法找到到目标节点的路径。代理遵循路径并最终到达其目的地。到目前为止没有问题。

现在,我需要使代理能够避免冲突并处理复杂的流量情况。由于我是AI领域的新手,所以我查阅了几篇有关转向行为的论文/文章,但发现它们太低级了。我的问题很少是避免实际的碰撞(在这种情况下,这很简单,因为代理遵循严格定义的路径),而是一种情况,例如一个代理留下了死胡同,而另一个则想输入完全相同的代理。或两个遇到瓶颈的代理程序只能一次允许一个代理程序通过,但是两者都需要通过(根据之前找到的最佳路由),并且他们需要找到一种方法让另一个代理程序首先通过。因此,基本上,该问题的主要方面是预测交通流,以避免死锁。

很难描述,但我想您明白我的意思。您对我从哪里开始有什么建议?是否有任何论文,示例项目或类似的东西可以帮助我入门?

我感谢您的帮助!


协作传播可能会帮助您。这是一种简单的方法,可以解决多个代理同时进行的路径搜索+避免代理的情况。请在某个地方分享您的经验,谢谢。;)
user712092 2011年

Answers:


12

解决这个问题的方法太多了,我在这里很难给出一个体面而全面的答案。但是这里有一些高级设计要点。

  • 您正在这里构建一个座席模拟。寻路只是系统的一种输入-代理有一个目标,而寻路只是它可以实现该目标的一种方式。实际上,对代理人进行实质性思考有两个目标:驾驶员的首要目标是“不要撞车”,其次是“到达我想去的地方”。
  • 您的系统应建立在现实世界的并行基础上。大多数道路都有两条或更多车道的原因是因为使用该系统来组织交通要容易得多,没有人需要考虑很多。在单车道场景中,驾驶员必须解决各种问题:

    检测 -除非您彼此避免,否则您和即将驶来的汽车将坠毁

    反应 -放慢脚步,进入谈判阶段。

    谈判 -一个驱动因素必须带头,另一个必须屈服。如何决定的规则含糊不清,但基本上,您想要一个由任意一个驾驶员(或基于对另一个方向驶来的汽车数量的启发式方法)决定优先考虑的东西。例如,A在时间1处于优先地位,B看到A处于优先地位,并且屈服(通过移开并停下)。如果A和B都试图优先,则它们都应停止,等待一段随机的时间(或互相发信号),然后重试。最终,一个将屈服于另一个。

    此实现的优点在于,它无需维护人工队列或其他伪造的构造。谈判是根据现实世界的看法进行的-双方都进入谈判阶段后,很容易将任何重大的前瞻性动议视为优先事项。它也应该对用户做出适当的反应,而用户很可能不会遵守良好的驾驶规则。

  • 假设最坏的情况。即使在一个完美的系统中,也会出现奇怪的情况,并且您的演员应该明智地行动。如果玩家可以干预(人为地挡住区域等),则更有可能发生这种情况。通常,完全停止是唯一明智的反应(僵局!)。当场旋转或显然处于断裂状态是AI的失败。从现实世界的角度来看,完全停止是合理的。

    您越是根据简单的现实世界逻辑对演员的AI建模,就越容易创建令人信服的AI。真实的人如果无法达到自己的目标,就不会停止或来回摆动。如果通往AI目的地的唯一道路被封锁,他们应该认识到这一点并选择应对措施(完全停止,放弃并开车回家,放弃并驶向其他地方)。

  • 分层行为以获得所需的内容。请记住,第一个目标不是崩溃。因此,回避(转向)逻辑应始终主导驾驶员的行为。位于从寻路产生的方向性逻辑之上的层(“我想在下一个路口采取正确的行动”)。在偶尔对路径进行重新评估的基础上,使用更高层次的逻辑(“喜欢前进,但如果我无法取得进展,则允许涉及掉头的新路径”)。

  • 寻路来自记忆,但是情境意识是基于感知的。不要试图使您的代理人变得完美。他们知道从家到办公室的方式,因此知道要转弯。但是他们不知道2英里外的街道被封锁了。不要试图让您的代理人绘制一条完美的道路,因为没有一条道路-即使开始时是完美的道路,其他因素也可能会阻碍他们的道路。代理商只需要计划要去的几条街道。

  • 信息质量。您的行为应该很简单,但是要实现这一点,您需要良好的查询功能。您需要能够询问您的环境问题,例如“迎面而来的汽车正在占用我的车道?”,“迎面而来的汽车有多少?”,“我身后有没有汽车”,“我可以掉头” 。


感谢您的详尽回答。当我进行常规道路交通时,您的建议应该会很有帮助。但是我可能在最初的帖子中没有注意两个重要方面:1.玩家自己并不参与流量。这更像是商业模拟,他建立了网络。2.单向路径尤其发生在机场上,但是在机场上,座席并不是“自己”,而是有一个高塔告诉他们要去哪里。该塔不仅要识别棘手的情况,而且要有全面的知识,所以我想那是您所描述的情况/行为之上的一层。
2011年

5

在发布的游戏中看到一些可怕的失败后,我有几点建议:

1)除非有充分的理由否则否则要开两条车道,并且出于AI的目的,请使其在正常流向上具有优先权-允许两次并排行驶,但如果有其他情况出现,则总是错路的人总是屈服于它。

2)某种逻辑可以缓解交通拥堵(如果发生)。我看到过这样的情况,交通拥堵处理仅适用于试图互相撞向的车辆,但是在遇到->-> <-<-<-模式时却完全失败了。我记得有一张地图很容易发生这种情况-这是一个瓶颈,旨在使AI基地更难以攻击,但迟早会有两个资源收集器进来,而攻击团体正在前进,仅此而已。接触的单位会四处走动,试图寻找出路,但他们没有任何法律行动。它并没有回溯并发现其他一些单位必须先行,因此AI在取消障碍之前没有采取任何有用的行动。(您可以看到接触的单元旋转,其他什么也没做。)

我相信可以通过使卡住的单元告诉相邻的单元摆脱障碍来解决这一问题-它会传播到到达未卡住的单元为止,该单元可以退回。在解决问题之前,这必须涉及某种逻辑以使它们远离。

请注意,仅寻找替代路径通常是一个错误的答案。我已经看到过这种情况,A单元注意到B挡住了前方的道路,因此它转过头来使用了另一条路线。现在,这会阻止B的人转身-现在这条路已经畅通无阻,因此双方都再次转身。他们每转一圈都在前进和后退之间交替。

由于战争迷雾,同一款游戏我看到过不同的版本。在扼杀点有一个敌军单位。在自动移动时,除非实际瞄准敌方单位,否则寻路不会战斗。它会向前移动,看到路被堵住了。然后,它向后移动,它再也看不到阻止程序,它将再次向前移动。重复直到人类意识到它没有到达应该去的地方。


2
好的答案-我喜欢广播“卡住”消息的概念,这样任何人都可以出去。
MrCranky 2011年

4

我对交通模拟不太熟悉,但是有些事情会引起我的注意。

首先,为了避免出现瓶颈,我将设置两条车道,以允许车辆沿相反的方向行驶。在同一条“道路”上。

其次,对于可能发生的碰撞,您应该具有避免碰撞的转向行为,以防止大量堆积。转向行为可能很低级,但是对于创建逼真的紧急行为非常有用。

如果您不希望拥有多条车道,则必须在图表中存储更多信息。例如,如果业务代表A在道路上(表示为图形边缘),而业务代表B在同一条道路上的移动方向与A相反,则他们发生碰撞/死锁/无论您为处理此行为而编写了什么代码。

但是,如果代理A在道路上,则可以请求该道路的所有权。拥有这条道路将意味着没有其他代理可以沿着该边缘行进(您可以非常简单地通过将边缘成本更改为大量数字来确保在计算路径时A *不选择道路来做到这一点)。然后,当代理人A摆脱那条路时,它将放弃所有权。

老实说,这是我不特别喜欢的hacky解决方案,而且我所看到的大多数流量模拟(如果不是全部?)都使用多通道方法。


是的,应该使用两条车道(因为只有两条车道),但这不能解决任何让路的问题(问问者所描述的大多数问题是什么)
Bart van Heukelom

4

您说您查阅了几篇有关转向行为的文章,尽管以防万一,您是否查阅了以下文章?

http://www.red3d.com/cwr/steer/

如果没有,它可能会为您提供一些答案,因为它涵盖了您提到的一些问题,例如瓶颈问题(排队)。


0

我认为您需要做的是实现路径查找算法。

将您的地图尽可能地细分(例如正方形),但仅限于有效的交通地点。然后,您将确定车辆的位置和行进路线,并找到一条可能最短或最直接的路径。路径将是一个正方形阵列,通往消灭目标的每一步。然后,您不仅要计算所有车辆的当前位置,还要计算未来几步的车辆未来位置。如果将来有两辆车要在同一广场上,那么您需要更改其中一个或两个的速度。

A *(星号)是一种非常简单的路径查找算法,您可能只需将Wikipedia中的伪代码轻松转换为您选择的语言,即可使用:http : //en.wikipedia.org/wiki/A*_search_algorithm


4
正如我在第一篇文章中提到的,我已经实现了A *算法,并且还具有匹配的数据结构。同样,降低任何一种试剂的速度对我来说听起来也太“容易”。
2011年

这不是寻路问题,而是代理仿真问题。寻路只是参与者需要运用的最低智力水平。
MrCranky 2011年

太容易了?哈哈。好吧,这就是我开车时要做的事情!如果可以预测与当前路径发生碰撞,则可以更改速度。
justin.m.chase 2011年

还有交通信号灯?当您的路径被另一辆车挡住时该怎么办?当您的路径说前进时该怎么做,但是速度为零以避免碰撞。与另一辆汽车发生碰撞,其路径说(通过您)前进,并且它们的速度也为零?
MrCranky 2011年

在单车道场景中,如果在第一辆车检测到碰撞并停止时使用其他车速来计算其未来的目的地,则另一辆车也不需要停止,因为第一车速现在为0。这假设您能够及时看到足够远的距离,以查看与沿长单车道行驶的汽车相撞的情况。我的一个朋友建议您也将STOP节点添加到A *算法中。从任何一辆汽车的角度来看,您只会将其他汽车视为障碍。如果停止时间足够长,停止操作可能会阻碍您的前进。
justin.m.chase 2011年

0

当我实施《敌对国家》时,我的最后一个后悔是,如果一辆汽车停滞了2秒钟以上,我便将其向前跳跃。因此,当他们卡住时,基本就可以运输了。从来没有人抱怨过,所以我发现有几次没有人在看,也没有在看。

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.