DS MPSI - Réseau de livraisons - Analyse de trajets

20 Mar 2026 20 Mar 2026 201 vues ESSADDOUKI Mostafa 6 min de lecture
Logistique Lecture de fichiers Structures de données Intermédiaire
5 parties
11 questions
Python CPGE MPSI
~60 min

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
  • distance en km (entier)
  • temps en 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
1
Lecture et structuration 1 question
Q1

Écrire une fonction lire_trajets(fichier) qui retourne un dictionnaire :
{chauffeur: [(depart, arrivee, distance, temps), ...]}

Exemple (partiel)

Entrée
lire_trajets("trajets.txt")
Sortie
{
    "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)]
}
Solution — Lecture des trajets
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
2
Exploitation des données 3 questions
Q2

Écrire distance_totale(trajets, chauffeur) qui retourne la distance totale parcourue par un chauffeur.

Exemple

Entrée
distance_totale(trajets, "Amina")
Sortie
260
Solution — Distance totale
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
Q3

Écrire villes_visitees(trajets, chauffeur) qui retourne l'ensemble des villes visitées (départ ou arrivée).

Solution — Villes visitées
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
Q4

Écrire toutes_villes(trajets) qui retourne l'ensemble de toutes les villes apparaissant dans le fichier.

Solution — Toutes les villes
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
3
Analyse avancée 3 questions
Q5

Écrire trajet_plus_long(trajets) qui retourne le tuple correspondant au trajet de distance maximale sous la forme (chauffeur, depart, arrivee, distance, temps).

Solution — Trajet le plus long
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
Q6

Écrire chauffeur_plus_rapide(trajets) qui retourne le chauffeur ayant la meilleure vitesse moyenne globale : $$\text{vitesse} = \frac{\text{distance totale}}{\text{temps total}}$$

Solution — Chauffeur le plus rapide
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
Q7

É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)

Solution — Dictionnaire des villes
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
4
Traitements croisés 2 questions
Q8

Écrire chauffeurs_par_ville(trajets) qui retourne : {ville: ensemble_des_chauffeurs}

Solution — Chauffeurs par ville
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
Q9

Écrire villes_communes(trajets, c1, c2) qui retourne les villes visitées par les deux chauffeurs.

Solution — Villes communes
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
5
Écriture et filtrage 2 questions
Q10

Écrire ecrire_longs_trajets(fichier_entree, fichier_sortie, seuil) qui écrit dans un nouveau fichier uniquement les trajets dont la distance ≥ seuil.

Solution — Écrire les longs trajets
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)
Q11

É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.

Solution — Recommandation de ville
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
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.