190 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é.
Contrainte :¶
Les contraintes que nous avons choisi sont les suivantes:
- Avoir plusieurs camions disponible simultanément pour effectuer les livraisons.
- Fenêtre de temps de livraison pour chaque object
Formulation du problème¶
Le problème que nous avons avec les contraintes ci-dessus est le problème VRPTW (Vehicule Routing Problem avec la contrainte supplémentaire de Time Window).
- Tous les clients doivent être déservis
- Un client ne peut être servi que par un et un seul véhicule.
- En quittant un client, un véhicule peut aller que vers un seul autre client.
- Un véhicule ne peut servir un client que s'il a assez de capacité pour servir le client.
On va donc affecter chaque client à une tournée effectué par un seul véhicule.
e.
Objectifs¶
L'objectif de notre algorithme est de calculer et de fournir les meilleurs itinéraires pour pouvoir livrer tout les clients avec le nombre de camion disponible.
Il est possible de minimiser le nombre de camion nécessaire en optimisant les trajets et leurs temps. Il faut donc pour cela minimiser le temps de chaque parcours.
Modélisation mathématique¶
Nous allons représenter notre problème par un graphe
$G=(V,E)$
$V$ représente les sommets du graphe qui correspondent aux clients
$E$ représente les arcs entre deux clients $i,j \in V$
On a un ensemble $C=\{1,2,...,n_c\}$ de clients qui doivent obtenir leur livraison qui provient du dépot.
L'ensemble des emplacements des clients est défini comme : $V = C \cup \{0, n_c+1\} $
$0$ et $n_c+1$ représente le dépot, puisqu'on doit revenir au point de départ le dépots est le dernier client plus un.
On a un ensemble $V=\{1,2,...,n_v\}$ de véhicule disponible et chaque véhicule possède une capacité $Q$.
Variables de décisions:¶
Variables de décision:
- Un ensemble de k véhicule
import random import networkx as nx import matplotlib.pyplot as plt def generate_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 graph = generate_graph(100) A = nx.adjacency_matrix(graph) print(A.todense()) # Dessiner le graphe nx.draw(graph, with_labels=True) plt.show()
[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]
#k Nombre de camion disponible k = 4 class Ant: