CONTRÔLE HORS-CLASSEMENT ÉCOLE POLYTECHNIQUE INFORMATIQUE COURS INF 431



Documents pareils
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation avec des objets : Cours 7. Menu du jour

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmer en JAVA. par Tama

Projet de programmation (IK3) : TP n 1 Correction

TD/TP PAC - Programmation n 3

Java Licence Professionnelle CISII,

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Premiers Pas en Programmation Objet : les Classes et les Objets

Tp 1 correction. Structures de données (IF2)

Université Kasdi Merbeh Ouargla FSSI/ Département des maths et de l informatique Corrigé type TD N 8 de ASD2 (Les Graphes)

TD3: tableaux avancées, première classe et chaînes

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Corrigé des exercices sur les références

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

TD/TP PAC - Programmation n 3

Les structures de données. Rajae El Ouazzani

Chapitre 10. Les interfaces Comparable et Comparator 1

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Programmation par les Objets en Java

Package Java.util Classe générique

Programme Compte bancaire (code)

Objets et Programmation. origine des langages orientés-objet

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Programmation Par Objets

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Chapitre VI- La validation de la composition.

TP, première séquence d exercices.

Auto-évaluation Programmation en Java

Exercices sur les interfaces

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Corrigés des premiers exercices sur les classes

Utilisation d objets : String et ArrayList

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Un ordonnanceur stupide

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Les arbres binaires de recherche

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TP1 : Initiation à Java et Eclipse

Solutions du chapitre 4

Recherche dans un tableau

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Flux de données Lecture/Ecriture Fichiers

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à JDBC. Accès aux bases de données en Java

INF 321 : mémento de la syntaxe de Java

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Resolution limit in community detection

2. Comprendre les définitions de classes

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

OCL - Object Constraint Language

Plan du cours. Historique du langage Nouveautés de Java 7

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation Objet I

Programmation en Java IUT GEII (MC-II1) 1

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Cours 1: Java et les objets

Synchro et Threads Java TM

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Conception des systèmes répartis

Algorithmique et Programmation, IMA

as Architecture des Systèmes d Information

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Licence Sciences et Technologies Examen janvier 2010

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

V- Manipulations de nombres en binaire

Chapitre V. Les classes : Object, Vector, etc.

STAGE IREM 0- Premiers pas en Python

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Définitions. Numéro à préciser. (Durée : )

Bases Java - Eclipse / Netbeans

Programmation Orientée Objet Java

Programmation C++ (débutant)/instructions for, while et do...while

PROGRAMMATION PAR OBJETS

Arbres binaires de recherche

Gestion distribuée (par sockets) de banque en Java

Corrigé des exercices avancés sur les structures récursives

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

MIS 102 Initiation à l Informatique

UML et les Bases de Données

Langage Java. Classe de première SI

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

INITIATION AU LANGAGE JAVA

Cours 14 Les fichiers

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Plateforme PAYZEN. Définition de Web-services

Création d objet imbriqué sous PowerShell.

Algorithmique et programmation : les bases (VBA) Corrigé

Transcription:

CONTRÔLE HORS-CLASSEMENT ÉCOLE POLYTECHNIQUE INFORMATIQUE COURS INF 431 GUILLAUME HANROT ET JEAN-JACQUES LÉVY On se propose de résoudre le problème de l affectation de k tâches à n employés (k > 0, n > 0). Un employé se voit attribuer une tâche prise parmi une liste de tâches pour lesquelles il est compétent. On cherche à trouver une affectation optimale qui maximise le nombre de tâches qui peuvent être effectuées simultanément. Ce problème sera modélisé en utilisant un graphe. La première partie définit un certain nombre de classes utiles dans la modélisation et le traitement du problème ; la seconde partie calcule l affectation en utilisant le graphe construit. 1. Modélisation du problème Les employés ont chacun un nom représenté par une chaîne de caractères ; les tâches sont repérées par leurs identifiants qui sont des entiers naturels tous différents. On considère un graphe avec n+k +2 sommets ; chaque sommet est soit un employé, soit une tâche, soit un des deux sommets spéciaux Debut et. Il y a un arc allant d un employé vers une tâche pour laquelle cet employé est compétent. Il y a des arcs entre le sommet Debut et tous les employés ; il y a également des arcs entre toutes les tâches et le sommet (cf. la figure 1). Dans l exemple de la figure 1, on a n = k = 3 ; le graphe a 3 sommets «employés» avec pour nom "", "", "", e sommets «tâches»,,. En outre, "" est compétent pour les tâches et ; "" est compétent pour ; "" est compétent pour. Une affectation optimale affecte "" à, "" à et "" à, permettant d effectuer 3 tâches en parallèle, alors que l affectation de "" à empêche "" de travailler et ne laisse que la possibilité à "" de faire. Les quatres sortes de sommets sont représentées par un type disjonctif à partir d une classe abstraite Sommet, de telle manière que chaque sommet a un entier naturel distinct comme numéro (champ num), une Date: 27 avril 2004. Fig. 1 Graphe des employés et des tâches

liste d entiers qui désigne les numéros de ses esseurs dans le graphe (champ ). La classe Employe a les champs supplémentaires nom pour le nom de l employé et afaire indiquant la tâche finalement affectée à l employé ; la classe Tache a un champ entier id donnant l identifiant i de la tâche t i ; les classes Debut et n ont pas de champs supplémentaires. On utilisera également la classe suivante pour manipuler les listes d entiers : class Liste { int val; Liste suivant; Liste (int x, Liste ls) { val = x; suivant = ls; static Liste enlever (int x, Liste ls) { if (ls == null) return null; else if (ls.val == x) return ls.suivant; else return new Liste (ls.val, enlever (x, ls.suivant)); Question 1 Définir les classes Sommet, Employe, Tache, Debut, en donnant un constructeur dans chaque classe. Question 2 Écrire une méthode estemploye, sans argument, qui renvoie la valeur true si le sommet est un employé, et false dans les autres cas. Question 3 Écrire une méthode tostring permettant d afficher tout sommet. Pour un employé, on écrira son nom et la tâche à effectuer si elle existe ; pour une tâche, son identifiant précédé de la lettre t ; pour les sommets spéciaux de début et de fin, les chaînes de caractères "début" et "fin". Le graphe est représenté par un tableau sommet de n + k + 2 sommets. Ainsi le graphe de l exemple précédent est représenté par le tableau de 8 éléments comme indiqué sur la figure 2. Question 4 Définir la classe Graphe avec un constructeur prenant en argument son nombre de sommets. Question 5 Écrire la méthode ajoutersommet(x,s) qui ajoute le sommet s dans le graphe en lui donnant le numéro x. Question 6 Écrire les méthodes ajouterarc(x,y) et enleverarc(x,y), qui ajoute (ou supprime) un arc entre le sommet de numéro x et le sommet de numéro y. 2. Résolution du problème On utilise un graphe des employés et des tâches comme décrit précédemment avec les deux sommets distingués, dorénavant appelés d pour l objet de la classe Debut et f pour l objet de la classe. L algorithme pour construire l affectation optimale fonctionne par itération du calcul suivant : à chaque itération, on cherche un chemin quelconque reliant d à f dans le graphe. Si on trouve un tel chemin, on modifie le graphe en retournant les arcs qui composent ce chemin dans le graphe et on passe à l itération suivante. Si un tel chemin n existe pas, l algorithme est terminé. Sur la figure 3, on voit les différentes étapes de cet algorithme, inspiré d un algorithme plus général sur les flots dans les graphes par Ford et Fulkerson. L affectation optimale est donnée en consultant les arcs reliant un sommet «tâche» à un sommet «employé» pour tous les sommets «employés» accessibles depuis le sommet f à la fin de l algorithme. Sur l exemple de la figure 3(f), les trois sommets, et sont accessibles depuis le sommet de fin f ; ils n ont alors qu un seul esseur dans le graphe (on peut démontrer que c est toujours le cas). Ce sommet est par ailleurs forcément un «employé» et une affectation optimale donne donc pour, pour, pour.

sommet[0] "" nom afaire 0 num sommet[1] "" nom afaire 1 num sommet[2] "" nom afaire 2 num sommet[3] 1 id 3 num sommet[4] 2 id 4 num sommet[5] 3 id 5 num sommet[6] 6 num sommet[7] 7 num Fig. 2 Implémentation du graphe des employés et des tâches : les champs afaire n ont pas encore de valeur ; les champs, non complétés sur la figure, indiquent les extrémités des arcs issus de chaque sommet. Ainsi sommet[0]. vaut la liste 4, 5, sommet[1]. vaut la liste 3, sommet[2]. vaut la liste 5, sommet[3]. vaut la liste 7, sommet[4]. vaut la liste 7, sommet[5]. vaut la liste 7, sommet[6]. vaut la liste 0,1,2, sommet[7]. vaut null. On représente un chemin dans le graphe par la liste des numéros de tous les sommets qui le composent (sommets de départ et d arrivée compris) dans l ordre où ils sont rencontrés sur le chemin. Question 7 Écrire la méthode chemin(x,y) qui renvoie comme résultat un chemin allant du sommet de numéro x au sommet de numéro y dans le graphe. Si le chemin n existe pas, cette méthode renvoie null. Quelle est la complexité en temps de cette méthode? Question 8 Écrire la méthode retournerlesarcsde(l ) qui modifie le graphe en retournant les arcs rencontrés sur le chemin l. Question 9 Écrire la méthode calculerresultat(f) qui prend en argument le sommet f de fin, et qui affecte, en fin de l algorithme, les champs afaire des employés par la tâche qu ils devront faire dans l affectation optimale trouvée par l algorithme. Question 10 Écrire la méthode fordfulkerson(d,f) qui trouve une affectation optimale à partir des deux sommets d et f de début et de fin. La méthode ne renvoie pas de résultat, mais modifie les champs afaire des employés contenus dans le graphe. Quelle est la complexité en temps de cette méthode? Question 11 Écrire la méthodeafficherresultat() qui imprime pour tous les employés leur tâche affectée.

(a) (b) (c) (d) (e) (f) Fig. 3 Algorithme d affectation : les 6 étapes essives ; les chemins trouvés entre les sommets et sont en traits discontinus ; ses arcs sont retournés à l étape suivante (remarquons que le graphe devient cyclique à l étape (b)). A la fin de l algorithme, sur la figure (f), les 3 tâches, et sont des esseurs de dans le graphe ; l affectation optimale est donnée par les arcs reliant à, à et à.

3. Corrigé Question 1 abstract class Sommet { int num; Liste ; class Employe extends Sommet { String nom; Tache afaire; class Tache extends Sommet { int id; Tache (int x) { id = x; class Debut extends Sommet { class extends Sommet { Question 2 abstract class Sommet {... abstract boolean estemploye(); class Employe extends Sommet {... boolean estemploye() { return true; class Tache extends Sommet {... boolean estemploye() { return false; class Debut extends Sommet { boolean estemploye() { return false; class extends Sommet { boolean estemploye() { return false; Question 3 class Employe extends Sommet {... public String tostring() { if (afaire == null) return nom; else return nom + " " + afaire; class Tache extends Sommet {... public String tostring() { return "t" + id; class Debut extends Sommet {... public String tostring() { return "Debut";

class extends Sommet {... public String tostring() { return ""; Question 4 class Graphe { Sommet[ ] sommet; Graphe (int n) { sommet = new Sommet[n]; Question 5 void ajoutersommet (int x, Sommet s) { sommet[x] = s; s.num = x; Question 6 void ajouterarc (int x, int y) { sommet[x]. = new Liste (y, sommet[x].); void supprimerarc (int x, int y) { sommet[x]. = Liste.enlever (y, sommet[x].); Question 7 La fonction suivante prend un temps O(n + k). Liste chemin (Sommet x, Sommet y) { boolean[ ] dejavu = new boolean[sommet.length]; return dfs (x.num, y.num, dejavu); Liste dfs (int d, int f, boolean[ ] dejavu) { dejavu[d] = true; if (d == f) return new Liste (d, null); for (Liste ls = sommet[d].; ls!= null; ls = ls.suivant) { int x = ls.val; if (!dejavu[x] ) { Liste r = dfs (x, f, dejavu); if (r!= null) return new Liste (d, r); return null; Question 8 void retournerlesarcsde (Liste ls) { for (int x = -1; ls!= null; ls = ls.suivant) { int y = ls.val; if (x >= 0) { supprimerarc (x, y); ajouterarc (y, x); x = y;

Question 9 void calculerresultat ( f) { for (Liste ls = f. ; ls!= null; ls = ls.suivant) { int x = ls.val; int y = sommet[x]..val; sommet[y].afaire = (Tache) sommet[x]; Question 10 void fordfulkerson(debut d, f) { Liste ls; while ((ls = chemin(d, f))!= null) retournerlesarcsde (ls); calculerresultat (f); À chaque étape, on trouve un chemin de d vers f ; ce chemin passe une seule fois par f, donc contient un arc d extrémité f et aucun arc d origine f. Par suite, à chaque execution de chemin puis retournerlesarcsde, le nombre d arcs d extrémité f décroît d une unité. Comme initialement le nombre d arcs d extrémité f vaut k, en au plus k étapes, on peut garantir qu il n y a plus d arcs d extrémité f, donc a fortiori plus de chemin de d à f. On effectue donc O(k) appels à chemin, qui est de complexité O(n + k), et O(k) appels à retournerlesarcsde. Cette dernière méthode parcourt les listes de esseurs des sommets du chemin. Dans ces parcours, un arc est rencontré au plus une fois, donc la complexité est dominée par le nombre d arcs du graphe, soit O(nk). Enfin, calculerresultat a un coût proportionnel au nombre d arcs issus de fin, soit au plus O(k). La complexité totale est donc O(nk 2 ) (le terme principal est celui provenant de retournerlesarcsde), que l on peut ramener à O(nk min(n, k)) en remarquant que le même argument de décroissance s applique aux arcs sortant de d. Question 11 void afficherresultat() { for (int i = 0; i < sommet.length; ++i) { Sommet s = sommet[i]; if (s.estemploye()) System.out.println (s); La correction et l optimisation des algorithmes de flots dans les graphes sont étudiées dans le cours «Conception des Algorithmes et Optimisation» de la majeure 2 d Informatique.