>  기사  >  기술 주변기기  >  길 찾기 알고리즘의 경로 계획 분석 및 코드 구현에 대해 논의

길 찾기 알고리즘의 경로 계획 분석 및 코드 구현에 대해 논의

WBOY
WBOY앞으로
2023-12-20 11:39:40774검색

길 찾기 알고리즘의 경로 계획 분석 및 코드 구현에 대해 논의

경로 찾기 알고리즘은 컴퓨터 그래픽 및 인공 지능 분야에서 일반적으로 사용되는 알고리즘 중 하나로, 한 지점에서 다른 지점까지 최단 경로 또는 최적 경로를 계산하는 데 사용됩니다. 이번 글에서는 일반적으로 사용되는 두 가지 길찾기 알고리즘인 Dijkstra 알고리즘과 A* 알고리즘

Dijkstra 알고리즘

Dijkstra 알고리즘은 그래프에서 두 점 사이의 최단 경로를 찾는 데 사용되는 폭 방법입니다. 검색 알고리즘. 이는 다음과 같이 작동합니다:

최단 경로를 찾은 정점을 저장하려면 집합 S를 만들어야 합니다

아직 최단 경로를 찾지 못한 정점을 저장하려면 집합 Q를 만들어야 합니다

초기화 시 거리 배열 dist를 사용할 때 시작점에서 다른 점까지의 거리는 무한대로, 시작점에서 자신까지의 거리는 0

설정될 때까지 다음 단계를 반복해야 합니다. Q는 비어 있습니다:

  • in 집합 Q에서 시작점에 가장 가까운 정점 u를 찾아 집합 S에 추가합니다.
  • 정점 u의 각 이웃 정점 v에 대해 시작점에서 v까지의 거리 dist[v]를 업데이트합니다. dist[v] > dist[u] + edge(u, v)인 경우 dist[v]를 업데이트합니다. 거리[u] + 가장자리(u, v)입니다.

마지막으로 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 <h4><span>A 알고리즘</span></h4><p><span>A 알고리즘은 그래프에서 두 점 사이의 최단 경로를 찾는 데 사용되는 경험적 검색 알고리즘입니다. 알고리즘의 아이디어는 다음과 같습니다. </span></p><p><span>탐색할 정점을 저장하기 위해 우선순위 대기열 openSet을 생성합니다.</span></p><p><span>시작점부터 각 정점까지의 실제 비용을 저장하려면 gScore라는 배열을 만들어야 합니다. vertex</span></p><p> <span>시작점부터 목표점까지의 예상 비용을 저장하기 위해 fScore라는 배열을 만들어야 합니다</span></p><p><span>openSet에 시작점을 추가하고 gScore[start]를 0으로 설정하고 fScore[start를 설정합니다. ] ~ 0 시작점에서 목표점까지의 예상 비용 </span></p><p><span> openSet이 빌 때까지 다음 단계를 반복합니다. </span></p>
  • openSet에서 fScore가 가장 작은 정점 전류를 찾습니다.
  • 전류가 목표 지점과 같다면 최단 경로를 찾았고 경로가 반환된다는 의미입니다.
  • openSet에서 현재를 제거합니다.
  • 현재의 각 이웃 정점 이웃에 대해 시작점에서 이웃까지의 실제 비용 tempGScore를 계산합니다. tempGScore가 gScore[neighbor]보다 작으면 gScore[neighbor]를 tempGScore로 업데이트하고 fScore[neighbor] =를 계산합니다. gScore[이웃 ] + 예상 비용. 이웃이 openSet에 없으면 openSet에 추가합니다.

openSet이 비어 있으면 목표 지점에 도달할 수 없다는 의미이며 null 값이 반환됩니다.

다음은 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<integer> findShortestPath(int start, int end) {PriorityQueue<node> 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  reconstructPath(int[] cameFrom, int current) {List<integer> path = new ArrayList();path.add(current);while (cameFrom[current] != -1) {current = cameFrom[current];path.add(0, current);}return path;}private class Node implements Comparable<node> {public int index;public int fScore;public Node(int index, int fScore) {this.index = index;this.fScore = fScore;}@Overridepublic int compareTo(Node other) {return Integer.compare(this.fScore, other.fScore);}@Overridepublic 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;}@Overridepublic int hashCode() {return Objects.hash(index);}}}</node></integer></node></integer>

위는 Dijkstra의 알고리즘과 A*의 알고리즘을 비교한 것입니다. C#이나 Java로 구현된 알고리즘 아이디어, 프로세스 및 소스 코드를 포함하여 알고리즘에 대한 자세한 소개입니다. 이 두 가지 알고리즘은 일반적으로 사용되는 길찾기 알고리즘으로 특정 필요에 따라 선택하여 사용할 수 있습니다.
물론 오늘날의 도시에서는 내비게이션 소프트웨어가 우리를 위해 계획을 세울 수 있습니다.

위 내용은 길 찾기 알고리즘의 경로 계획 분석 및 코드 구현에 대해 논의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제