360 likes | 625 Views
Le tri C’est quoi ? À quoi ça sert ?. David Rivreau http://ima.uco.fr. Le tri, c’est quoi ?. Trier consiste à ranger des éléments comparables dans un certain ordre (croissant ou décroissant) Illustration (tableau d’entiers) :. Le tri, à quoi ça sert ?.
E N D
Le triC’est quoi ? À quoi ça sert ? David Rivreau http://ima.uco.fr
Le tri, c’est quoi ? Trier consiste à ranger des éléments comparables dans un certain ordre (croissant ou décroissant) Illustration (tableau d’entiers) :
Le tri, à quoi ça sert ? Le tri informatique à de nombreuses applications : • Tri des courriels (ancienneté, expéditeur…) • Tri des résultats d’un moteur de recherche • Tri d’un tableau Excel • Tri des facettes pour l’affichage dans les jeux 3D • Analyse de données massives… Certaines études estiment que le temps CPU consacré à trier des données est de l’ordre de 25%...
Déroulement de la séance Examen d’un problème concret Mise en place d’un algorithme de tri Expérimentation
Cas d’application (1) Vous gérez une société qui fait de la prestation dans le cadre du Cloud Computing et plus précisément vous offrez des espaces de stockage de données délocalisées (Data as a service). Vos clients sont essentiellement des organisations gouvernementales qui vous confient des archives nécessitant une haute sécurité et une haute disponibilité d’accès. Vous êtes chargé de la proposition commerciale et devez trouver une configuration qui répond au besoin à moindre coût.
Cas d’application (2) Les principales données du problème sont : • L’ensemblede données à stocker regroupées par paquets de tailles prédéfinies • Un ensemble d’espace de stockage de capacités données avec un coût d’utilisation fixe pour chaque espace Vous devez définir quelle taille et quel nombre d’espaces de stockage à utiliser sachant que : • Un ensemble de données ne peut être partagé sur deux stockages • Tous les espaces de stockage utilisés doivent être identiques
Exemple (1) On a un ensemble de 24 ensembles de données : Deux options possibles • Allouer des espaces de 800 To pour 180 k€/an • Allouer des espaces de 210 To pour 60 k€/an Taille des ensembles (en To)
Exemple (2) Remarque • La somme des tailles des ensembles fait 1019 To : si on adopte la première solution, il faudra au moins 2 espaces de 800 To pour 360 k€/an Conséquence • Il est plus économique de choisir l’option 2 s’il est possible de répartir les ensembles sur moins de 5 espaces de stockage de 210 To pour 300 k€/an
Identification du problème Notre problème de stockage est un problème de bin-packing Bin-Packing 1D • Donnée • n objets de poids • un ensemble de boîtes de capacité B • Objectif • Répartir les objets en un nombre minimal de boîtes sans excéder la capacité des boîtes
Applications pratiques (source wikipedia) Pour la version classique en une dimension : • rangement de fichiers sur un support informatique • découpe de câbles • remplissage de camions avec comme seule contrainte le poids Pour la version en deux dimensions : • découpe de matière première • placement de boîtes sur une palette Pour la version en trois dimensions : • rangement d'objets dans des boîtes, un entrepôt, etc...
Nombre de solutions Peut-on examiner Toutes les solutions possibles et choisir la meilleure ? • Algorithme naïf : • on génère Toutes les partitions d’objets • on rejette les partitions qui ne vérifient pas la capacité • on choisit une partition à nombre minimal d’ensemble • Nombre de partitions (nombre de Bell ) • Suite : 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, ….
Nombre de Bell Par exemple : 9.30740105 × 106538 Impossible d’énumérer toutes les solutions possibles en temps raisonnable…
Méthode heuristique First-fit decreasing (FFD) • On trie la liste d'articles par ordre décroissant de taille • On range chaque article dans l'ordre de la liste • L'article courant est placé dans la première boîte qui peut le contenir
Retour sur l’exemple 41 41 Ensemble 10 : 41To 62 112 90 47 86 57 81 56 Ensemble 9 : 41To Espace disponible Ensemble 1 : 112 To Ensemble 5 : 62 To Ensemble 3 : 86 To Ensemble 6 : 57 To Ensemble 2 : 90 To Ensemble 4 : 81 To Ensemble 7 : 56 To Ensemble 8 : 47To On peut tout stocker sur 5 espaces 210 To : c’est la solution la plus économique 112 90 98 To 210 To 8 To 86 81 41 210 To 124 To 43 To 2 To 17 10 12 22 15 2 To 41 To 56 To 29 To 19 To 62 57 56 210 To 148 To 91 To 35 To 33 38 23 24 32 29 29 27 84 To 19 To 101 To 181 To 47 78 To 35 41 125 To 152 To 51 To 122 To 210 To 163 To 0 To 210 To
Performance L’algorithmeFirst Fit Decreasingn'utilise jamais plus de 11/9 OPT + 1 boîtes (où OPT est le nombre de boîtes dans une solution optimale)
Mise en place de l’algorithme de résolution (1) Données en entrée : • Tableau de n tailles d’ensemble : dataSize • Capacité commune des espaces de stockage : storageCapacity Données en sortie • Tableau d’affectation des ensembles aux espaces de stockage : storageAssignment • Tableau des capacités résiduelles des espaces de stockage : storageRemainder • Nombre d’espaces utilisés : nbStorage
Mise en place de l’algorithme de résolution (2) Illustration : • dataSize = [25, 22, 10, 8, 7, 4], storageCapacity = 40 Solution : Données en sortie : • storageAssignment = • storageRemainder= • nbStorage = Stockage n°0 25 10 4 Stockage n°1 22 8 7 [ ?, ?, ?, ?, ?, ?] [ 0, ?, ?, ?, ?, ?] [ 0, 1, ?, ?, ?, ?] [ 0, 1, 0, ?, ?, ?] [ 0, 1, 0, 0, 1, ?] [ 0, 1, 0, 0, 1, 0] [ 0, 1, 0, 1, ?, ?] [ 0, 1, 0, 0, 1, 0] [15, 18, 40, 40, 40, 40] [5, 10, 40, 40, 40, 40] [15, 40, 40, 40, 40, 40] [5, 18, 40, 40, 40, 40] [5, 3, 40, 40, 40, 40] [1, 3, 40, 40, 40, 40] [1, 3, 40, 40, 40, 40] [40, 40, 40, 40, 40, 40] 2 2 2 1 0
Format des données en entrées Nos jeux de données seront fournis sous forme de texte (directement dans le programme ou dans des fichiers) au format suivant : storageCapacity nbData dataSize Pour l’exemple précédent, on aura : 40 6 25 22 10 8 7 4
Programmation sous Eclipse Nous allons programmer notre algorithme en Java Téléchargez le fichier BinPacking.zip situé sous Documents/Activité Tri de l’espace http://lms.uco.fr/chamilo/courses/BISON Lancez Eclipse, et importez le projet via le menu Import -> ExistingProjectsintoWorkspace -> Select archive file
Contenu du programme On trouve 4 sous-algorithmes dans la classe : • checkSolution : qui permet de vérifier une solution • displaySolution : qui permet d’afficher une solution • nextStorage : qui construit une solution naïve affectant chaque ensemble de données dans un espace de stockage différent • firstFit : que vous devez écrire de façon à traduire l’heuristique first fit que nous avons décrite La méthode main permet de tester les deux jeux de données qui ont servi d’exemple dans les transparents
A vous de jouer ! Vous devez écrire en Java votre algorithme dans firstFit Pour vérifier que votre algorithme est correct, lancez le programme en effectuant Run (via le menu ou Ctrl+F11) Vous devez avoir dans la fenêtre console :
Algorithme de tri Jusqu’à présent, nous avons fourni à notre algorithme un tableau préalablement trié « manuellement » Bien évidemment, ce tri manuel n’est possible que pour des petits tableaux Dans cette deuxième partie, nous nous proposons de définir un algorithme de tri
Mise en place d’une stratégie de tri Par groupe de deux, récupérez les carrés de papier et disposez les dans le désordre : Définissez ensemble une stratégie pour trier les carrés en ordre croissant : Restituez la stratégie retenue en français de façon non ambiguë. 13 2 65 62 5 31 42 7 5 19 2 5 5 7 13 19 31 42 62 65
Traduction en algorithme On se place désormais dans le cas d’un tableau contenant des entiers tirés au hasard et dont il faut réordonner les valeurs en ordre croissant. Donner l’algorithme qui correspond à votre stratégie.
Identification de l’algorithme En toute probabilité, vous avez dû définir une stratégie relativement classique (proche d’un algorithme connu). En utilisant l’applet xSortLab du site http://www.kosbie.net/cmu/fall-08/15-100/handouts/xSortLab.html, essayez d’identifier le nom d’usage de votre algorithme. Vous pouvez aussi tenter votre chance avec cette vidéo ou celle-ci.
Programmation de l’algorithme Téléchargez la classe Sorting.java située sous Documents/Activité Tri de l’espace http://lms.uco.fr/chamilo/courses/BISON Glissez-déposez la classe dans le package demo : Complétez le code de sort avec la traduction de votre algorithme
Exécution du tri et performance Exécutez votre code Si tout va bien, vous avez un message du type : Le tableau est correctement trié Temps d'exécution : 1117ms. Les algorithmes de tri ont des performances très variables. Pour s’en convaincre, vous pouvez visiter le site illustratif http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/sortcontest/sortcontest.htm
Intégration du tri Remplacez la donnée 2 par une version non triée dans BinPacking : // donnée exemple numéro 2 non trié String data2 = "210 " + "24 " + "32 41 56 12 10 47 35 17 15 29 112 62 24 33 81 57 22 90 23 27 86 41 38 29"; Ajoutez le tri en ordre décroissant juste avant l’appel à firstFit: // on trie en ordre croissant dataSize Sorting.sort(dataSize); // on inverse l'ordre for (int i = 0; i < nbData / 2; i++) { inttmp = dataSize[i]; dataSize[i] = dataSize[nbData - 1 - i]; dataSize[nbData- 1 - i] = tmp; } L’exécution du programme doit produire le même résultat
Fichier Le dossier dat du projet Eclipse contient des données de grande taille Vous pouvez tester ces fichiers en procédant comme indiqué à côté :
Illustration de bin packing 3D Le site ci-dessous permet d’examiner un problème de packing 3D de façon très visuelle : http://www.3dbinpacking.com/
La Recherche Opérationnelle Le bin-packing est un problème classique d’optimisation (recherche opérationnelle). Les 4e années de l’IMA ont réalisé une vidéo pour présenter cette discipline en cours de communication http://vimeo.com/moogaloop.swf?clip_id=56378574
Algorithmes de tri Des transparents de Jorge Mendoza sur les algorithmes de tri sont disponibles dans l’outil Documents/Activité Tri de l’espace http://lms.uco.fr/chamilo/courses/BISON