A星算法

没有采用二叉堆算法优化, 学习了几天终于搞除了一个demo, 这个列子如果点击按钮生成的方块大小不正确,可以先设置下预设调成相应的大小

只能上下左右走

可以斜着走=。=(不过好像路径变远了)

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class AStar
{

    public static PriorityQueue closedList;
    public static PriorityQueue openList;

    public static List<Node> FindPath(Node start, Node goal)
    {
        closedList = new PriorityQueue();
        openList = new PriorityQueue();         //初始化OpenList
        openList.Push(start);                           //把开始节点放入OpenList中

        start.F = 0;
        start.G = 0;
        start.H = NodeCost(start, goal);

        Node node = null;
        List<Node> neighbours = null;
        Node neighbourNode = null;
        DateTime now = System.DateTime.Now;

        while (openList.Length != 0)
        {
            node = openList.First();

            //如果是终点,就返回一个列表list过去
            if (node.x == goal.x && node.y == goal.y)
            {
                Debug.Log("算法所消耗的时间: " + (System.DateTime.Now - now).TotalSeconds);
                return CalculatePath(node);
            }

            neighbours = new List<Node>();
            GridManager.Instance.GetNeighbours(node, neighbours);           //获取周围的

            //遍历周围的方块
            for (int i = 0; i < neighbours.Count; i++)
            {
                neighbourNode = neighbours[i];

                //如果当前方块不在关闭列表中
                if (!closedList.Contains(neighbourNode))
                {
                    neighbourNode.G = node.G + 1;                                                   //是上一个格子的G+1(这里并没有让斜角加1.4)
                    neighbourNode.H = NodeCost(neighbourNode, goal);                                //这个格子离终点的估算
                    neighbourNode.F = neighbourNode.G + neighbourNode.H;

                    //显示H F G的值
                    neighbourNode.SetH(neighbourNode.H);
                    neighbourNode.SetF(neighbourNode.F);
                    neighbourNode.SetG(neighbourNode.G);

                    neighbourNode.parent = node;
                    //如果方块不在开启列表中,就添加到开启列表中
                    if (!openList.Contains(neighbourNode))
                    {
                        openList.Push(neighbourNode);
                    }
                }
            }

            //把寻找的节点放入关闭列表中
            closedList.Push(node);
            openList.Remove(node);
        }

        Debug.Log("算法所消耗的时间: " + (System.DateTime.Now - now).TotalMilliseconds);

        if (node.x != goal.x && node.y != goal.y)
        {
            Debug.LogError("没有找到路径");
            return null;
        }

        Debug.Log("找到路径了");
        return CalculatePath(node);
    }

    /// <summary>
    /// 获取两个节点的距离(不计算障碍物)
    /// </summary>
    /// <param name="a">开始节点</param>
    /// <param name="b">结束节点</param>
    /// <returns>返回x +y 的距离</returns>
    private static int NodeCost(Node a, Node b)
    {
        int x = (int)Mathf.Abs(b.x - a.x);
        int y = (int)Mathf.Abs(b.y - a.y);
        return x + y;
    }

    /// <summary>
    /// 获取最终路径
    /// </summary>
    /// <param name="node"></param>
    /// <returns></returns>
    private static List<Node> CalculatePath(Node node)
    {
        List<Node> list = new List<Node>();

        while (node != null)
        {
            list.Add(node);
            node = node.parent;
        }
        list.Reverse();
        return list;
    }

}

下载地址: http://yunpan.cn/ccS5wGKC9kfQX  访问密码 c10c

时间: 2024-10-10 21:05:04

A星算法的相关文章

A*搜寻算法(A星算法)

A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星算法.这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法.常用于游戏中的NPC的移动计算,或在线游戏的BOT的移动计算上. 该算法综合了BFS(Breadth First Search)和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函

基于HTML5的WebGL呈现A星算法的3D可视化

http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现,算法基于开源 https://github.com/bgrins/javascript-astar 的javascript实现,其实作者也有个不错的2D例子实现 http://www.briangrinstead.com/files/astar/ ,只不过觉得所有A*算法的可视化实现都是平面的不够

Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问

A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 2.首先推断该点是不是不能够穿越的点,或者是已经再close中了 3.假设2步骤为真.什么都不做,假设为假,那么我们就进行加入了 4.假设在加入的时候,发现该点在open中不存在.那么我们直接加入,并且视之为当前节点,假设该点              存在open中,那么我们比較G值,假设发现当

A星算法入门之入ing...

几天以来的瞎折腾,能算入门么? 漫漫几千里,A星算法这么走. 测试程序: public class AStarTest { /** * @param args */ public static void main(String[] args) { int[][] mySearchArea = new int[][] { {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1, 1}, {1, 1, 1, 1

A星算法(Java实现)

一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从终于结点回溯到起点,得到路径. 2. 路径代价的估算:F = G+H A星算法的代价计算使用了被称作是启示式的代价函数. 先说明一下各符号意义:G表示的是从起点到当前结点的实际路径代价(为啥叫实际?就是已经走过了,边走边将代价计算好了).H表示当前结点到达终于结点的预计代价(为啥叫预计?就是还没走过,不知道前

[算法学习]A星算法

一.适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (如果有路径)采用"结点与结点的父节点"的关系从最终结点回溯到起点,得到路径. 2. 路径代价的估算:F = G+H A星算法的代价计算使用了被称作是启发式的代价函数. 先说明一下各符号意义:G表示的是 ** 从起点到当前结点的实际路径代价 ** (为啥叫实际?就是已经走过了,边走边将代价计算好了):H表示 ** 当前结点到达最终结点的估计代价 ** (为

A星算法,找寻最短路径

#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #define N 1000 #define inf 1<<30; using namespace std; /* a星算法,找寻最短路径 算法核心:有两个表open表和close表 将方块添加到open列表中,该列表有最小的和值.且将这个方块称为S吧

Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜寻算法)的学习

A *搜寻算法俗称A星算法.这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法.常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,开始点和结束点 2.首先判断该点是不是不可以穿越的点,或者是已经再close中了 3.如果2步骤为真,什么都不做,如果为假,那么我们就进行添加了 4.如果在添加的时候,发现该点在open中不存在,那么我们直接添加,而且视之为当前节点,如果该点              存在open中,那么我们比较G值,如

寻路算法之A星算法

核心算法 1 package cn.liushaofeng.algorithm; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * A Star Algorithm 8 * @author liushaofeng 9 * @date 2015-8-24 下午11:05:48 10 * @version 1.0.0 11 */ 12 public class AstarAlgorithm 13 { 14 pri

链式--前向星算法(转载学习)*重点*【模板】

转载地址:http://blog.csdn.net/acdreamers/article/details/16902023 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. 那么对于下图: 我们输入边的