a3-algorithmique-avancee/Projet_algo.ipynb
Romain HUNTZINGER 8b8ed6848f Upload New File
2023-06-04 10:47:34 +00:00

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.

In [15]:
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
Out[15]:
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]])
In [16]:
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)
No description has been provided for this image
In [11]:
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]]
In [12]:
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)
No description has been provided for this image
In [ ]: