AI与游戏——吃豆人(3)基本的路径规划算法(上)
2017-09-14 20:52
423 查看
这次我们来讲一下代码中涉及的一些路径规划算法,在这个游戏中,路径规划虽然不属于人工智能但是确实实现AI算法不可或缺的基础方法,下面就来大致介绍一下有哪些主要的方法以及这些方法的实现。
(1)getApproximateNextMoveTowardsTarget:这个实现的是得到是起始点到目标点的大致的运动,为什么叫大致呢,因为这里没有考虑障碍物等因素。这个函数还可以用在A*算法上(A*算法后面会专门讲)。代码如下:
参数分别是:起始点,目标点,上一次运动方向,距离度量方法。这里有个上一次运动方向作为参数,说实话,这个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,所有可行走的方向都用于计算距离。上一个主要用于魔鬼的到达目标路线规划,这个一般用户吃豆人的。
这里只给出不同的循环语句,可以看到从之前的allNeighbourhoods,变成了neighbourhood,后者是结构是< MOVE, INDEX >,为走法与可到达的点组成的MAP。
(3)getApproximateNextMoveAwayFromTarget:这个跟第一个也差不多,只不过之前求的是最小距离,这个求最大距离。
(4)getNextMoveAwayFromTarget:这个不解释了,想想也知道不同之处了。。。
以上都是得到大致方向的方法,那么有没有得到准确路径的方法呢,当然有,就先放到下
9046
一部分再说吧。
(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
一部分再说吧。
相关文章推荐
- AI与游戏——吃豆人(3)基本路径规划算法(下)
- 浅谈路径规划算法之Bellman-Ford算法
- [OpenJudge] 2.6基本算法之动态规划 摘花生
- 路径规划: 浅谈路径规划算法
- 动态规划(4)详细讲解各最短路径算法及比较
- [算法之动态规划] 基本思想
- 游戏开发中的人工智能——A*路径寻找算法(二)
- 2.6基本算法之动态规划 7624:山区建小学——区间DP
- 游戏开发中的人工智能(六):基本路径寻找及航点应用
- 路径规划算法的完备性与概率完备性、最优性与渐进最优性
- 路径规划(最短路径)算法C#实现
- 算法:动态规划-数字三角形的最优解(打印路径)
- 路径规划A*算法及SLAM自主地图创建导航算法
- 路径规划算法总结初版
- 关于二十四点游戏的编程思路与基本算法
- AI-路径导航(最短路径算法 and A算法)
- 百度无人驾驶apollo项目路径规划a*算法分析