文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

线路规划,寻路算法介绍及代码实现

2024-11-30 03:32

关注

寻路算法是计算机图形学和人工智能领域中常用的算法之一,用于计算从一个点到另一个点的最短路径或最优路径。在本文中,我将详细介绍两种常用的寻路算法:Dijkstra算法和A*算法。

Dijkstra算法

Dijkstra算法是一种广度优先搜索算法,用于寻找图中两点之间的最短路径。算法的思路如下:

创建一个集合S,用于存放已经找到最短路径的顶点。

创建一个集合Q,用于存放还未找到最短路径的顶点。

初始化距离数组dist,将起始点到其余点的距离设置为无穷大,起始点到自身的距离设置为0。

重复以下步骤,直到集合Q为空:

最终,dist数组中存储的就是起始点到各个顶点的最短路径。

下面是使用C#实现的Dijkstra算法的源代码:

class DijkstraAlgorithm
{
    private int[,] graph;
    private int size;

    public DijkstraAlgorithm(int[,] graph)
    {
        this.graph = graph;
        this.size = graph.GetLength(0);
    }

    public int[] FindShortestPath(int start, int end)
    {
        int[] dist = new int[size];
        bool[] visited = new bool[size];

        for (int i = 0; i < size; i++)
        {
            dist[i] = int.MaxValue;
            visited[i] = false;
        }

        dist[start] = 0;

        for (int count = 0; count < size - 1; count++)
        {
            int u = GetMinDistance(dist, visited);
            visited[u] = true;

            for (int v = 0; v < size; v++)
            {
                if (!visited[v] && graph[u, v] != 0 && dist[u] != int.MaxValue
                    && dist[u] + graph[u, v] < dist[v])
                {
                    dist[v] = dist[u] + graph[u, v];
                }
            }
        }

        return dist;
    }

    private int GetMinDistance(int[] dist, bool[] visited)
    {
        int minDist = int.MaxValue;
        int minIndex = -1;

        for (int v = 0; v < size; v++)
        {
            if (!visited[v] && dist[v] <= minDist)
            {
                minDist = dist[v];
                minIndex = v;
            }
        }

        return minIndex;
    }
}

A算法

A算法是一种启发式搜索算法,用于寻找图中两点之间的最短路径。算法的思路如下:

创建一个优先队列openSet,用于存放待探索的顶点。

创建一个数组gScore,用于存放起始点到每个顶点的实际代价。

创建一个数组fScore,用于存放起始点通过每个顶点到达目标点的估计代价。

将起始点加入openSet,并将gScore[start]设置为0,fScore[start]设置为起始点到目标点的估计代价。

重复以下步骤,直到openSet为空:

如果openSet为空,表示无法到达目标点,返回空。

下面是使用Java实现的A*算法的源代码:

import java.util.*;

class AStarAlgorithm {
    private int[][] graph;
    private int size;

    public AStarAlgorithm(int[][] graph) {
        this.graph = graph;
        this.size = graph.length;
    }

    public List findShortestPath(int start, int end) {
        PriorityQueue openSet = new PriorityQueue<>();
        int[] gScore = new int[size];
        int[] fScore = new int[size];
        int[] cameFrom = new int[size];
        boolean[] visited = new boolean[size];

        Arrays.fill(gScore, Integer.MAX_VALUE);
        Arrays.fill(fScore, Integer.MAX_VALUE);
        Arrays.fill(cameFrom, -1);

        gScore[start] = 0;
        fScore[start] = heuristicCostEstimate(start, end);
        openSet.offer(new Node(start, fScore[start]));

        while (!openSet.isEmpty()) {
            int current = openSet.poll().index;

            if (current == end) {
                return reconstructPath(cameFrom, current);
            }

            visited[current] = true;

            for (int neighbor = 0; neighbor < size; neighbor++) {
                if (graph[current][neighbor] != 0 && !visited[neighbor]) {
                    int tempGScore = gScore[current] + graph[current][neighbor];

                    if (tempGScore < gScore[neighbor]) {
                        cameFrom[neighbor] = current;
                        gScore[neighbor] = tempGScore;
                        fScore[neighbor] = gScore[neighbor] + heuristicCostEstimate(neighbor, end);

                        if (!openSet.contains(new Node(neighbor, fScore[neighbor]))) {
                            openSet.offer(new Node(neighbor, fScore[neighbor]));
                        }
                    }
                }
            }
        }

        return null;
    }

    private int heuristicCostEstimate(int start, int end) {
        // 估计代价的计算方法,例如欧几里得距离、曼哈顿距离等
        return Math.abs(end - start);
    }

    private List reconstructPath(int[] cameFrom, int current) {
        List path = new ArrayList<>();
        path.add(current);

        while (cameFrom[current] != -1) {
            current = cameFrom[current];
            path.add(0, current);
        }

        return path;
    }

    private class Node implements Comparable {
        public int index;
        public int fScore;

        public Node(int index, int fScore) {
            this.index = index;
            this.fScore = fScore;
        }

        @Override
        public int compareTo(Node other) {
            return Integer.compare(this.fScore, other.fScore);
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null || getClass() != obj.getClass()) {
                return false;
            }
            Node other = (Node) obj;
            return index == other.index;
        }

        @Override
        public int hashCode() {
            return Objects.hash(index);
        }
    }
}

以上是对Dijkstra算法和A*算法的详细介绍,包括算法思路、过程和使用C#或Java实现的源代码。这两种算法都是常用的寻路算法,可以根据具体需求选择使用。
当然在现在的城市里导航软件软件可以给我们规划好。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯