Maison  >  Article  >  développement back-end  >  Conseils de conception d'algorithme PHP : Comment utiliser l'algorithme de Bellman-Ford pour résoudre le problème du chemin le plus court à source unique ?

Conseils de conception d'algorithme PHP : Comment utiliser l'algorithme de Bellman-Ford pour résoudre le problème du chemin le plus court à source unique ?

PHPz
PHPzoriginal
2023-09-19 11:30:14656parcourir

Conseils de conception dalgorithme PHP : Comment utiliser lalgorithme de Bellman-Ford pour résoudre le problème du chemin le plus court à source unique ?

Compétences en conception d'algorithmes PHP : Comment utiliser l'algorithme de Bellman-Ford pour résoudre le problème du chemin le plus court à source unique ?

Vue d'ensemble :
L'algorithme de Bellman-Ford est un algorithme classique pour résoudre le problème du plus court chemin à source unique dans les graphiques. Il peut gérer des graphiques avec des bords de poids négatifs et est capable de détecter la présence de cycles de poids négatifs. Cet article présentera comment implémenter l'algorithme Bellman-Ford à l'aide de PHP et fournira des exemples de code.

Connaissances de base :
Avant de comprendre en profondeur l'algorithme de Bellman-Ford, nous devons comprendre certaines connaissances de base de la théorie des graphes.

  1. Représentation du graphique :
    Le graphique se compose de nœuds (sommet) et d'arêtes (arête). Les nœuds peuvent être représentés sous forme de nombres ou de chaînes, et les bords peuvent être représentés sous forme de tuples contenant deux nœuds et des informations de poids.
  2. Méthodes de représentation graphique :
    La matrice de contiguïté et la liste de contiguïté sont deux méthodes courantes de représentation graphique.
  3. Matrice d'adjacence : utilisez un tableau bidimensionnel pour représenter la relation de connexion entre les nœuds. S'il y a une arête entre le nœud i et le nœud j, la valeur dans la ligne i et la colonne j dans la matrice de contiguïté est le poids de l'arête ; s'il n'y a pas d'arête, la valeur à cette position est l'infini (inf).
  4. Liste d'adjacence : pour chaque nœud, une liste chaînée est utilisée pour stocker des informations sur les arêtes qui y sont connectées.
  5. Problème du chemin le plus court à source unique :
    Étant donné un graphe orienté, trouvez le chemin le plus court d'un nœud source à tous les autres nœuds.

Implémentation de l'algorithme Bellman-Ford :
Ce qui suit est un exemple de code pour implémenter l'algorithme Bellman-Ford en utilisant PHP :

<?php

class Graph {
    private $vertices;
    private $edges;

    public function __construct($vertices) {
        $this->vertices = $vertices;
        $this->edges = [];
    }

    public function addEdge($start, $end, $weight) {
        $this->edges[] = [$start, $end, $weight];
    }

    public function bellmanFord($source) {
        $distance = [];
        $predecessor = [];

        // 设置源节点到其他所有节点的初始距离为无穷大
        foreach ($this->vertices as $vertex) {
            $distance[$vertex] = INF;
            $predecessor[$vertex] = null;
        }

        $distance[$source] = 0;

        // 对每个节点进行松弛操作
        for ($i = 0; $i < count($this->vertices) - 1; $i++) {
            foreach ($this->edges as $edge) {
                $u = $edge[0];
                $v = $edge[1];
                $w = $edge[2];

                if ($distance[$u] != INF && $distance[$u] + $w < $distance[$v]) {
                    $distance[$v] = $distance[$u] + $w;
                    $predecessor[$v] = $u;
                }
            }
        }

        // 检测负权环
        foreach ($this->edges as $edge) {
            $u = $edge[0];
            $v = $edge[1];
            $w = $edge[2];

            if ($distance[$u] != INF && $distance[$u] + $w < $distance[$v]) {
                echo "图中存在负权环";
                return;
            }
        }

        // 输出最短路径结果
        foreach ($this->vertices as $vertex) {
            echo "节点" . $vertex . "的最短路径长度为: " . $distance[$vertex] . ",路径为: ";
            $path = [];
            $current = $vertex;

            while ($current != $source) {
                array_unshift($path, $current);
                $current = $predecessor[$current];
            }

            array_unshift($path, $source);
            echo implode(" -> ", $path) . "
";
        }
    }
}

$graph = new Graph(["A", "B", "C", "D", "E"]);
$graph->addEdge("A", "B", 4);
$graph->addEdge("A", "C", 1);
$graph->addEdge("C", "B", -3);
$graph->addEdge("B", "D", 2);
$graph->addEdge("D", "E", 3);
$graph->addEdge("E", "D", -5);

$graph->bellmanFord("A");

Analyse du code :
Tout d'abord, nous avons créé une classe Graph pour représenter le graphique, qui comprend le nœud et le bord. information. Les informations de bord du graphique sont stockées dans le tableau Edges.

Utilisez la méthode addEdge pour ajouter des informations sur les bords. La méthode

bellmanFord implémente l'algorithme Bellman-Ford. Tout d’abord, nous initialisons le tableau de distance et le tableau de nœuds prédécesseur. Ensuite, définissez la distance du nœud source sur 0. Ensuite, effectuez des cycles V-1 sur chaque nœud, où V est le nombre de nœuds. Dans la boucle, nous vérifions chaque arête et la relâchons s'il existe un chemin plus court. Enfin, nous vérifions s'il existe un cycle de poids négatif et, si c'est le cas, imprimons un message d'invite. Enfin, nous obtenons le chemin le plus court et la longueur du chemin pour chaque nœud.

Dans l'exemple de code, nous créons un graphique contenant 5 nœuds, qui contient des arêtes de poids positives et négatives. Enfin, nous utilisons la méthode BellmanFord, en utilisant « A » comme nœud source, pour calculer le chemin le plus court.

Résumé :
Cet article présente comment utiliser PHP pour implémenter l'algorithme de Bellman-Ford afin de résoudre le problème du chemin le plus court à source unique dans le graphique. L'algorithme de Bellman-Ford convient aux graphiques contenant des arêtes de poids négatifs et peut détecter l'existence de cycles de poids négatifs. En comprenant la méthode de représentation des graphiques, en comprenant les principes de l'algorithme de Bellman-Ford et en le pratiquant avec des exemples de codes, je pense que les lecteurs auront une compréhension plus approfondie de l'algorithme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn