You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

454 lines
14 KiB

"""Test des fonctions du TL.
Pour tester la question x_y : `python3 test.py x_y`.
Donc pour la question 3_4 : `python3 test.py 3_4`.
"""
import sys
import random
import graphe
import graphique
import copy
import numpy as np
import matplotlib.pyplot as pl
import time
def creerGrapheFigure1():
""" Crée le graphe de la figure 1 """
g = graphe.Graphe("Graphe de la figure 1")
s1 = g.ajouteSommet(1.0, 1.0)
s2 = g.ajouteSommet(2.0, 3.5)
s3 = g.ajouteSommet(2.5, 2.5)
s4 = g.ajouteSommet(5.0, 2.0)
s1.couleur = (1., 1., 0.)
s2.couleur = (0., 0., 1.)
s3.couleur = (1., 0., 0.)
s4.couleur = (1., 1., 0.)
a = g.connecte(s1, s2, 4.0, 90.)
a.couleur = (1., 1., 0.)
g.connecte(s1, s4, 5.2, 124.)
g.connecte(s2, s3, 2.0, 54.)
g.connecte(s2, s4, 5.0, 90.)
return g
def testQuestion1_2():
"""' Teste que la création d ' un graphe ne plante pas
print ”Question 1.2 :"""
creerGrapheFigure1()
print("Ok. Pas de plantage")
def testQuestion1_3():
""" Teste l ' affichage d ' un graphe dans la console"""
print("Question 1.3 :")
g = creerGrapheFigure1()
print(g)
def testQuestion1_4():
""" Teste du dessin d'un graphe."""
print("Question 1.4:")
graphique.affiche(creerGrapheFigure1(), (3., 2.), 100.)
def testQuestion2_2():
"""Teste de génération aléatoire de graphe."""
print("Question 2.2:")
graphique.affiche(graphe.pointsAleatoires(5, 30), (0, 0), 10.)
def testQuestion2_4():
"""Teste de gabriel et gvr."""
print("Question 2.4")
g = graphe.pointsAleatoires(30, 30)
g.renomme("Gabriel")
g1 = copy.deepcopy(g)
g1.renomme("GVR")
graphe.gabriel(g)
graphe.gvr(g1)
graphique.affiche(g, (0, 0), 10., blocage=False)
graphique.affiche(g1, (0, 0), 10.)
def testQuestion2_5():
"""Teste de la création de réseau."""
g = graphe.pointsAleatoires(30, 30)
graphe.reseau(g)
graphique.affiche(g, (0, 0), 10.)
def chronometre(fonctionTest, fonctionPreparation, parametres):
''' Mesure le temps d ' exécution fonctionTest pour différentes valeurs d '
un paramètres '''
temps = []
# Pour chaque valeur de paramètre
for p in parametres:
# Lance le test pour ces entrées
print("t({}) = ".format(p), end="", flush=True)
t = []
for i in range(10):
entrees = fonctionPreparation(p)
debut = time.time()
fonctionTest(entrees)
fin = time.time()
# Mesure le temps d ' exécution
t.append(fin - debut)
t = sum(t)/10
print("{:.2f} s".format(t))
temps.append(t)
return temps
def testQuestion2_6():
"""Mesure la performance de graphe.reseau"""
def prepare(p): return graphe.pointsAleatoires(p, 10)
valeurs_n = list(map(int, np.logspace(1, 2.7, 100)))
temps = chronometre(graphe.reseau, prepare, valeurs_n)
pl.close('all')
pl.title("Mesure du temps d'exécution de `reseau`.")
pl.plot(valeurs_n, temps)
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
pl.title("Mesure du temps d'exécution de `reseau`.")
pl.loglog(valeurs_n, temps, label='temps de calcul')
pl.loglog(valeurs_n, (lambda x: x**3)(valeurs_n), label='$x\mapsto x^3$')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
def testQuestion2_7():
"""Compare la création de graphe de gabriel et ed delaunay."""
def prepare(p): return graphe.pointsAleatoires(p, 10)
valeurs_n = np.arange(1, 200)
temps1 = chronometre(graphe.gabriel, prepare, valeurs_n)
temps2 = chronometre(graphe.delaunay, prepare, valeurs_n)
pl.close('all')
pl.title("Comparaison du temps pour `delaunay` et `gabriel`")
pl.plot(valeurs_n, temps1, label='gabriel')
pl.plot(valeurs_n, temps2, label='delaunay')
pl.legend(loc='best')
pl.xlabel('n')
pl.ylabel('temps')
pl.show()
def testQuestion2_8():
"""Compare le reseau naif et non naif."""
g = graphe.pointsAleatoires(30, 30)
g1 = copy.deepcopy(g)
g.renomme("Naïf")
g1.renomme("Non naïf")
graphe.reseau(g)
graphe.reseauRapide(g1)
graphique.affiche(g, (0, 0), 10.)
graphique.affiche(g1, (0, 0), 10.)
def testQuestion2_9():
"""Compare le temps de création des deux méthodes de création de réseau"""
def prepare(p): return graphe.pointsAleatoires(p, 10)
valeurs_n = list(map(lambda x: int(x), np.logspace(1, 3, 30)))
temps1 = chronometre(graphe.reseau, prepare, valeurs_n)
temps2 = chronometre(graphe.reseauRapide, prepare, valeurs_n)
pl.close('all')
pl.title("Comparaison du temps d'exécution de `reseau` et `reseauRapide`.")
pl.plot(valeurs_n, temps1, label='reseau')
pl.plot(valeurs_n, temps2, label='reseauRapide')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
pl.title("Comparaison du temps d'exécution de `reseau` et `reseauRapide`.")
pl.loglog(valeurs_n, temps1, label='reseau')
pl.loglog(valeurs_n, temps2, label='reseauRapide')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
def testQuestion3_1():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.renomme("Dijkstra")
graphe.reseauRapide(g)
g.dijkstra(g.sommets[0])
g.traceArbreDesChemins()
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_2():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.renomme("Dijkstra")
graphe.reseauRapide(g)
g.fixeTempsCommeCout()
g.dijkstra(g.sommets[0])
g.traceArbreDesChemins()
g.renomme("Temps")
graphique.affiche(g, (0, 0), 10., blocage=False)
g.fixeCarburantCommeCout()
g.dijkstra(g.sommets[0])
g.traceArbreDesChemins()
g.renomme("Carburant")
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_3():
"""Mesure le temps d'exécution de Dijkstra."""
def prepare(p): return graphe.reseauRapide(graphe.pointsAleatoires(p, 100))
valeurs_n = list(map(lambda x: int(x), np.logspace(1, 3, 100)))
temps = chronometre(graphe.Graphe.dijkstra, prepare, valeurs_n)
def f(x): return x*np.log(x)
theorie = [f(x) for x in valeurs_n]
pl.close('all')
pl.title("Temps d'exécution en fonction de la taille du graphe.")
pl.plot(valeurs_n, temps, label="Dijkstra")
pl.plot(valeurs_n, theorie, label="$x \mapsto x\log x$")
pl.legend(loc="best")
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
pl.title("Temps d'exécution en fonction de la taille du graphe.")
pl.loglog(valeurs_n, temps)
pl.loglog(valeurs_n, theorie, label="$x \mapsto x\log x$")
pl.legend(loc="best")
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
def testQuestion3_4():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.renomme("Plus court chemin")
graphe.reseauRapide(g)
g.fixeTempsCommeCout()
g.dijkstra(g.sommets[0])
c = g.cheminOptimal(g.sommets[-1])
g.colorieChemin(c, (0., 1., 0.))
g.renomme("Temps")
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_5():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.fixeTempsCommeCout()
graphe.reseauRapide(g)
g.dijkstra(g.sommets[0])
g.traceArbreDesChemins()
g.renomme("Liste")
graphique.affiche(g, (0, 0), 10., blocage=False)
g.dijkstraAvecTas(g.sommets[0])
g.traceArbreDesChemins()
g.renomme("Tas")
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_6():
"""Compare Dijkstra avec et sans tas."""
def prepare(p): return graphe.reseauRapide(graphe.pointsAleatoires(p, 10))
valeurs_n = list(map(lambda x: int(x), np.logspace(1, 3, 10)))
temps1 = chronometre(graphe.Graphe.dijkstra, prepare, valeurs_n)
temps2 = chronometre(graphe.Graphe.dijkstraAvecTas, prepare, valeurs_n)
pl.close('all')
pl.title("Comparaison du temps d'exécution de `dijkstra` et `dijkstraAvecTas`.")
pl.plot(valeurs_n, temps1, label='Dijkstra')
pl.plot(valeurs_n, temps2, label='Dijkstra avec tas')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
pl.title("Comparaison du temps d'exécution de `reseau` et `reseauRapide`.")
pl.loglog(valeurs_n, temps1, label='Dijkstra')
pl.loglog(valeurs_n, temps2, label='Dijkstra avec tas')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
def testQuestion3_7():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.fixeTempsCommeCout()
graphe.reseauRapide(g)
g.dijkstraPartiel(g.sommets[0], g.sommets[-1])
g.traceArbreDesChemins()
g.renomme("Dijkstra partiel")
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_8():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
g.fixeCarburantCommeCout()
graphe.reseauRapide(g)
g.astar(g.sommets[0], g.sommets[-1])
g.traceArbreDesChemins()
g.renomme("A*")
graphique.affiche(g, (0, 0), 10., blocage=False)
g.dijkstraPartiel(g.sommets[0], g.sommets[-1])
g.traceArbreDesChemins()
g.renomme("Dijkstra partiel")
graphique.affiche(g, (0, 0), 10.)
def testQuestion3_9():
"""Compare Dijkstra avec et sans tas et A*."""
def prepare(p): return graphe.reseauRapide(graphe.pointsAleatoires(p, 10))
valeurs_n = list(map(lambda x: int(x), np.logspace(1, 2.5, 30)))
temps1 = chronometre(graphe.Graphe.dijkstra, prepare, valeurs_n)
temps2 = chronometre(graphe.Graphe.dijkstraPartiel, prepare, valeurs_n)
temps3 = chronometre(graphe.Graphe.astar, prepare, valeurs_n)
pl.close('all')
pl.title(
"Comparaison du temps d'exécution de `dijkstra`, `dijkstraPartiel` et `astar`.")
pl.plot(valeurs_n, temps1, label='Dijkstra')
pl.plot(valeurs_n, temps2, label='Dijkstra partiel avec tas')
pl.plot(valeurs_n, temps3, label='A*')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
pl.title(
"Comparaison du temps d'exécution de `dijkstra`, `dijkstraPartiel` et `astar`.")
pl.loglog(valeurs_n, temps1, label='Dijkstra')
pl.loglog(valeurs_n, temps2, label='Dijkstra partiel avec tas')
pl.loglog(valeurs_n, temps3, label='A*')
pl.legend(loc='best')
pl.xlabel("n")
pl.ylabel("temps")
pl.show()
def testQuestion4_1():
"""Trace le plus court chemin avec dijkstra."""
g = graphe.pointsAleatoires(30, 30)
graphe.reseauRapide(g)
g.renomme("graphe")
print("Points 0,1 et 2")
tournee = [g.sommets[i] for i in (0, 1, 2)]
print(g.matriceCout(tournee))
graphique.affiche(g, (0, 0), 10.)
def testQuestion4_2():
g = graphe.pointsAleatoires(30, 30)
graphe.reseauRapide(g)
g.renomme("graphe")
print("Points 0,1,2 et 7")
tournee = [g.sommets[i] for i in (0, 1, 2, 7)]
cout, iti = g.voyageurDeCommerceNaif(tournee)
g.traceItineraire(iti)
graphique.affiche(g, (0, 0), 10.)
def testQuestion4_3():
"""Mesure le temps de calcul."""
g = graphe.reseauRapide(graphe.pointsAleatoires(1000, 1000))
def prepare(p): return random.sample(g.sommets, p)
valeurs_n = list(map(int, np.linspace(1, 11, 10)))
temps = chronometre(g.voyageurDeCommerceNaif, prepare, valeurs_n)
pl.close('all')
pl.title("Temps d'exécution pour le voyageur de commerce.")
pl.plot(valeurs_n, temps)
pl.xlabel("n (nombre de points de la tournée)")
pl.ylabel("temps")
pl.show()
pl.title("Temps d'exécution pour le voyageur de commerce.")
pl.loglog(valeurs_n, temps)
pl.xlabel("n (nombre de points de la tournée)")
pl.ylabel("temps")
pl.show()
def testQuestion4_6():
g = graphe.pointsAleatoires(30, 30)
graphe.reseauRapide(g)
g.fixeTempsCommeCout()
g.renomme("Algorithme de Prim (cout=temps)")
p = g.Prim()
print("Poids de prim:", p)
g.colorieSelection()
graphique.affiche(g, (0, 0), 10.)
def testQuestion4_7():
g = graphe.pointsAleatoires(30, 30)
graphe.reseauRapide(g)
g.fixeTempsCommeCout()
g.renomme("Graphe de test (cout=temps)")
tournee = [g.sommets[i] for i in (0, 1, 2, 7)]
g1 = g.grapheDeCout(tournee)
graphique.affiche(g, (0, 0), 10., blocage=False)
graphique.affiche(g1, (0, 0), 10.)
def testQuestion4_8():
g = graphe.pointsAleatoires(30, 30)
graphe.reseauRapide(g)
g.fixeTempsCommeCout()
g.renomme("Graphe de test (cout=temps) tournée approximative")
g1 = copy.deepcopy(g)
g1.renomme("Graphe de test (cout=temps) tournée naïve")
print("Tournée 0, 1, 2, 7")
tournee = [g.sommets[i] for i in (0, 1, 2, 7)]
iti = g.tourneeApproximative(tournee)
g.traceItineraire(iti)
tournee = [g1.sommets[i] for i in (0, 1, 2, 7)]
cout, iti = g1.voyageurDeCommerceNaif(tournee)
g1.traceItineraire(iti)
graphique.affiche(g, (0, 0), 10., blocage=False)
graphique.affiche(g1, (0, 0), 10.)
def testQuestion4_9():
"""Mesure le temps de calcul."""
g = graphe.reseauRapide(graphe.pointsAleatoires(1000, 1000))
def prepare(p): return random.sample(g.sommets, p)
valeurs_n = list(map(int, np.logspace(1, 3, 30)))
temps = chronometre(g.tourneeApproximative, prepare, valeurs_n)
pl.close('all')
pl.title("Temps d'exécution pour le voyageur de commerce approximatif.")
pl.plot(valeurs_n, temps)
pl.xlabel("n (nombre de points de la tournée)")
pl.ylabel("temps")
pl.show()
pl.title("Temps d'exécution pour le voyageur de commerce approximatif.")
pl.loglog(valeurs_n, temps)
pl.xlabel("n (nombre de points de la tournée)")
pl.ylabel("temps")
pl.show()
if __name__ == '__main__':
n = sys.argv[1]
if n in ('--help', '-h'):
print(__doc__)
else:
print('Question ', n)
locals()['testQuestion'+n]()