a3-algorithmique-avancee/.ipynb_checkpoints/Projet_algo-checkpoint.ipynb
2023-06-05 14:22:44 +02:00

53 KiB

Projet algorithme

Contexte du projet:

L'ADEME a lancé un appel à manifestation d'intérêt pour développer des solutions de mobilité adaptées à différents territoires. CesiCDP, en collaboration avec des partenaires, s'est spécialisé dans la Mobilité Multimodale Intelligente. Dans le cadre de cet appel, l'équipe de CesiCDP travaille sur la gestion de tournées de livraison pour minimiser les trajets et optimiser l'efficacité. L'objectif est d'obtenir de nouveaux marchés et des financements pour poursuivre le développement de l'entreprise. Des contraintes supplémentaires seront ajoutées pour rendre le problème plus réaliste et intéressant pour l'ADEME.

Notre but est de réaliser un algorithme permettant de passer par tous les points de livraisons avec un temps optimisé.

Interprétation du problème

Notre situation peut être représentée par un graphe, où chaque ville est un sommet du graphe. L'objectif est de visiter chaque ville et revenir au point de départ en empruntant le chemin le plus rapide. Chaque liaison entre les villes a un poids qui correspond au temps de trajet entre une ville A et une ville B.

Dans ce cas, notre problème peut être assimilé à une variante dynamique du problème du voyageur de commerce, avec un graphe incomplet. Nous cherchons le chemin le plus court en passant par toutes les villes, en tenant compte des variations de poids des liaisons au fil du temps. Il est possible de passer plusieurs fois par la même ville si cela permet d'obtenir le chemin le plus rapide.

Objectifs

L'objectif de notre algorithme est de calculer et de fournir le meilleur itinéraire possible et le plus optimisé en terme de temps.

Minimiser les temps de trajets, en optimisant les itinéraires.

Contrainte :

Contrainte de temps entre les sommets.

  • Il faut passer par tout les sommets au moins une fois.
  • On peut passer par plusieurs sommet si le temps de trajet est plus court
  • Les temps de parcours d'une arête peut varié au cours du temps en fonction de l'heure.
  • Faire un cycle (revenir au point de départ)
In [1]:
import random
import networkx as nx
import matplotlib.pyplot as plt

def generate_incomplete_graph(num_nodes):
    # Créer un graphe vide
    G = nx.Graph()

    # Ajouter les sommets au graphe
    G.add_nodes_from(range(1, num_nodes + 1))

    # Ajouter au moins deux arêtes par sommet
    for node in G.nodes():
        connected_nodes = sorted(set(G.nodes()) - {node})  # Exclure le sommet lui-même et trier les nœuds
        random_nodes = random.sample(connected_nodes, 2)
        G.add_edges_from([(node, random_nodes[0]), (node, random_nodes[1])])

    # Ajouter des arêtes supplémentaires de manière aléatoire
    while not nx.is_connected(G):
        node1, node2 = random.sample(G.nodes(), 2)
        if not G.has_edge(node1, node2):
            G.add_edge(node1, node2)

    return G

# Générer un graphe incomplet avec 10 sommets
graph = generate_incomplete_graph(10)
A = nx.adjacency_matrix(graph)

print(A.todense())

# Dessiner le graphe
nx.draw(graph, with_labels=True)
plt.show()
[[0 1 0 0 0 1 0 0 1 0]
 [1 0 0 0 0 1 0 1 1 0]
 [0 0 0 0 0 0 1 1 0 1]
 [0 0 0 0 0 0 1 1 0 0]
 [0 0 0 0 0 1 0 1 0 0]
 [1 1 0 0 1 0 1 1 0 1]
 [0 0 1 1 0 1 0 0 1 0]
 [0 1 1 1 1 1 0 0 1 0]
 [1 1 0 0 0 0 1 1 0 0]
 [0 0 1 0 0 1 0 0 0 0]]
No description has been provided for this image