Réseau de livraisons - Analyse de trajets
On dispose d'un fichier texte trajets.txt décrivant des trajets de livraison effectués par des chauffeurs.
Chaque ligne est de la forme :
chauffeur;ville_depart;ville_arrivee;distance;temps
distanceen km (entier)tempsen minutes (entier)
Exemple de contenu
Amina;Fes;Rabat;200;150
Youssef;Rabat;Casablanca;90;80
Amina;Fes;Meknes;60;50
Sara;Casablanca;Marrakech;240;180
Youssef;Fes;Rabat;200;160
Sara;Marrakech;Agadir;250;200
Écrire une fonction lire_trajets(fichier) qui retourne un dictionnaire :
{chauffeur: [(depart, arrivee, distance, temps), ...]}
Exemple (partiel)
lire_trajets("trajets.txt")
{
"Amina": [("Fes", "Rabat", 200, 150), ("Fes", "Meknes", 60, 50)],
"Youssef": [("Rabat", "Casablanca", 90, 80), ("Fes", "Rabat", 200, 160)],
"Sara": [("Casablanca", "Marrakech", 240, 180), ("Marrakech", "Agadir", 250, 200)]
}
def lire_trajets(fichier):
trajets = {}
with open(fichier, 'r', encoding='utf-8') as f:
for ligne in f:
ligne = ligne.strip()
if not ligne:
continue
chauffeur, depart, arrivee, distance, temps = ligne.split(';')
distance = int(distance)
temps = int(temps)
if chauffeur not in trajets:
trajets[chauffeur] = []
trajets[chauffeur].append((depart, arrivee, distance, temps))
return trajets
Écrire distance_totale(trajets, chauffeur) qui retourne la distance totale parcourue par un chauffeur.
Exemple
distance_totale(trajets, "Amina")
260
def distance_totale(trajets, chauffeur):
if chauffeur not in trajets:
return 0
total = 0
for depart, arrivee, distance, temps in trajets[chauffeur]:
total += distance
return total
Écrire villes_visitees(trajets, chauffeur) qui retourne l'ensemble des villes visitées (départ ou arrivée).
def villes_visitees(trajets, chauffeur):
if chauffeur not in trajets:
return set()
villes = set()
for depart, arrivee, distance, temps in trajets[chauffeur]:
villes.add(depart)
villes.add(arrivee)
return villes
Écrire toutes_villes(trajets) qui retourne l'ensemble de toutes les villes apparaissant dans le fichier.
def toutes_villes(trajets):
villes = set()
for chauffeur, liste_trajets in trajets.items():
for depart, arrivee, distance, temps in liste_trajets:
villes.add(depart)
villes.add(arrivee)
return villes
Écrire trajet_plus_long(trajets) qui retourne le tuple correspondant au trajet de distance maximale sous la forme (chauffeur, depart, arrivee, distance, temps).
def trajet_plus_long(trajets):
max_distance = -1
meilleur_trajet = None
for chauffeur, liste_trajets in trajets.items():
for depart, arrivee, distance, temps in liste_trajets:
if distance > max_distance:
max_distance = distance
meilleur_trajet = (chauffeur, depart, arrivee, distance, temps)
return meilleur_trajet
Écrire chauffeur_plus_rapide(trajets) qui retourne le chauffeur ayant la meilleure vitesse moyenne globale : $$\text{vitesse} = \frac{\text{distance totale}}{\text{temps total}}$$
def chauffeur_plus_rapide(trajets):
max_vitesse = -1
meilleur_chauffeur = None
for chauffeur, liste_trajets in trajets.items():
distance_tot = 0
temps_tot = 0
for depart, arrivee, distance, temps in liste_trajets:
distance_tot += distance
temps_tot += temps
if temps_tot > 0:
vitesse = distance_tot / temps_tot
if vitesse > max_vitesse:
max_vitesse = vitesse
meilleur_chauffeur = chauffeur
elif vitesse == max_vitesse:
if meilleur_chauffeur is None or chauffeur < meilleur_chauffeur:
meilleur_chauffeur = chauffeur
return meilleur_chauffeur
Écrire dictionnaire_villes(trajets) qui retourne un dictionnaire : {ville: nombre_de_passages} (une ville est comptée chaque fois qu'elle apparaît, départ ou arrivée)
def dictionnaire_villes(trajets):
compteur = {}
for chauffeur, liste_trajets in trajets.items():
for depart, arrivee, distance, temps in liste_trajets:
compteur[depart] = compteur.get(depart, 0) + 1
compteur[arrivee] = compteur.get(arrivee, 0) + 1
return compteur
Écrire chauffeurs_par_ville(trajets) qui retourne : {ville: ensemble_des_chauffeurs}
def chauffeurs_par_ville(trajets):
dico = {}
for chauffeur, liste_trajets in trajets.items():
for depart, arrivee, distance, temps in liste_trajets:
# Ajouter pour la ville de départ
if depart not in dico:
dico[depart] = set()
dico[depart].add(chauffeur)
# Ajouter pour la ville d'arrivée
if arrivee not in dico:
dico[arrivee] = set()
dico[arrivee].add(chauffeur)
return dico
Écrire villes_communes(trajets, c1, c2) qui retourne les villes visitées par les deux chauffeurs.
def villes_communes(trajets, c1, c2):
if c1 not in trajets or c2 not in trajets:
return set()
villes_c1 = villes_visitees(trajets, c1)
villes_c2 = villes_visitees(trajets, c2)
return villes_c1 & villes_c2
Écrire ecrire_longs_trajets(fichier_entree, fichier_sortie, seuil) qui écrit dans un nouveau fichier uniquement les trajets dont la distance ≥ seuil.
def ecrire_longs_trajets(fichier_entree, fichier_sortie, seuil):
trajets = lire_trajets(fichier_entree)
with open(fichier_sortie, 'w', encoding='utf-8') as f:
for chauffeur, liste_trajets in trajets.items():
for depart, arrivee, distance, temps in liste_trajets:
if distance >= seuil:
ligne = f"{chauffeur};{depart};{arrivee};{distance};{temps}\n"
f.write(ligne)
Écrire recommandation_ville(trajets, chauffeur) qui retourne une ville visitée par d'autres chauffeurs mais jamais par chauffeur, et la plus fréquente dans les données.
def recommandation_ville(trajets, chauffeur):
# Villes visitées par le chauffeur
villes_chauffeur = villes_visitees(trajets, chauffeur)
# Dictionnaire des fréquences des villes
frequences = dictionnaire_villes(trajets)
# Villes visitées par d'autres chauffeurs
autres_villes = set(frequences.keys()) - villes_chauffeur
if not autres_villes:
return None
# Trouver la ville la plus fréquente parmi celles non visitées
max_freq = -1
meilleure_ville = None
for ville in autres_villes:
if frequences[ville] > max_freq:
max_freq = frequences[ville]
meilleure_ville = ville
elif frequences[ville] == max_freq:
if meilleure_ville is None or ville < meilleure_ville:
meilleure_ville = ville
return meilleure_ville
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.