Después de realizar los algoritmos para grafos en Python y Matlab. Vamos a proceder a compararlos.
Pueden revisar los anteriores entradas de estos algoritmos en Algoritmos Dijkstra & Floyd-Warshall y Dijkstra & Floyd-Warshall – Python.
Para realizar una correcta comparación se realizó un programa en Matlab para generar grafos con cierto número de nodos, una probabilidad de conexión entre nodos y el nombre del archivo en el que se quiere exportar el grafo. Los pesos se establecen aleatoriamente entre el 1 y el 9:
function [] = exportGraph(nodes, probability, nameFile) numNodes = nodes; w = [1 2 3 4 5 6 7 8 9]; G = randgraph(numNodes,probability, w); plot(G,'EdgeLabel',G.Edges.Weight); fileID = fopen(strcat('export/',nameFile,'.txt'),'w'); list = table2array(G.Edges); total = numedges(G); for i = 1:total fprintf(fileID,'%d %d %d\n',list(i,1), list(i,2), list(i,3) ); end fclose(fileID);
Ok. De aquí entonces podemos formar varios grafos usando en la consola de Matlab:
>> exportGraph(100, 0.45, 'cien')
En la línea anterior estamos diciendo que exporte un grafo con 100 nodos y que se conecten con una probabilidad de 0.45 y que el nombre del archivo sea cien, este comando generará un archivo en export/cien.txt con los datos. El archivo se verá como:
1 4 6 1 5 3 1 6 7 1 8 8 1 10 7 2 1 2 2 3 6 2 5 8 2 9 9 3 1 9 3 4 9 3 5 2 3 7 7 4 3 1 4 5 1 4 6 8 4 8 4 4 9 6 4 10 8 5 2 5 5 3 6 5 4 5 5 6 5 5 7 1 5 8 7 5 9 2 5 10 7 6 4 7 6 5 2 6 10 8 7 10 9 8 2 6 8 4 6 8 10 1 9 1 7 9 2 7 9 3 3 9 4 5 9 5 9 9 7 2 9 8 9 10 4 6 10 7 6
Esta es una lista de edges donde la primera y la segunda columna son nodos y la tercera columna es el peso del edge.
Además el programa pinta el grafo, aquí tenemos algunos generados:

Figura 1. Collección de grafos generados con la función exportGraph( ). Grafo A son 10 nodos, grafo B son cincuenta nodos y el grafo C tiene cien nodos.
Ahora que tenemos nuestro generador de grafos, veamos que tal se comparta nuestro programa en Matlab y Python para cargar el camino más corto de todos los pares en grafos de 500 nodos.
Para matlab se realizó el siguiente código:
clc [s t w] = readFileWithWeight("export/trecientos.txt"); G = digraph(s,t,w); %plot(G,'EdgeLabel',w) tic; %dist = floyd_warshall(G); dist = dijkstra(G); tiempo = toc
Solo baste con comentar y descomentar las lineas 8 y 9 para trabajar con Dijkstra o Floyd-Warshall. Ahora para Python se realizó el siguiente script:
import matplotlib.pyplot as plt import networkx as nx import graph as g import time import os time1 = time.time() os.system('cls') f = open("export/quinientos.txt","r") G = nx.Graph() for line in f: s,d,w = line.split(' ') w = w.replace('\n', '') G.add_weighted_edges_from([(s,d,w)]) Gr = g.graph() Gr.setGraph(G) print("--- %s seconds load Graph ---" % (time.time() - time1)) timeO = time.time() Gr.floyd_warshall() print("--- %s seconds Distances ---" % (time.time() - time1))
Con este script cargamos el archivo y medimos el tiempo, tener en cuenta que utlizamos la misma clase de la entrada anterior que se encuentra en GitHub.
Ahora realizemos las comparaciones en una hoja de cálculo:
Python | Matlab | ||
Dijkstra | Archivo | 0,515648365 | 0,2664 |
Algoritmo | 209,3814790 | 453,8841 | |
Floy-Warshall | Archivo | 0,619967 | 0,2694 |
Algoritmo | 59,6603320 | 3,0921 |
En la tabla anterior tenemos las columnas de Python y Matlab y en las filas los algoritmos divididos cada una en 2 filas que significa el tiempo en que se demoró cargando el archivo y el tiempo del algoritmo.
Podemos observar que para Dijkstra el tiempo es más rápido en Python que en Matlab. Por casi 200 segundos más pero para Floy-Warshall el tiempo en Python es mucha más lento que en Matlab. En Matlab solo duró 3 segundos en responder.
Se repetieron las pruebas con grafos del mismo tamaño y los tiempos de respuesta son muy parecidos.
Para el algoritmo de Dijkstra se utilizaran algunas técnicas, digamos que no es sencillo calcular la mínima distancia de todos los pares uno a uno con Dijkstra, por eso se demoran tanto en los 2 lenguajes, apesar de eso Python fue más rápido que Matlab.
Para el algoritmo de Floyd-Warshall el algoritmos es más sencillo y en realidad entre los dos algoritmos es muy parecido las sencentias pero en Python tardó un minuto y en Matlab tardó solo 3 segundos.
Comentarios