Maison  >  Article  >  développement back-end  >  Comment implémenter l'algorithme Floyd-Warshall en utilisant Python ?

Comment implémenter l'algorithme Floyd-Warshall en utilisant Python ?

WBOY
WBOYoriginal
2023-09-21 10:29:021165parcourir

Comment implémenter lalgorithme Floyd-Warshall en utilisant Python ?

Comment implémenter l'algorithme Floyd-Warshall en utilisant Python ?

L'algorithme Floyd-Warshall est un algorithme classique utilisé pour résoudre le problème du chemin le plus court de tous les points sources à tous les points de destination. Il s'agit d'un algorithme de programmation dynamique qui peut être utilisé pour traiter des graphiques orientés ou des problèmes de bords de poids négatifs. Cet article expliquera comment utiliser Python pour implémenter l'algorithme Floyd-Warshall et fournira des exemples de code spécifiques.

L'idée principale de l'algorithme Floyd-Warshall est de mettre à jour progressivement le chemin le plus court entre les nœuds en parcourant tous les nœuds du graphique, en utilisant chaque nœud comme nœud intermédiaire. Nous pouvons utiliser une matrice bidimensionnelle pour stocker la distance entre les nœuds du graphique.

Tout d'abord, nous devons définir une fonction pour implémenter l'algorithme Floyd-Warshall. Ce qui suit est un cadre d'algorithme simple :

def floydWarshall(graph):
    dist = graph
    num_vertices = len(graph)
    
    for k in range(num_vertices):
        for i in range(num_vertices):
            for j in range(num_vertices):
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    
    return dist

Ce code utilise trois boucles imbriquées pour traiter chaque nœud du graphique. A chaque itération, nous trouvons des chemins plus courts en mettant à jour la matrice de distance. Plus précisément, nous vérifierons si le chemin du nœud i au nœud j peut atteindre une distance plus courte via le nœud k. Si tel est le cas, nous mettons à jour la valeur dans la matrice de distance.

Avant d'utiliser cette fonction, nous devons définir un graphique. Voici la définition d'un exemple de graphe :

graph = [
    [0, float('inf'), -2, float('inf')],
    [4, 0, 3, float('inf')],
    [float('inf'), float('inf'), 0, 2],
    [float('inf'), -1, float('inf'), 0]
]

Cet exemple de graphe est une représentation matricielle de contiguïté d'un graphe orienté. Parmi eux, float('inf') signifie que la distance est infinie, ce qui signifie qu'il n'y a pas de connexion directe entre les deux nœuds. float('inf')表示距离为无穷大,这意味着两个节点之间没有直接连接。

下面,我们调用floydWarshall函数,传入图作为参数,并打印最终的结果:

result = floydWarshall(graph)
for row in result:
    print(row)

完整的代码如下:

def floydWarshall(graph):
    dist = graph
    num_vertices = len(graph)
    
    for k in range(num_vertices):
        for i in range(num_vertices):
            for j in range(num_vertices):
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    
    return dist

graph = [
    [0, float('inf'), -2, float('inf')],
    [4, 0, 3, float('inf')],
    [float('inf'), float('inf'), 0, 2],
    [float('inf'), -1, float('inf'), 0]
]

result = floydWarshall(graph)
for row in result:
    print(row)

运行上述代码,你会得到以下输出:

[0, -1, -2, 0]
[4, 0, 2, 4]
[5, 1, 0, 2]
[3, -1, 1, 0]

输出的结果是一个二维矩阵,表示图中任意两个节点之间的最短路径。例如,result[0][2]

Ci-dessous, nous appelons la fonction floydWarshall, passons le graphique en paramètre et imprimons le résultat final :

rrreee

Le code complet est le suivant : 🎜rrreee🎜Exécutez le code ci-dessus, vous obtiendra le résultat suivant : 🎜 Le résultat de sortie de rrreee🎜 est une matrice bidimensionnelle représentant le chemin le plus court entre deux nœuds quelconques du graphique. Par exemple, la valeur de result[0][2] est -2, ce qui signifie que le chemin le plus court entre le nœud 0 et le nœud 2 est -2. Si deux nœuds sont inaccessibles, la distance est marquée comme infinie. 🎜🎜A travers cet exemple, nous pouvons clairement comprendre la mise en œuvre et l'utilisation de l'algorithme Floyd-Warshall. J'espère que cet article pourra vous aider à comprendre et à appliquer cet 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