7

我想问一个作业问题。我知道有些人不愿回答这类问题,但请相信我,我在这项任务上花费了很多时间,并且尽我所能尝试了一切。因此,如果可以,请提供帮助。

问题是一个网格格式的类 Rogue 类 AI 游戏,其中一个测试用例是如下图:

~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
~~   g**   d *~~
~~   ** *   * ~~
~~   **  ***  ~~
~~   **  d    ~~
~~   **    <  ~~
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~

g=gold, d=dynamite, ~=water, *=wall, < 是我们的代理,面向左。

规则是代理不能进入水中或墙壁。它只能移动到空方格或广告方格来捡起炸药。然后它可以用炸药炸毁一堵墙。炸药一旦使用,就不能再次使用。最终目标是找到黄金并捡起它。代理只能上下或左右移动。没有对角线移动。

由于文本格式的原因,在对角线方向的墙壁之间可能会出现一些额外的空间,但没有任何空间。

到目前为止,我已经使用深度优先搜索来探索地图。(这个示例地图很小,有一些很大)。我还使用 A* 搜索来规划路径,以曼哈顿距离作为启发式方法。

这张地图的棘手之处在于,A*搜索找不到通往目标的路径,唯一的解决办法是先在agent附近捡起炸药,然后炸掉金子右边的第二堵墙,然后向右去捡第二个炸药,然后回去炸金右边最后一堵墙,然后得到金子。

我遇到了以下问题:

  1. A* 搜索仅在找到目标时才为我提供通往目标的路径。它没有给出“几乎就在那里”的路径。
  2. 我可以使用 A* 搜索黄金或炸药的路径,但不能同时搜索两者。看来,在这种情况下,我需要在一个例程中寻找先获得炸药然后获得黄金的最佳途径。这听起来太难了..请告诉我这是否是错误的方向。

如果有人有任何建议或好的建议,请不吝赐教。我已经两天没睡了...

谢谢阅读。

[编辑 30/05] 好吧,我设法用一个技巧来解决上面的地图。基本上从黄金向后搜索,并假设第一层相邻的墙壁是否干净,看看代理是否可以移动到那里,也可以从那里捡起任何炸药。如果两者兼而有之,那么它是一条直通路径。

但是,看着下面的地图,我无语了……有人能帮忙吗?

一个。

~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~
~g***       *** ~~
~***         d**~~
~**           *d~~
~*      ^      *~~
~**           **~~
~d**         **d~~
~ d**       **d ~~
~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~

B.

~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~
~~                  ~~
~~     ^            ~~
~~    ***           ~~
~~   *****          ~~
~~  ***g***         ~~
~~  ********        ~~
~~   ***dd***       ~~
~~    *****d**      ~~
~~     ***d*d**     ~~
~~      ******d*    ~~
~~       ********   ~~
~~        ********  ~~
~~         d*d**d*  ~~
~~          **d**   ~~
~~           ***    ~~
~~            *     ~~
~~                  ~~
~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~

任何人都可以解释一下吗?,不胜感激...

4

1 回答 1

8

这不仅仅是一个寻路问题,但听起来您只是在尝试使用 A* 来进行寻路。这就是它失败的原因。

您的 A* 搜索空间需要包含状态变化,这些变化涉及拿起炸药和在墙上使用炸药(这会改变地图的连通性)。换句话说,您需要搜索所有可能的代理动作生成的游戏状态空间,而不仅仅是代理移动。

稍微详细说明一下:A* 使用的游戏状态应该是当前地图、所有对象(包括代理)的位置以及代理的炸药库存。状态变化可以包括代理移动和(如果代理有炸药)炸毁代理可能靠近的任何墙段。后一种行动将导致后继州拥有不同的地图(以及更少的炸药)。

通过在每个状态中仅存储因使用炸药而导致的地图更改,而不是整个地图的副本,您可能会喜欢节省空间(并使状态生成更有效)。根据您表示地图的方式,这可能就像存储额外的边一样简单,这些边表示爆炸产生的地图位置之间的额外连接。

于 2013-05-27T19:56:29.873 回答