您的位置:首页 > 大数据 > 人工智能

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

2017-09-14 20:52 423 查看
这次我们来讲一下代码中涉及的一些路径规划算法,在这个游戏中,路径规划虽然不属于人工智能但是确实实现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:这个不解释了,想想也知道不同之处了。。。

以上都是得到大致方向的方法,那么有没有得到准确路径的方法呢,当然有,就先放到下
9046
一部分再说吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: