AI与游戏——吃豆人(3)基本的路径规划算法(上)

来源:互联网 发布:江宁区高新园网络问政 编辑:程序博客网 时间:2024/06/06 03:02

这次我们来讲一下代码中涉及的一些路径规划算法,在这个游戏中,路径规划虽然不属于人工智能但是确实实现AI算法不可或缺的基础方法,下面就来大致介绍一下有哪些主要的方法以及这些方法的实现。

(1)getApproximateNextMoveTowardsTarget:这个实现的是得到是起始点到目标点的大致的运动,为什么叫大致呢,因为这里没有考虑障碍物等因素。这个函数还可以用在A*算法上(A*算法后面会专门讲)。代码如下:

public MOVE getApproximateNextMoveTowardsTarget(int fromNodeIndex, int toNodeIndex,            MOVE lastMoveMade, DM distanceMeasure) {        MOVE move = null;        double minDistance = Integer.MAX_VALUE;        for (Entry<MOVE, Integer> entry : currentMaze.graph[fromNodeIndex].allNeighbourhoods.get(                lastMoveMade).entrySet()) {            double distance = getDistance(entry.getValue(), toNodeIndex, distanceMeasure);            if (distance < minDistance) {                minDistance = distance;                move = entry.getKey();            }        }        return move;    }

参数分别是:起始点,目标点,上一次运动方向,距离度量方法。这里有个上一次运动方向作为参数,说实话,这个for循环的条件语句可以说是非常难搞懂,其实allNeighbourhoods这里是一个MAP里面又嵌套了一个MAP,准确的说是 < MOVE, < MOVE, index > > 这种形式,第一个MOVE是可到达fromNode的移动,第二个是fromNode可以执行的移动以及执行该移动所到达的点,但是不包括前一个MOVE。举个例子,对于左上角坐标(0,0)的点,可以到达的移动为从(0,1)向左,从(1,0)向上,或在(0,0)保持不动,所以第一个MOVE为left,up,neutral三个(由于neutral只有特定情况才执行所以后面就不再考虑),而对于left,left->< down, (1,0) >,所以当遍历left的value的时候,就没有right这个值,只有向下走,同理,up->< right, (0,1) >。这样在选择路径时不用再考虑之前的移动。接着得到所有除了上一步的点之外其余可以行走的点,然后求与目标点的欧氏距离,距离最小的那个对应的MOVE即为所选。

(2)getNextMoveTowardsTarget:这个跟之前的差不多,不同的是这个考虑的MOVE考虑之前一步的MOVE了,也就是说,对于fromNode,所有可行走的方向都用于计算距离。上一个主要用于魔鬼的到达目标路线规划,这个一般用户吃豆人的。

for (Entry<MOVE, Integer> entry : currentMaze.graph[fromNodeIndex].neighbourhood.entrySet())

这里只给出不同的循环语句,可以看到从之前的allNeighbourhoods,变成了neighbourhood,后者是结构是< MOVE, INDEX >,为走法与可到达的点组成的MAP。

(3)getApproximateNextMoveAwayFromTarget:这个跟第一个也差不多,只不过之前求的是最小距离,这个求最大距离。

(4)getNextMoveAwayFromTarget:这个不解释了,想想也知道不同之处了。。。

以上都是得到大致方向的方法,那么有没有得到准确路径的方法呢,当然有,就先放到下一部分再说吧。

阅读全文
0 0
原创粉丝点击