Besprechen Sie die Routenplanungsanalyse des Pfadfindungsalgorithmus und die Codeimplementierung

WBOY
Freigeben: 2023-12-20 11:39:40
nach vorne
766 Leute haben es durchsucht

Besprechen Sie die Routenplanungsanalyse des Pfadfindungsalgorithmus und die Codeimplementierung

Der Pfadfindungsalgorithmus ist einer der am häufigsten verwendeten Algorithmen im Bereich Computergrafik und künstliche Intelligenz, mit dem der kürzeste Weg oder optimale Weg von einem Punkt zum anderen berechnet wird. In diesem Artikel werde ich zwei häufig verwendete Pfadfindungsalgorithmen im Detail vorstellen: den Dijkstra-Algorithmus und den A*-Algorithmus Suchalgorithmus. Es funktioniert wie folgt:

Wir müssen eine Menge S erstellen, um die Eckpunkte zu speichern, die den kürzesten Weg gefunden haben

Wir müssen eine Menge Q erstellen, um die Eckpunkte zu speichern, die noch nicht den kürzesten Weg gefunden haben

In der Initialisierung Wenn Sie das Distanzarray dist verwenden, müssen Sie den Abstand vom Startpunkt zu anderen Punkten auf unendlich und den Abstand vom Startpunkt zu sich selbst auf 0 einstellen.

Wiederholen Sie die folgenden Schritte, bis der Wert eingestellt ist Q ist leer:

in Finden Sie den Scheitelpunkt u, der dem Startpunkt in der Menge Q am nächsten liegt, und fügen Sie ihn der Menge S hinzu.

Aktualisieren Sie für jeden Nachbarscheitelpunkt v des Scheitelpunkts u den Abstand dist[v] vom Startpunkt auf v. Wenn dist[v] > dist[u] + Kante(u, v), aktualisieren Sie dist[v] ist dist[u] + Kante(u, v).

  • Schließlich speichert das dist-Array den kürzesten Weg vom Startpunkt zu jedem Scheitelpunkt
  • Das Folgende ist der in C# geschriebene Quellcode des Dijkstra-Algorithmus:
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 <p><span>A-Algorithmus</span></p><p style="text-align: justify;"><span>A Der Algorithmus ist ein heuristischer Suchalgorithmus, der verwendet wird, um den kürzesten Weg zwischen zwei Punkten in einem Diagramm zu finden. Die Idee des Algorithmus ist wie folgt: </span></p><h4><span>Erstellen Sie eine Prioritätswarteschlange openSet, um die zu erkundenden Scheitelpunkte zu speichern</span></h4><p><span>Wir müssen ein Array mit dem Namen gScore erstellen, um die tatsächlichen Kosten vom Startpunkt bis zu jedem zu speichern vertex</span></p><p> <span>Wir müssen ein Array mit dem Namen fScore erstellen, um die geschätzten Kosten vom Startpunkt bis zum Zielpunkt zu speichern</span></p><p><span>Fügen Sie den Startpunkt zu openSet hinzu, setzen Sie gScore[start] auf 0 und setzen Sie fScore[start ] auf 0 Geschätzte Kosten vom Startpunkt zum Zielpunkt </span></p><p><span> Wiederholen Sie die folgenden Schritte, bis openSet leer ist: </span></p><p><span></span>Finden Sie den Scheitelpunktstrom mit dem kleinsten fScore in openSet. </p><p><span></span> Wenn der Strom gleich dem Zielpunkt ist, bedeutet dies, dass der kürzeste Weg gefunden wurde und der Weg zurückgegeben wird. </p>
Nach dem Login kopieren
  • Aktuell aus openSet entfernen.
  • Berechnen Sie für jeden benachbarten Scheitelpunkt des aktuellen Nachbarn die tatsächlichen Kosten tempGScore vom Startpunkt bis zum Nachbarn. Wenn tempGScore kleiner als gScore[neighbor] ist, aktualisieren Sie gScore[neighbor] auf tempGScore und berechnen Sie fScore[neighbor] = gScore[neighbor ] + geschätzte Kosten. Wenn der Nachbar nicht in openSet enthalten ist, fügen Sie ihn zu openSet hinzu.
  • Wenn openSet leer ist, bedeutet dies, dass der Zielpunkt nicht erreicht werden kann und ein Nullwert zurückgegeben wird
  • Das Folgende ist der Quellcode des in Java geschriebenen A*-Algorithmus:
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>
Nach dem Login kopieren

Das Obige ist ein Vergleich zwischen Dijkstras Algorithmus und A*. Detaillierte Einführung in den Algorithmus, einschließlich Algorithmusideen, Prozesse und in C# oder Java implementiertem Quellcode. Beide Algorithmen sind häufig verwendete Pfadfindungsalgorithmen und können entsprechend den spezifischen Anforderungen ausgewählt und verwendet werden. Natürlich kann Navigationssoftware in den heutigen Städten Dinge für uns planen.

Das obige ist der detaillierte Inhalt vonBesprechen Sie die Routenplanungsanalyse des Pfadfindungsalgorithmus und die Codeimplementierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:51cto.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage