Vous êtes sur la page 1sur 4

Université Paris Dauphine Algorithmique et programmation 1

Licence MIE 1re année 2021-2022

TP noté : Localisation de centres de santé


Mardi 4 janvier 2022 - durée : 1 heure 30

Description générale
On souhaite écrire un programme en Python pour sélectionner, dans une région géographique
donnée, des communes afin d’y installer des centres de santé. Deux communes sont considérées
comme voisines si le temps de transport pour aller de l’une à l’autre est inférieur à 1 heure.
Lorsqu’un centre de santé est ouvert dans une commune c, les communes couvertes sont c et
celles voisines de c.
Dans la région géographique considérée, nous connaissons :
— la liste des n communes ayant besoin d’accéder à un centre de santé ;
— la population de chaque commune ;
— pour chaque commune, le coût d’installation d’un centre de santé sur cette commune ;
— pour chaque commune, la liste des communes voisines ;
— le budget total disponible pour l’implantation de tous les centres de santé.

L’objectif est de sélectionner, parmi les n communes de la région, un sous-ensemble de communes


afin d’y ouvrir des centres de santé (1 par commune choisie) de façon à maximiser la population totale
couverte par au moins un centre tout en respectant la contrainte budgétaire suivante : la somme des
coûts d’ouverture des centres ne doit pas dépasser le budget total.

Les données initiales sont stockées dans :


— une liste de communes contenant les noms des n communes, chaque élément est une chaîne
de caractères,
— un dictionnaire décrivant les populations dont les clés sont les noms des communes et dont
chaque valeur est le nombre d’habitants de la commune (en milliers),
— un dictionnaire décrivant les coûts dont les clés sont les noms des communes et dont chaque
valeur est le coût d’installation (en millions) d’un centre dans la commune,
— un dictionnaire décrivant les voisins dont les clés sont les noms des communes et dont chaque
valeur est la liste des noms des communes voisines.

Une solution est une liste de noms de communes, celles sur lesquelles on décide d’ouvrir un
centre de santé.

Pour tester vos fonctions, nous vous proposons un exemple constitué de 7 communes : Brest,
Quimper, Lorient, Rennes, Saint-Brieux, Saint-Malo et Vannes. Les variables décrivant le problème
sont :

1
com = ['Brest', 'Quimper', 'Lorient', 'Rennes', 'Saint-Brieuc',
'Saint-Malo', 'Vannes']

popu = {"Brest" : 140, "Quimper" : 63, "Lorient" : 57,


"Rennes" : 218, "Saint-Brieuc" : 44, "Saint-Malo" : 47,
"Vannes" : 53}

cout = {"Brest" : 4, "Quimper" : 7, "Lorient" : 5, "Rennes" : 10,


"Saint-Brieuc" : 6, "Saint-Malo" : 3, "Vannes" : 8}

voisin = {"Brest" : ["Quimper"],


"Quimper" : ["Brest", "Lorient", "Vannes"],
"Lorient" : ["Quimper", "Vannes"],
"Rennes" : ["Saint-Brieuc", "Saint-Malo", "Vannes"],
"Saint-Brieuc" : ["Rennes", "Saint-Malo", "Vannes"],
"Saint-Malo" : ["Rennes", "Saint-Brieuc"],
"Vannes" : ["Saint-Brieuc", "Lorient", "Quimper", "Rennes"]}

Ces variables sont disponibles dans le fichier bretagne.py disponible dans le répertoire
ETUD/DEMI2E_L1_AlgoProg.

Travail à réaliser
Commencer par créer un fichier .py dont le nom sera de la forme PrenomNomNumSalle.py,
où NumSalle est le numéro de la salle dans laquelle vous réalisez le TP noté.
Par exemple, Raoul Michou, qui est en salle B042, nommera son fichier RaoulMichouB042.py.
Ce fichier contiendra l’ensemble de vos fonctions et programme principal commentés.

PENSEZ À SAUVEGARDER RÉGULIÈREMENT VOTRE TRAVAIL


PENDANT LA SÉANCE !

L’exécution correcte et sans erreur (ou non...) de vos fonctions sera prise en compte dans la
notation.

2
1. Écrire une fonction communesCouvertes() prenant en arguments une solution et un dic-
tionnaire décrivant les voisins. Cette fonction doit renvoyer la liste des communes couvertes
par au moins une commune de la solution, sans doublon. Sur notre exemple, si une solution est
constituée des communes Brest et Lorient alors cette fonction doit renvoyer ['Brest',
'Lorient', 'Quimper', 'Vannes'].
2. Écrire une fonction valeurSolution() prenant en arguments une solution, un diction-
naire décrivant la population, un dictionnaire décrivant les coûts et un dictionnaire décrivant
les voisins. Cette fonction doit renvoyer 2 valeurs : le coût total d’installation des centres et
le nombre total d’habitants rattachés à ces centres. Attention, si une commune est voisine de
plusieurs centres de santé, sa population doit être comptée une seule fois. Pour cela, on fera
appel à la fonction communeCouvertes().
Par exemple, si la solution proposée est constituée des communes Brest et Lorient, alors
la fonction renvoie 9 et 313.
3. Écrire une fonction solAleatoire(), qui prend en arguments un budget total B, une liste
des n communes et un dictionnaire décrivant les coûts. Cette fonction renvoie une solution
générée aléatoirement dont le coût est inférieur ou égal à B. Cette solution est générée selon
le principe suivant : tant que possible, choisir aléatoirement une commune qui n’est pas déjà
dans la solution et dont le coût est inférieur ou égal au budget encore disponible ; on s’arrête
quand le budget encore disponible ne permet plus d’ajouter aucune commune.
4. Écrire une fonction meilleureSolAleatoire(), qui prend en arguments un budget to-
tal B, un nombre de tentatives t, une liste des n communes, un dictionnaire décrivant la po-
pulation, un dictionnaire décrivant les coûts et un dictionnaire décrivant les voisins. Cette
fonction génère aléatoirement t solutions (dont le coût est inférieur ou égal à B) pour gar-
der la meilleure d’entre elles, c’est-à-dire celle qui permet de maximiser la population totale
rattachée à ses centres. Cette fonction doit faire appel aux fonctions solAleatoire() et
valeurSolution() et doit renvoyer la meilleure des t solutions.
5. Écrire une fonction initialisation() qui prend en argument un nom de fichier. Elle
renvoie la liste des n communes et les dictionnaires décrivant les populations, les coûts et
les voisins. Dans ce fichier, chaque ligne décrit les informations concernant une commune en
suivant le format suivant :
nom-de-la-commune:population coût voisin1,voisin2,...,voisink
avec voisin1,voisin2,...,voisink la liste des k communes voisines. Le fichier
appelé bretagne.txt est disponibles dans le répertoire ETUD/DEMI2E_L1_AlgoProg.
6. Écrire un programme principal qui :
— demande à l’utilisateur quel est le nom du fichier contenant les données de la région ;
— demande à l’utilisateur quel est le budget global B ;
— affiche la meilleure solution parmi 10 solutions générées aléatoirement.
7. Un ingénieur du conseil régional propose d’appliquer une autre méthode pour trouver une
solution : tant que possible, choisir la commune permettant de couvrir le plus grand nombre
d’habitants non encore couverts et telle que son coût soit inférieur ou égal au budget encore
disponible. Écrire une fonction genereSol(), qui prend en arguments un budget total B,
une liste des n communes, un dictionnaire décrivant la population, un dictionnaire décrivant
les coûts et un dictionnaire décrivant les voisins. Cette fonction renvoie la solution trouvée en
suivant l’approche de l’ingénieur. Compléter le programme principal pour qu’il affiche le nom
de la méthode trouvant la meilleure solution : celle de l’ingénieur ou l’aléatoire.

3
Rendu du TP
À la fin de la séance de TP noté, faire une copie de votre fichier PrenomNomNumSalle.py conte-
nant tout votre travail dans le répertoire EXAM/DEMI2E_L1_AlgoProg/NumSalle où NumSalle
est le numéro de la salle dans laquelle vous travaillez. Ainsi, Raoul Michou, actuellement en B042,
devra copier son fichier RaoulMichouB042.py dans le répertoire
EXAM/DEMI2E_L1_AlgoProg/B042.

ATTENTION, vous ne pourrez réaliser cette opération qu’une seule fois, car une fois votre fi-
chier .py copié dans le repertoire EXAM/DEMI2E_L1_AlgoProg/NumSalle, vous ne pourrez
plus le modifier, ni l’effacer de ce répertoire.
C’est donc UNIQUEMENT à la fin du TP que vous devez coller la version finale (celle qui sera
corrigée) de votre programme, dans le répertoire EXAM/DEMI2E_L1_AlgoProg/NumSalle.

Vous aimerez peut-être aussi