100 KiB
Projet algorithme¶
Context 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 qui permette de passer par tout les points de livraisons avec un temps optimisé.
Modélisation du problème¶
L'objectif de notre algorithme est de calculer et de fournir le meilleur itinéraire possible et le plus optimisé en terme de temps.
Notre problème se modélise sous forme d'un graphe, chaque sommet du graphe va représenter une ville. Le but est de passer par chaque ville pour revenir au point de départ en empruntant le chemin le plus rapide. Chaque arête possède un poids qui représente le temps de trajet d'une ville A à une ville B.
Objectifs¶
Minimiser les temps de trajets, en optimisant les itinéraires.
Contrainte :¶
Contrainte de temps entre les sommets. Les temps de parcours d'une arête peut varié au cours du temps en fonction de l'heure.
import numpy as np mat = np.random.random((100, 100)) mat = mat + mat.T adja = (mat >= 1.4).astype(int) for i in range(adja.shape[0]): adja[i ,i] = 0 adja
array([[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 1, 0, 0],
[0, 0, 0, ..., 1, 0, 0],
...,
[0, 1, 1, ..., 0, 0, 1],
[0, 0, 0, ..., 0, 0, 1],
[0, 0, 0, ..., 1, 1, 0]])
import networkx as nx import scipy import matplotlib.pyplot as plt fix, ax = plt.subplots(1, 1,figsize=(4,4)) G = nx.DiGraph(np.array(adja)) layout = nx.kamada_kawai_layout(G) nx.draw(G, with_labels=True, ax=ax, pos=layout)
import numpy as np from collections import defaultdict def dfs(graph, start, visited): visited.add(start) for neighbor in graph[start]: if neighbor not in visited: dfs(graph, neighbor, visited) mat = np.random.random((10, 10)) mat = mat + mat.T matrix = (mat >= 1.4).astype(int) for i in range(matrix.shape[0]): matrix[i, i] = 0 # Créer un dictionnaire représentant le graphe graph = defaultdict(list) for i in range(matrix.shape[0]): for j in range(matrix.shape[1]): if matrix[i, j] == 1: graph[i].append(j) # Effectuer la recherche en profondeur pour trouver les sommets accessibles depuis le premier sommet visited = set() dfs(graph, 0, visited) # Vérifier si tous les sommets ont été visités is_connected = len(visited) == matrix.shape[0] # Si le graphe n'est pas connexe, ajouter des arêtes supplémentaires pour connecter les sommets manquants if not is_connected: for i in range(matrix.shape[0]): if i not in visited: # Trouver un sommet déjà visité et ajouter une arête entre les deux sommets random_visited = np.random.choice(list(visited)) adja[i, random_visited] = 1 adja[random_visited, i] = 1 print(adja)
[[0 0 0 0 1 1 1 1 1 0] [0 0 0 1 1 1 1 1 1 0] [0 0 0 0 1 1 0 0 0 1] [0 1 0 0 0 0 1 0 0 1] [1 1 1 0 0 1 1 0 1 0] [1 1 1 0 1 0 1 1 0 1] [1 1 0 1 1 1 0 1 0 0] [1 1 0 0 0 1 1 0 0 1] [1 1 0 0 1 0 0 0 0 0] [0 0 1 1 0 1 0 1 0 0]]
import networkx as nx import scipy import matplotlib.pyplot as plt fix, ax = plt.subplots(1, 1,figsize=(4,4)) G = nx.DiGraph(np.array(matrix)) layout = nx.kamada_kawai_layout(G) nx.draw(G, with_labels=True, ax=ax, pos=layout)