WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Optimisation heuristique du problème d'entreposage d'objets en trois dimensions.

( Télécharger le fichier original )
par Mulindwa Chirac RUHAMYA
Universite adventiste de Lukanga - Licence 2012
  

Disponible en mode multipage

UNIVERSITE ADVENTISTE DE LUKANGA

(UNILUK)

B.P. 180

BUTEMBO, NORD-KIVU

REPUBLIQUE DEMOCRATIQUE DU CONGO

FACULTE DES SCIENCES ECONOMIQUES ET DE GESTION

DEPARTEMENT DE GESTION INFORMATIQUE

OPTIMISATION HEURISTIQUE DU PROBLEME
D'ENTREPOSAGE D'OBJETS EN TROIS
DIMENSIONS

par :

RUHAMYA MULINDWA Chirac

Mémoire présenté et défendu en vue de l'obtention du grade de Licencié en Sciences économiques et de gestion

Option : Gestion Informatique Directeur : Dr. Osée M. MASIVI

Année académique : 2012/2013

i

Epigraphe

`' Souvent le monde de l'industrie préfère une réponse approximative mais rapide et
efficace plutôt qu'une réponse parfaite »

Anonyme

`' La connaissance commence par la tension entre savoir et non-savoir : -pas de
problème sans savoir -pas de problème sans non-savoir »

Popper, 1979

`' Les ordinateurs sont comme les dieux de l'Ancien Testament : avec beaucoup de règles, et sans pitié `'

Joseph Campbell

ii

DEDICACE

A mes chers parents ;

A toute ma Famille proche ;

A tous ceux qui m'ont soutenu et témoigné leur amour ;

Chirac RUHAMYA MULINDWA

REMERCIEMENTS

Personne ne peut tout faire seul. Sans le concours de bien de gens de bonne foi, nous ne serions pas là où nous sommes aujourd'hui. De ce fait, nous serons ingrat de finir ce modeste travail sans remercier tout effort autre que le nôtre à avoir concouru à la réussite de ce mémoire.

Je tiens tout d'abord à remercier Mr. le Docteur Osée MUHINDO MASIVI. Je le remercie pour l'intérêt qu'il a porté à mon travail, pour toutes ces discussions scientifiques et autres, qui m'ont permis d'avancer dans mes travaux, qui m'ont fait réfléchir et qui m'ont inspiré. Je voudrais encore le remercier infiniment pour avoir accepté d'être le directeur de ce travail de recherche.

Toute ma gratitude s'adresse à la famille RUHAMYA car c'est grâce à son soutient, sa patience et son amour que je suis là aujourd'hui. Je n'oublierais pas tous mes oncles, frères, soeurs, neveux et cousins pour les sacrifices qu'ils ont pu faire pendant mes longues années d'études et d'absence.

Aux camarades étudiants, compagnons de lutte avec qui nous avons partagé peines et joies, nous disons également merci pour l'ambiance chaleureuse de travail qu'ils maintiennent au quotidien.

Ce travail ne serait pas ce qu'il est sans la présence, la générosité, l'enthousiasme et les précieux conseils de tous mes amis dont je ne pourrais lister les noms qui m'ont toujours encouragés, soutenus et permis de travailler dans les meilleures conditions.

iii

Chirac RUHAMYA MULINDWA

iv

SIGLES ET ABBREVIATIONS

1D : Une dimension

2D : Deux dimensions

3D : Trois dimensions

3DBPP : 3D Bin Packing Problem

HI-BHA : Human Intelligence Based on a Heuristic Approach

IDE : Integrated Development Environment

LAFF : Largest Area First-Fit

NP : Non Determinist Polynomial

NP-C : Non Determinist Polynomial Complete

OUT : Output File

SI : Système d'information

v

TABLE DES MATIERES

Epigraphe i

DEDICACE ii

REMERCIEMENTS iii

SIGLES ET ABBREVIATIONS iv

TABLE DES MATIERES v

LISTE DES FIGURES vii

LISTE DES TABLEAUX vii

RESUME viii

ABSTRACT ix

INTRODUCTION GENERALE 1

0. Problématique de recherche 1

1. But et Objectif de recherche 3

2. Choix et intérêt du travail 4

3. Délimitation du sujet 4

4. Méthodes et technique de recherche 5

5. Subdivision du travail 5

Chapitre premier : REVUE DE LA LITTERATURE 7

I.1. Optimisation 7

I.2. Entrepôt et Entreposage 12

I.3. Les objets 12

I.3.1. Objet en une dimension 13

I.3.2. Objet en deux dimensions 13

I.3.3. Objet en trois dimensions 13

I.4. Quelques travaux de recherche étudiés 14

I.5. Conclusion partielle 16

Chapitre deuxième : METHODOLOGIE DU TRAVAIL 17

II.1.Methode Algorithmique 17

vi

II.1.1. Problèmes algorithmiques 17

II.1.2. Classes de Complexité 18

II.2. Le Prototypage 20

II.3. L'Expérimentation 20

II.4. L'Argumentation 21

Chapitre Troisième : APPROCHES METHODOLOGIQUES 22

III.1. Modélisation algorithmique du problème de 3DBP 22

III.1.1. Formulation du problème 22

III.1.2. Méthodes exactes 24

III.1.3. Méthodes approximatives (heuristiques) 26

Chapitre Quatrième : PROTOTYPAGE, EXPERIMENTATION ET ARGUMENTATION

DES RESULTATS 42

VI.1. Prototypage 42

VI.1.1. Les fonctions du programme 42

IV.1.2. Formulaire d'entrées des données 45

IV.1.3. Les rapports 46

IV.2. Expérimentation et Argumentation 49

IV.2.1. Environnement de travail 49

IV.2.2. Données de test 50

IV.2.3. Résultat de l'algorithme HI-BHA 50

IV.2.4. Argumentation sur les résultats de l'algorithme HI-BHA 51

IV.3. DIFFICULTES RENCONTREES 52

CONCLUSION 53

BIBLIOGRAPHIE 55

ANNEXES 56

vii

LISTE DES FIGURES

Figure 1 : exemple d'un objet en une dimension 13

Figure 2 : exemple d'un objet en deux dimensions 13

Figure 3 : exemple d'un objet en trois dimensions 14

Figure 4 : Dimensions d'articles commerciaux qui nous intéressent. 23

Figure 5 : Ordinogramme de l'algorithme HI-BHA 32

Figure 6 : Première méthode de placement des boîtes avec LAFF 38

Figure 7 : seconde méthode de placement des boîtes avec LAFF 39

Figure 8 : solution possible avec LAFF 40

Figure 9 : Paramètres de la fonction FindBox() 43

Figure 10 : Fichier des variables entrantes 45

Figure 11 : Fenêtre console avant exécution du programme 46

Figure 12 : Fenêtre après exécution du programme 47

Figure 13 : fichier `'Rapport de la meilleure solution du programme`' 48

Figure 14 : Fichier des variables entrantes de l'interface graphique du programme 49

LISTE DES TABLEAUX

Tableau 1 : Liste des champs dans le `'BoxList[] Array `' 28

Tableau 2 : Liste de champs dans le `'Layers[] Array `'. 29

Tableau 3 : Création du tableau BOXLIST[] 32

Tableau 4 : Création du tableau Layers[] 34

Tableau 5 : les fonctions de l'algorithme HI-BHA 42

Tableau 6 : Résultat du test de l'algorithme HI-BHA 51

RESUME

L'obtention d'une grande surface pour l'entreposage des produits est un facteur très important pour les entreprises. De nos jours, la plus part d'entreprises commerciales et industrielles dispose des espaces de stockage qui valent la peine d'être utilisé avec délicatesse. Dans ce travail nous traitons le problème de maximisation de l'utilisation d'espaces de stockage tridimensionnels par les articles en trois dimensions. Nous faisons allusion dans ce travail aux entrepôts et articles possédant chacun une longueur, une largeur et une hauteur. L'objectif est d'utiliser de la meilleure façon possible l'espace de stockage disponible.

Ce problème étant du type NP-C, nous avons utilisé un heuristique pour le résoudre vu que l'algorithme exacte exigerait plus de ressources temporelles. Pour résoudre ce problème, nous avons utilisé l'algorithme `'Human Intelligence Based on Heuristic Approach`', ce modèle nous a permis de trouver une réponse près de l'optimum en temps raisonnable. Nous avons ensuite implémenté cet algorithme en langage C. Le test et l'argumentation des résultats nous ont permis de vérifier notre objectif que nous avons jugé atteint.

viii

Mots clés : 3D Bin packing, Heuristiques, optimisation combinatoire, Entreposage.

ix

ABSTRACT

Getting more space for storage of products is a very important factor for the companies. Nowadays, more commercial and industrial companies have spaces for storage of goods that are to be used tactfully. This study addresses the problem of maximization of the three dimensional storage spaces of three dimensions sized goods. This study considers length, width and height of each article. The objective is to maximize used volume and minimize wasted space.

In order to resolve this problem a heuristic method is applied, since the exact algorithm would require more temporal resources. The "Human Intelligence Based on Heuristic Approach" algorithm is applied. This model lead to an answer close to the optimum in reasonable time. Then the algorithm is implemented in C language. The test and argumentations of results permitted to verify objective set for the study.

Keywords: 3D Bin packing problem, Heuristics, combinatorial optimization, storage

INTRODUCTION GENERALE

0. Problématique de recherche

`' On assiste aujourd'hui à l'émergence d'une nouvelle économie dite de l'information ou « Nouvelle économie », où le travail en rapport avec l'information est devenu plus important que le travail en rapport avec les autres secteurs. Ceci sous-entend donc la mise en place d'un système représentant l'ensemble des ressources (les hommes, le matériel, les logiciels) utilisées pour collecter, stocker, traiter et communiquer les informations au sein de l'entreprise : « Le système d'information (SI) » de l'entreprise `' (Sanni, 2009). Les Systèmes d'information peuvent mettre en jeu le succès et même la survie de l'entreprise, par conséquent une gestion saine des systèmes d'information constitue un défi pour les dirigeants. A nos jours, La croissance d'une entreprise passe forcément par un grand volume d'activités et donc une grande quantité d'informations à gérer et dont il faudra tirer le meilleur parti pour prendre les bonnes décisions.

L'entreposage des marchandises est une des principales tâches du commerce et de l'industrie. Afin qu'ils comprennent toutes les connexions du flux des marchandises, les commerçants ainsi que les industriels doivent disposer des connaissances de base à tous les niveaux, même si les différentes activités sont exécutées par des spécialistes. En effet, les différentes compagnies et entreprises fournissent de grands efforts dans le but de détecter des possibilités de réduction des coûts associés aux entreposages de tous les produits (Matières première, produits semi-ouvrés et

2

produits finis). C'est dans cette optique qu'une optimisation d'entreposage d'articles tridimensionnels dans des aires de stockage permettra sûrement aux entreprises tant commerciales qu'industrielles de réduire au maximum les coûts liés au stockage des produits (coûts de l'entrepôt ou de l'espace, coût des marchandises, coûts des machines et autres instruments de travail utilisés,...), ce qui engendra une amélioration de profits pour enfin rester flexible et compétitive sur un marché ouvert.

En effet, la minimisation d'espaces d'entreposage peut induire à la réduction des coûts liés aux investissements en espace de stockage, à l'amortissement pour la dépréciation des espaces de stockage, aux primes d'assurances des entrepôts, à l'approvisionnement et entretien des équipements, à la réduction des temps morts ou mouvements inutiles durant le processus de déchargement, de stockage et des chargement des entrepôts et à l'organisation du rangement des marchandises reçues. En effet, pour être compétitif, les entreprises doivent baisser au maximum l'ensemble des coûts liés à ses services.

Apparemment le problème d'optimisation d'entreposage d'articles que nous tentons de modéliser fait partie de la classe des problèmes NP-Difficile, il nous semble que c'est un problème qui ne peut donc pas être résolu à l'aide d'un algorithme de complexité polynomiale. En effet, ce problème peut être rattaché au problème classique de remplissage de panier appelé communément problème de Bin packing. Ce problème relève de la recherche opérationnelle et de l'optimisation combinatoire. Il s'agit en fait de trouver le rangement le plus économique possible pour un ensemble d'articles dans des boîtes. Le problème classique se définit en une dimension.

De ce fait, le travail se base sur les interrogations suivantes :

3

- Existe-t-il les algorithmes exactes et les heuristique pouvant être utilisés pour : assurer un meilleur entreposage de marchandises, minimiser les retards et augmenter les capacités de stockage des entrepôts ?

- Et, quel est l'algorithme le plus effectif en termes de complexité temporelle et spatiale pour résoudre notre problème ?

Toutes ces questions se posent au niveau des différentes activités s'exerçant dans des entreprises disposant des locaux d'entreposage, et constituent des objectifs soucieux des théoriciens, praticiens et également les responsables de la gestion de stock.

1. But et Objectif de recherche

Notre but dans la réalisation de ce travail de recherche est de répondre à la question posée ci-haut dans notre problématique, c'est-à-dire, de trouver une ou plusieurs méthode capable de modéliser et résoudre le problème lié à l'optimisation d'objets tridimensionnels dans des aires de stockage le plus effectivement possible. A la fin de ce travail nous devons aussi mettre en place un logiciel informatique d'entreposage d'objets en 3 dimensions.

Vu notre hypothèse de croire que le problème qui nous intéresse ici est une variante du problème de bin packing en trois dimensions, notre objectif principal est de : trouver l'algorithme le plus effectif au problème d'entreposage d'objet en 3 dimensions et capable de fournir des solutions réalisables de qualité acceptable, proches de l'optimal et déterminées en un temps raisonnable (complexité polynomiale).

En tant qu'objectifs spécifiques, nous tenterons de :

- Lister un ou plusieurs algorithmes exactes pour les problèmes de même nature que le nôtre ;

4

- Trouver et analyser les heuristiques capables de résoudre notre problème en temps raisonnable ;

- Après que nous aurons jugé ces algorithmes optimaux, nous pourront traduire un de ces algorithmes en logiciel d'application pouvant représenter une potentialité d'amélioration intéressante.

2. Choix et intérêt du travail

Toute entreprise aspire à l'amélioration de sa trésorerie pour diverses raisons dont l'augmentation de sa capacité d'autofinancement. En vue d'aider nos entreprises nous avons jugé faire ce qui est à nos pouvoir pour contribuer à l'atteinte de cet objectif ; et c'est ainsi que nous avons eu l'idée de mettre à la disposition de tout responsable de la gestion des stocks cet outils qui pourra leur permettre de réduire les difficultés qu'ils rencontrent face au rangement des articles dans des entrepôts et la maximisation des espaces à utiliser.

Le choix de ce sujet a été motivé par notre souci de guider les prises de décisions des entreprises congolaises en particulier, et ceux de partout ailleurs en générale, quant à l'utilisation efficace des ressources toujours limitées qu'ont les entreprises, en vue d'accroître leurs niveaux d'activité.

3. Délimitation du sujet

Le monde de recherche étant assez vaste, nous limiterons ce travail à la gestion optimum des espaces de stockage des articles en trois dimensions dans des entrepôts afin d'en maximiser l'usage. Nous nous contenterons donc d'étudier et appliquer quelques heuristiques du problème classique de bin packing (remplissage de panier) en trois dimensions.

5

4. Méthodes et technique de recherche

Aktouf, (1992) a dit que toute recherche doit en principe aboutir à modéliser ce qu'elle a pris comme objet d'étude. Le principe directeur qui peut y mener, c'est ce qu'il est convenu d'appeler méthode. La méthode se définit donc, comme étant la procédure logique d'une science ; c'est-à-dire l'ensemble de pratiques particulières mises en oeuvre pour que le cheminement de ses démonstrations et de ses théorisations soit clair, évident et irréfutable. Les techniques quant à elles sont des moyens précis pour atteindre un résultat partiel, à un niveau et à un moment donné de la recherche. Elles ne sont que des outils mis à la disposition du chercheur et organisées par la méthode dans un but précis. Elles ne peuvent donc qu'être momentanées, conjoncturelles et limitées dans le cheminement de la recherche. La technique représente ces différentes phases d'opérations limitées, liées à des éléments pratiques concrets, adaptés à un but défini, alors que la méthode est une conception intellectuelle coordonnant un ensemble d'opération, en général plusieurs techniques.

Comme méthode, nous utiliserons la méthode algorithmique, ce qui nous permettra d'analyser notre problème et de transformer les entrées (valeurs entrées par l'utilisateur) en sorties (résultats). Les techniques documentaires nous aiderons à récupérer la plupart des documentations sur l'internet et dans des documents (livres, notes des cours, mémoires,...) pour nous permettre d'aboutir à nos objectifs.

5. Subdivision du travail

Cette recherche suit une progression ordonnée. Ce travail se décompose en effet en quatre chapitres mis à part cette introduction et la conclusion qui viendra plus tard acheminer notre démarche scientifique. Il s'agit de la revue de la littérature, la méthodologie du travail, les approches méthodologiques et la présentation et

6

discussion des résultats constitué du prototypage, des tests et de l'argumentation des résultats.

Chapitre premier : REVUE DE LA LITTERATURE

Des nombreux chercheurs avant nous se sont intéressés au domaine d'optimisation combinatoire, plus particulièrement dans la conception des logiciels d'optimisation de la coupe et entreposages des articles. Plusieurs méthodes ont été utilisées pour résoudre ce problème. Cette revue de littérature nous permettra de situer notre sujet par rapport à des recherches antérieures afin d'établir un créneau unique pour notre recherche. En plus de ça, cette partie sera pour nous, une occasion de fournir les informations de fond en ce qui concerne notre sujet pour comprendre les termes clés qui constituent notre thème.

I.1. Optimisation

D'après le petit Larousse (1980), l'optimisation c'est l'action de donner à un investissement, une entreprise ou une machine un rendement maximale. Selon Microsoft Encarta (2008), l'optimisation est une action de réguler (quelque chose) dans le but d'obtenir la plus grande efficacité possible.

Pour Nzalamingi (2012), l'optimisation est une branche des mathématiques, cherchant à analyser et à résoudre analytiquement ou numériquement les problèmes qui consistent à déterminer le meilleur élément d'un ensemble en fonction d'un critère quantitatif donné. Aujourd'hui, nombreux des systèmes susceptibles d'être décrits par un modèle mathématique sont optimisés. Ils sont extrêmement variés : optimisation d'un trajet, de la forme d'un objet, d'un prix de vente, d'une réaction chimique, du contrôle aérien, du rendement d'un appareil, du fonctionnement d'un moteur, de la

8

gestion des lignes ferroviaires, du choix des investissements économiques, de la construction d'un navire jusqu'à l'optimisation des espaces de stockage et de la coupe de matériel. L'optimisation de ces systèmes permet de trouver une configuration idéale, d'obtenir un gain d'effort, de temps, d'argent, d'énergie, de matière première, de satisfaction, des rebus ou encore d'espaces. Très loin de constituer une liste exhaustive, ces quelques exemples attestent la variété des formulations et préfigurent la diversité des outils mathématiques susceptibles de résoudre ces problèmes.

En termes simples et pratiques, l'optimisation des processus consiste à améliorer les procédures d'usage et les manières de réaliser les tâches de manière à atteindre une productivité maximale l'entreprise. Cette optimisation vise donc à minimiser les couts et contraintes restreignant la productivité et à maximiser les gains favorisant l'efficacité. Pour ce qui concerne ce travail les contraintes sont constituées des places inutilisables dans les dépôts alors que les gains sont constitués des place ou case bien utilisées aux entrepôts.

La qualité des résultats et des prédictions du système optimisé dépendent de la pertinence du modèle, de l'efficacité de l'algorithme et des moyens pour le traitement numérique. Et ce travail est concerné par le modèle et l'algorithme du système de découpage et entreposage d'article.

D'après Nzalamingi (2012), les modèles d'optimisation sont repartis en plusieurs classes dont nous pouvons relever :

- L'optimisation linéaire qui étudie le cas où la fonction objectif et les contraintes caractérisant l'ensemble de possibilités sont linéaires. C'est une méthode très employée pour établir les programmes des raffineries pétrolières, mais aussi pour

9

déterminer la composition la plus rentable d'un mélange salé, sous contraintes, à partir des prix de marché du moment.

- L'optimisation linéaire en nombres entiers étudie les problèmes d'optimisation linéaire dans lesquels certaines ou toutes les variables sont contraintes de prendre des valeurs entières.

- L'optimisation quadratique étudie le cas où la fonction objectif est une forme quadratique (avec contraintes linéaires)

- L'optimisation non linéaire étudie le cas général dans lequel l'objectif ou les contraintes (ou les deux) contiennent des parties non linéaires, éventuellement non-convexes.

- L'optimisation stochastique étudie le cas dans lequel certaines des contraintes dépendent de variables aléatoires. En optimisation robuste, les aléas sont supposés être situés dans des intervalles autour de positions nominales et on cherche à optimiser le système soumis à de tels aléas, dans le pire des cas.

- L'optimisation combinatoire (optimisation discrète) consiste à trouver dans un ensemble discret un parmi les meilleurs sous-ensembles (ou solutions) réalisables, la notion de meilleure solution étant définie par une fonction objectif.

Comme lu dans Wikimedia Foundation (2013), l'optimisation combinatoire est en fait une branche de l'optimisation en mathématiques appliquées et en informatique, également liée à la recherche opérationnelle, l'algorithmique et la théorie de la complexité. On parle également d'optimisation discrète. Dans sa forme la plus générale, un problème d'optimisation combinatoire (on dit aussi d'optimisation discrète) consiste à trouver dans un ensemble discret un parmi les meilleurs sous-ensembles (ou solutions) réalisables, la notion de meilleure solution étant définie par une fonction objectif. Formellement, étant donnés :

10

- un ensemble discret N,

- une fonction d'ensemble f : 2N ? R, dite fonction objectif, et

- un ensemble R sous-ensembles de N, dont les éléments sont appelés les

solutions réalisables,

Un problème d'optimisation combinatoire consiste à déterminer

L'ensemble des solutions réalisables ne saurait être décrit par une liste exhaustive car la difficulté réside ici précisément dans le fait que le nombre des solutions réalisables rend son énumération impossible, ou bien qu'il est NP-complet de dire s'il en existe ou non. La description de R est donc implicite, il s'agit en général de la

liste, relativement courte, des propriétés des solutions réalisables. La plupart du temps on est dans les cas particuliers suivants :

- et R = X n Z nX R n et la cardinalité de R est

exponentielle en n,

- R = conv (n) n Z n donc les propriétés de R se traduisent en contraintes linéaires,

c'est-à-dire que X est un polyèdre de R n,

-

 

L' Optimisation combinatoire consiste à trouver le meilleur entre un nombre fini de choix. Autrement dit, minimiser une fonction, avec contraintes, sur un ensemble fini. Quand le nombre de choix est exponentiel (par rapport à la taille du problème), mais que les choix et les contraintes sont bien structurées, des méthodes mathématiques doivent et peuvent intervenir, comme dans le cas " continu ", pour permettre de trouver la solution en temps polynomial (par rapport à la taille du problème). Le travail de l'équipe consiste à développer des algorithmes polynomiaux

11

et des théorèmes sur des structures discrètes qui permettent de résoudre ces problèmes.

Trouver une solution optimale dans un ensemble discret et fini est un problème facile en théorie : il suffit d'essayer toutes les solutions, et de comparer leurs qualités pour voir la meilleure. Cependant, en pratique, l'énumération de toutes les solutions peut prendre trop de temps ; or, le temps de recherche de la solution optimale est un facteur très important et c'est à cause de lui que les problèmes d'optimisation combinatoire sont réputés si difficiles. La théorie de la complexité donne des outils pour mesurer ce temps de recherche. De plus, comme l'ensemble des solutions réalisables est défini de manière implicite, il est aussi parfois très difficile de trouver ne serait-ce qu'une solution réalisable.

Quelques problèmes d'optimisation combinatoire peuvent être résolus (de manière exacte) en temps polynomial par exemple par un algorithme glouton, un algorithme de programmation dynamique ou en montrant que le problème peut être formulé comme un problème d'optimisation linéaire en variables réelles.

Dans la plupart des cas, le problème est NP-difficile et, pour le résoudre, il faut faire appel à des algorithmes de branch and bound, à l'optimisation linéaire en nombres entiers ou encore à la programmation par contraintes. En pratique, on se contente très souvent d'avoir une solution approchée, obtenue par une heuristique ou une métaheuristique. Pour certains problèmes, on peut prouver une garantie de performance, c'est-à-dire que l'écart entre la solution obtenue et la solution optimale est borné. Chacune de ces méthodes sera exploitée d'avantage dans le deuxième chapitre de notre travail.

12

I.2. Entrepôt et Entreposage

`' Un entrepôt est un bâtiment logistique destiné au stockage de biens en vue de leur expédition vers un client (interne ou externe à l'entreprise). Il peut être détenu et géré en propre par l'entreprise ou faire l'objet d'une sous-traitance auprès d'un prestataire logistique `' (Wikimedia Foundation, 2013).

La nature des biens entreposables dépend de l'activité de l'entreprise, on trouvera : - activités de production :

? matières premières, encours de production, produits semi-finis destinés à la régulation du processus de production (de l'entreprise ou de son client : cas des entrepôts avancés fournisseurs dans l'automobile par exemple)

? emballages

? mais aussi produits finis destinés au processus commercial...

- activités commerciales et de négoce :

? produits dont l'entreprise a fait l'acquisition et qui ne subiront aucune transformation en vue de leur vente

? pièces de rechanges en cas d'activité après-vente.

L'entreposage est une étape très importante dans la chaine logistique. L'entreposage est le fait d'entreposer (donc de stocker et d'emmagasiner) des marchandises, des matières premières et des produits en très grande quantité. Afin de faciliter les opérations de manutention des marchandises, on trouvera fréquemment dans les entrepôt les engins de manutention suivants : transpalettes, chariots élévateurs, gerbeurs, préparateurs de commande, nacelles, diables,...

I.3. Les objets

Dans notre travail, nous considérons comme objets les articles qui constituent le stock dont nous optimiserons l'espace.

13

I.3.1. Objet en une dimension

Un objet en une dimension (1D), c'est un objet ne comprenant que la dimension de la longueur.

Longueur

Figure 1 : exemple d'un objet en une dimension

I.3.2. Objet en deux dimensions

On dit qu'un objet est en deux dimensions (2D) lorsqu'il ne comportant que les dimensions de la longueur et de la largeur.

Largeur

Longueur

Figure 2 : exemple d'un objet en deux dimensions

I.3.3. Objet en trois dimensions

Trois dimensions (3D), se dit de tout objet ou espace possédant une longueur, une largeur et une épaisseur, tout en sachant que la largeur peut aussi être appelée profondeur et l'épaisseur est aussi désigné par la hauteur. Ce sont ces objets qui nous intéressent dans ce travail.

14

Figure 3 : exemple d'un objet en trois dimensions

I.4. Quelques travaux de recherche étudiés

Dans cette section nous passeront en revue les mémoires, thèses et logiciels déjà proposés pour résoudre le problème d'optimisation d'aires d'entreposage des articles en différentes dimensions pour enfin apporter quelque chose d'originale à notre recherche.

Nzalamingi (2012), dans son travail intitulé "Optimisation de la coupe et entreposage en une et deux dimensions" est parvenu à de trouver un modèle mathématique d'optimisation du découpage et d'emmagasinage d'objets en une et deux dimensions pour les entreprises. Il a finalement traduit ce modelé mathématique en algorithme et mis en oeuvre un logiciel informatique pouvant être exploité pour la productivité des entreprises tant industrielles que commerciales en général et des Ets Tsang en particulier.

Gazdar (2009), a lui dans sa thèse d' "Optimisation Heuristique Distribuée du Problème de Stockage de Conteneurs dans un Port" étudié dans un contexte bien déterminé et selon les motivations et les enjeux qu'elle a défini, le modèle COSAH (COntainer Stacking via multi-Agent approach and Heuristic method), ce qui lui a permis d'optimiser le placement des conteneurs dans la zone de stockage (statique ou

15

dynamique selon les départs ou les arrivées de navires ou camions ou de conteneurs en import ou en export) en minimisant le nombre de mouvements improductifs respectant un nombre de contraintes spatio-temporelles et tenant compte de plusieurs paramètres pouvant catégoriser les conteneurs et définir une certaine priorité entre eux (destination, taille, date de départ, horizon des arrivées des barges ou navires associés).

Perrot (2005), dans sa thèse intitulée "Integer programming column generation strategies for the cutting stock problem and its variants", s'est intéressé au problème de découpe unidimensionnel où elle a présenté une formulation pour la minimisation du nombre de plans de découpe distincts jusqu'à ce que le déchet soit fixé à sa valeur optimale. Son objectif est principalement de réduire au minimum la perte correspondant à la partie inutilisée des rouleaux. Elle a proposé une solution donnée par un ensemble de plans de découpe réalisables, c'est à dire des façons de couper les petites pièces sur les rouleaux, de sorte que leur production totale couvre les demandes.

Le logiciel 3D Load Packer (2011), est l'optimiseur de l'espace conçu par Nikita Yurchenko pour aider à planifier rapidement et facilement le meilleur arrangement compact d'un certain nombre de différentes tailles d'objets 3D rectangulaire (dénommé "Boxes") dans une ou plusieurs enceintes rectangulaires (dénommé "conteneurs"). 3DLoad Parker peut être utilisé pour optimiser la charge multi-produit des plans pour tous les contenants rectangulaires (camions, remorques, wagons, palettes et caisses).

VitragePro (2007) est un logiciel d'optimisation de découpe de vitrage, développé par Patrice Rozet. Il est destiné aux vitriers, miroitiers et à tous les professionnels qui doivent régulièrement effectuer des découpes de vitrages. Il vous permet de générer

16

aisément et rapidement les plans de découpe. Il réalise en effet les plans de découpe en prenant en compte plusieurs matériaux d'épaisseurs différentes.

CubeMaster (2012) est une application destinée au monde de la logistique et de la supply chain. C'est une solution logicielle permettant de réduire les coûts et d'optimiser le chargement des camions, containers et autres contenants.

I.5. Conclusion partielle

Nous n'avons pas touché tous les travaux spécifiquement liés au nôtre. Mais, d'après ces quelques exemples, il est sied de noter que notre travail n'est pas le premier à aborder le problème d'optimisation d'espaces. Tous ces travaux répondent au problème d'optimisation d'entreposage mais dont les contextes d'utilisation et les conditions de stockage ne sont pas forcément les mêmes ni adaptées à celles que nous abordons dans le présent travail.

Chapitre deuxième : METHODOLOGIE DU TRAVAIL

Ce chapitre de notre travail nous permettra de donner une présentation générale des différentes méthodes que nous aurons à utiliser pour trouver solution à l'énoncé théorique de notre problème. Les concepts qui nous intéresserons dans ce chapitre sont : la méthode algorithmique, le prototypage, l'expérimentation et l'argumentation.

II.1.Methode Algorithmique

Un algorithme répond à un problème. Il est composé d'un ensemble d'étapes simples nécessaires à la résolution d'un problème, dont le nombre varie en fonction du nombre d'éléments à traiter. D'autre part, plusieurs algorithmes peuvent répondre à un même problème. Pour savoir quelle méthode est plus efficace il faut les comparer. Pour cela, on utilise une mesure que l'on appelle la complexité. Elle représente le nombre d'étapes qui seront nécessaires pour résoudre le problème pour une entrée de taille donnée.

II.1.1. Problèmes algorithmiques

Un problème algorithmique est un problème posé de façon mathématique, c'est-à-dire qu'il est énoncé rigoureusement dans le langage des mathématiques. On distingue deux types de problèmes :

- Les problèmes de décision : ils posent une question dont la réponse est oui ou non ;

18

- Les problèmes d'optimisation : ils comportent une question ou plutôt une injonction de la forme « trouver un élément tel que ...» dont la réponse consiste à fournir un tel élément.

La théorie de la complexité étudie principalement (mais pas uniquement) les problèmes de décisions. Dans ce travail le type de problème dont nous aurons à traiter est celui d'optimisation.

II.1.2. Classes de Complexité

La théorie de la complexité est un domaine des mathématiques, et plus précisément de l'informatique théorique, qui étudie formellement la quantité de ressources (en temps et en espace) nécessaire pour la résolution de problèmes au moyen de l'exécution d'un algorithme. Il s'agit donc d'étudier la difficulté intrinsèque de problèmes posés mathématiquement.

Les classes de complexité sont des ensembles de problèmes qui ont la même complexité selon un certain critère. Dans ce qui suit nous allons définir trois classes de complexité les plus étudiées en une liste qui va de la complexité la plus basse à la complexité la plus haute : la classe P, la classe NP et la classe NP-C.

a. La classe P

Un problème de décision est dans P s'il peut être décidé sur une machine déterministe en temps polynomial par rapport à la taille de la donnée. On qualifie

alors le problème de polynomial. C'est un problème de complexité O(nk), pour un certain k. On admet, en général, que les problèmes dans P sont ceux qui sont faciles à

résoudre.

b. La classe NP

La classe NP possède une définition moins naturelle que celle de P, et ne signifie pas "non polynomial", mais polynomial non-déterministe. La classe NP est donc une

19

extension de la classe P, en autorisant des choix non déterministes pendant l'exécution de l'algorithme. Si le modèle de calcul est celui des machines de Turing, on autorise plusieurs transitions à partir d'un état et d'un symbole lu sur la bande.

c. La classe NP-Complet

En théorie de la complexité, un problème NP-complet est un problème vérifiant les propriétés suivantes :

- Il est possible de vérifier une solution efficacement (en temps polynomial) ; la classe des problèmes vérifiant cette propriété est notée NP.

- Tous les problèmes de la classe NP se ramènent à celui-ci via une réduction polynomiale ; cela signifie que le problème est au moins aussi difficile que tous les autres problèmes de la classe NP.

Un problème NP-difficile est un problème qui remplit la seconde condition, et donc peut être dans une classe de problème plus large et donc plus difficile que la classe NP.

Bien qu'on puisse vérifier rapidement toute solution proposée d'un problème NP-complet, on ne sait pas en trouver efficacement. C'est le cas, par exemple, du problème du voyageur de commerce, celui du sac à dos ou encore celui de remplissage des paniers.

Une question reste ouverte et fait partie des problèmes non résolus en mathématiques les plus importants à ce jour. Celui de prouver s'il existe un algorithme polynomial pour résoudre un quelconque des problèmes NP-complets, si oui, alors tous les problèmes de la classe NP peuvent être résolus en temps polynomial. Trouver un algorithme polynomial pour un problème NP-complet ou prouver qu'il n'en existe pas permettrait de savoir si P = NP ou P ? NP.

20

En pratique, les informaticiens et les développeurs sont souvent confrontés à des problèmes NP-complets, ce qui est d'ailleurs le cas pour nous dans ce travail. Savoir que le problème sur lequel on travaille est NP-complet est une indication du fait que le problème est difficile à résoudre, donc qu'il vaut mieux chercher des solutions approchées en utilisant des algorithmes d'approximation ou des heuristiques pour trouver des solutions approximatives.

II.2. Le Prototypage

Même si la construction des programmes est au centre de l'informatique, il est surprenant que la programmation en elle seule ne constitue pas de recherche scientifique. Il y a après tout, des milliers de programmeurs qui, quelle que soit la haute technicité de leur travaux, écrivent des programmes sans nécessairement être des chercheurs.

Le prototypage des programmes est écrit à la fin d'une recherche en informatique pour démontrer que le modèle produit dans la recherche peut être implémenté dans un langage de programmation. Ainsi, les prototypes servent de véhicule d'expérimentation et leur construction fournit des nouveaux aperçus sur le modèle prototypé (Masivi, 2013).

II.3. L'Expérimentation

L'idée derrière la méthode expérimentale en informatique est de tester la modèle

et d'en noter les effets. L'expérimentation peut donc avoir pour objectif :

- Chercher à trouver quelque chose d'intéressant : expérimentation exploratoire ;

- Tester une théorie ou un modèle : expérimentation de test ;

- Prouver une théorie ou un modèle : expérimentation de preuve.

En ce qui nous concerne, seule l'expérimentation de test nous sera utile car elle

nous permettra de tester le modèle que allons analyser au troisième chapitre.

21

II.4. L'Argumentation

Selon Masivi (2013), l'argumentation est généralement utilisée quand deux ou plusieurs alternatives sont comparées. L'objectif est donc de présenter certains arguments permettant le choix d'une solution en dépend de l'autre. Cette argumentation peut être présentée des faits évidents ou un raisonnement relevant et combinant des issues subtiles. Dans notre travail, nous utiliserons l'argumentation, si et seulement si on aura à utiliser deux ou plusieurs algorithmes de résolution d'un problème d'optimisation d'un espace de stockage.

Chapitre Troisième : APPROCHES METHODOLOGIQUES

Dans ce travail nous traitons un problème d'optimisation combinatoire appliqué au problème concret d'entreposage d'objets 3D dans un espace de stockage. De ce fait, nous aurons besoin d'au moins un algorithme pouvant nous permettre d'atteindre notre objectif, celui d'utiliser de la meilleure façon possible l'espace de stockage disponible.

Ce chapitre est consacré à la représentation et l'analyse des algorithmes pouvant résoudre le problème de 3DBP. De prime à bord, nous avons procédé à la présentation des algorithmes qui ont constitués notre objet de recherche, nous avons commencé par la présentation d'un algorithme exacte du problème de remplissage de paniers puis les algorithmes d'approximations qui nous ont permis de résoudre ce problème en donnant une solution acceptable en un temps convenable.

III.1. Modélisation algorithmique du problème de 3DBP

III.1.1. Formulation du problème

Le problème de 3D bin packing relève de la recherche opérationnelle et de l'optimisation combinatoire. Il s'agit de trouver le rangement le plus économique possible pour un ensemble d'articles dans des boîtes. Le problème classique se définit en une dimension, mais il existe de nombreuses variantes en deux ou trois dimensions.

Le problème de chargement d'entrepôts que nous tentons de modéliser est une variante du problème en trois dimensions. En fait, dans ce travail nous ne faisons

23

allusion qu'aux articles possédant chacun une largeur, une longueur (ou profondeur) et une hauteur c'est de là d'ailleurs que vient de concept 3D (figure 4).

Figure 4 : Dimensions d'articles commerciaux qui nous intéressent.

Dans le problème classique, les données sont : Un nombre infini de paniers de taille C

Une liste 1,2,.......,n d'objets i de taille ci

On cherche à trouver le rangement valide pour tous ces objets de façon à minimiser le nombre de paniers à utiliser. Pour qu'un rangement soit valide, la

somme des tailles des objets affectés à un panier doit être inférieure ou égale à C.

Pour décrire une solution, on peut utiliser un codage binaire pour indiquer dans quel panier un objet est rangé.

La variable vaudra si l'article est rangé dans le panier , et sinon.

La variable binaire est égale à si la boîte est utilisée, sinon.
On cherche donc à minimiser le nombre de panier :

Sous les contraintes suivantes :

24

Source : Wikimedia Foundation (2013).

La première inégalité signifie qu'on ne peut dépasser la taille d'un panier pour un

rangement. À noter que la partie droite de l'inégalité oblige à prendre la valeur

dès qu'un article est rangé dans le panier . La deuxième inégalité impose à chaque objet d'être rangés dans une boîte et une seule. Toute solution pour laquelle la famille d'équations précédente est vérifiée est dite réalisable. (Kantorovitch, 1960).

Le problème de bin packing a été largement étudié dans la communauté de recherche opérationnelle. Il existe des heuristiques très efficaces pour le résoudre, et des méthodes exactes utilisant l'optimisation linéaire en nombre entiers, la formulation de Kantorovich, une résolution par génération de colonnes, la procédure par séparation et évaluation,... Les méthodes exactes permettent d'obtenir la solution optimale à chaque fois, mais le temps de calcul peut être long si le problème est compliqué à résoudre. Les méthodes approchées, encore appelées heuristiques, permettent d'obtenir rapidement une solution approchée, donc pas nécessairement optimale. Nous n'allons pas vraiment parler de toutes ces méthodes car ce qui nous intéresse dans ce travail c'est plutôt trouver une heuristique qui donne une solution acceptable en un temps convenable.

III.1.2. Méthodes exactes

Le problème de chargement d'entrepôt que nous tentons de modéliser dans ce chapitre est en fait rattachable au problème de 3D bin packing, une extension au problème de remplissage de sacs, ce qui explique son NP complétude.

25

Tous les algorithmes exactes connus pour résoudre des problèmes NP-complets ont un temps d'exécution exponentiel en la taille des données d'entrée dans le pire cas, ils sont donc inexploitables en pratique car bien qu'ils résolvent les problèmes NP-C en donnant des réponses exactes, ils sont couteux en terme de temps d'exécution.

L'algorithme exact consiste à essayer toutes les combinaisons d'objets et choisir celle qui minimise le nombre de panier. Il faut d'abord deviner toutes les solutions réalisables puis vérifier chaque alternative. On parle alors d'un divin et d'un vérificateur, le divin propose un certificat, c'est-à-dire, une réponse probable ou encore un candidat-réponse et le vérificateur teste si le certificat remplit les conditions d'être une réponse.

En ce qui nous concerne ici, l'algorithme exact est donc celui dont le divin fournit plusieurs ensembles d'articles (caisses ou boîtes) provenant d'une liste de plusieurs articles. Il essaie toutes les combinaisons possibles, chaque ensemble constitue un candidat-réponse à la question de savoir quel ensemble d'articles maximise l'utilisation de l'entrepôt. Le vérificateur vérifie si chaque ensemble remplit les contraintes en se posant les questions ci-après :

- Dans un ensemble d'articles ni existe-t-il un article dont la hauteur (hi), la largeur (li) ou la profondeur (pi) est supérieur à la hauteur (H), la largeur (L) ou la profondeur (P) de l'entrepôt ? Tout en sachant que l'objet peut être roté et donc, on considère comme hi, li ou pi finale, sa valeur après dernière rotation.

- Est-ce que la taille (volume) d'un ensemble d'articles (ni) dépasse la taille de l'espace de stockage ?

26

Tout en sachant que l'objectif est de minimiser l'espace non utilisé, c'est-à-dire la différence entre le volume de l'espace de stockage et le volume de toutes les boîtes chargées.

Cette solution donne une réponse exacte mais malheureusement il est couteux. Pour pallier à ce problème lié au temps d'exécution, il existe les algorithmes d'approximation. Ceux-ci qui permettent de résoudre un problème NP-complet en donnant une solution presque optimale en temps polynomial.

III.1.3. Méthodes approximatives (heuristiques)

Les algorithmes d'approximations sont utilisés pour réduire la complexité des problèmes de classe NP-Hard.

Comme nous l'avons déjà dit dans notre introduction, nous présentons dans ce travail quelques algorithmes d'approximation que nous allons ensuite implémenter dans un langage de programmation et les soumettre à une expérimentation pour trouver le plus performant en terme de temps d'exécution et d'espace de l'entrepôt utilisé. Notre objectif est donc de répertorier quelques algorithmes existants pour le problème de 3D Bin packing et trouver le plus performant.

Dans cette section nous allons présenter 2 algorithmes de 3D Bin packing : l'algorithme HI-BHA (A Human Intelligence-Based Heuristic Approach) proposé par (Baltacioglu, 2002) et le LAFF (Largest Area First-Fit) développé par (Gürbüz, Akyokuþ, Emiroðlu, & Güran, 2009).

27

1. A Human Intelligence Based Heuristic Approach

Le problème de 3DBP est toujours résolu en utilisant les algorithmes optimums et les méthodes heuristiques. Voici une méthode heuristique parmi plusieurs qui essaie de résoudre le problème en un temps polynomiale.

Cette approche a été qualifiée d'une approche basée sur l'intelligence humaine par son auteur du fait qu'elle simule l'intelligence humaine en chargeant les boîtes dans l'entrepôt comme un humain, de bas à haut et en construisant des couches.

Ce modèle utilise un outil puissant de l'heuristique et une structure de données dynamique qui lui permet d'imiter l'intelligence humaine. L'avantage de cet algorithme est qu'il est capable de charger l'article dans n'importe quelle orientation, tout en sachant qu'un article peut être roté de six manières différentes. Cette approche est basée sur la construction des couches ou murs. L'idée est qu'après la création d'une couche, avant qu'une boîte soit chargée dans la couche, l'algorithme analyse toutes les boîtes non chargées pour trouver celle qui conviendra le mieux au sein de la couche selon son épaisseur (hauteur) pour minimiser l'espace perdu. Cependant, l'épaisseur de la couche sélectionnée est flexible et peut augmenter pour s'adapter à la hauteur de la boîte sélectionnée.

Variables entrantes (inputs)

Les premières variables entrants sont les coordonnées x, y et z qui représentent les dimensions de l'espace de stockage. Les informations suivantes représentent les caractéristiques des boîtes à entreposer. Dans chaque ligne le premier élément représente l'étiquette de la boîte contenant les articles, ces étiquettes n'ont aucun effet sur l'algorithme, ce n'est qu'une façon d'identifier chaque boîte, elles sont facultatives, le deuxième, troisième et quatrième élément correspondent respectivement aux coordonnées x, y et z de chaque boîte. Le cinquième élément

28

représente le nombre de boîte de même type, c'est-à-dire le nombre de boîtes ayant la même largeur (x), la même hauteur (y) et la même profondeur (z).

Structuration des données

La structure de données est un critère assez important dans un programme, elle affecte de manière directe le résultat de la solution d'un algorithme que ce soit en terme de temps d'exécution ou en terme d'espace utilisé.

Cet algorithme utilise deux tableaux : la premier tableau est celui de la liste des boîtes dénommé `'BoxList[] Array`', il sert à garder toutes les dimensions, les coordonnées et d'autres informations nécessaires relatives aux boîtes dans une liste. Il a au total douze champs :

Tableau 1 : Liste des champs dans le `'BoxList[] Array `'

Noms du champs Descriptions

Packst L'état du chargement {0:Non chargé, 1:Chargé)

N Nombre de boîtes identiques

Dim1 La taille d'une des trois dimensions

Dim2 La taille d'une autre dimension parmi les trois

Dim3 La taille d'une autre dimension parmi les trois

Cox La coordonnée x de l'emplacement de la boîte chargée

Coy La coordonnée y de l'emplacement de la boîte chargé

Coz La coordonnée z de l'emplacement de la boîte chargé

Packx La dimension x de la boîte après rotation

Packy La dimension y de la boîte après rotation

Packz La dimension z de la boîte après rotation

Vol Le volume de la boîte (Dim1*Dim2*Dim3)

Cet algorithme stocke aussi le volume de chaque boîte, ainsi on n'a pas besoin de le recalculer à chaque instant qu'on en a besoin. Les champs 6 à 11 n'ont pas de sens si le premier (Packst) a comme valeur 0, ils deviennent importants une fois qu'on a chargé la première boîte et Packst devient égal à 1. Chaque boîte constitue une ligne d'enregistrement dans le tableau `'BoxList[] `'.

29

Un autre tableau est le `'Layers[]`'. Ce tableau stocke les différentes tailles de toutes les dimensions des boîtes. Chaque champ dénommé Layerdim représente l'épaisseur d'une couche créée au sein de l'espace de stockage. Avant le commencement de chaque boucle (itération), les différentes valeurs des dimensions des boîtes sont stockées dans ce tableau. Le deuxième champ de ce tableau est le Layereval, la valeur de ce champ est calculée par la fonction Listcanditlayers que nous allons expliquer plus tard dans le quatrième chapitre de ce travail. Voici donc les deux champs du tableau Layereval :

Tableau 2 : Liste de champs dans le `'Layers[] Array `'.

Noms Descriptions

Layerdim La valeur d'une dimension

Layereval Evaluation de la valeur correspondante du Layerdim

Contraintes de l'algorithme

Les limites de l'algorithme HI-BHA sont d'après le concepteur dues à la capacité

moyenne de mémoires des ordinateurs et à l'ampleur du problème réel de

chargement d'entrepôt. Voici donc les limites à ne pas franchir :

Nombre maximal de boîtes dans un ensemble de boîtes : 5000

Nombre total des boîtes ayant des caractéristiques différentes : 1000

Tous les nombres doivent être en entier.

Ordinogramme

Ceci est une représentation graphique de l'enchainement des opérations de ce qui

constituera le fruit de l'implémentation de l'algorithme HI-BHA (le programme

proprement dit). Il nous permet donc d'analyser notre problème.

Avant l'exécution de l'algorithme, on doit s'assurer du respect des critères ci-

après :

30

- Chaque espace de stockage doit posséder une largeur et une profondeur et une hauteur bien finie ;

- Chaque boîte à entreposer doit aussi avoir une largeur, une profondeur et une hauteur ;

- Toutes les boîtes peuvent être rotée et placée dans n'importe quel angle dans l'entrepôt ;

- Les boîtes peuvent se supporter les unes sur les autres sans créer des dommages.

31

Début

INITIALISATION

Entrées des variables

INPUT BOXLIST Lecture du fichier

Fichier des
variables
entrantes

Si variables Incorrectes

Non

Initialisation des variables

EXECITERATIONS

Essaie d'une orientation de la boîte

LISTCANDIDATETLAYERS Creation de Layers[]Array

QSORT
Trie du Layers[]

Prise en compte d'un enregistrement du Layers[] comme l'épaisseur (hauteur) de la couche

PACKLAYER(laverthickness)

PACKLAYER (space)

FINDLAYER(remainpy)
Trouve la couche ayant la

hauteur la plus convenable en
examinant les boîtes non

chargées.

Il y a un espace pour la
création d'une couche
dans la couche ?

OUI

PACKLAYER(space)

NON

NON

OUI

NON

OUI

Il y a un espace pour
le chargement d'une
boîte dans la
couche ?

Toutes les layers[]
sont déjà
utilisées ?

Il y a un espace
pour le chargement
d'une boîte dans
l'espace de
stockage ?

NON

OUI

OUI

NON

Toutes orientations
des boîtes ont déjà
été testées ?

Meilleur utilisation de l'espace de stockage garde l'orientation de la boîte et la hauteur de la couche

Msg : Les Données entrées incorrectes, veuillez entrer les vraies valeurs

Saisie de `O'

Fichier du rapport de la meilleure solution

FIN

32

Figure 5 : Ordinogramme de l'algorithme HI-BHA

Fonctionnement de l'algorithme HI-BHA

Nous allons expliquer dans ce point le fonctionnement et l'obtention des valeurs de différents champs des tableaux détaillés un peu plus haut dans ce troisième chapitre, il s'agit de `'BoxList[]» et de `'Layers[]». Ceci en nous basant d'un exemple typique.

Exemple : soit un entrepôt de 104 dm de long, 96 dm de haut et 84 dm de profondeur. On décide de ranger 9 caisses dans cet entrepôt dont 4 de dimensions (70, 104, 84), 2 de dimensions (14, 104, 48) et 3 de dimensions (40, 52, 36). BOXLIST[]Array

Tableau 3 : Création du tableau BOXLIST[]

Taille de l'entrepôt : XX=104 ; YY=96 ; ZZ=84

Boxlist[x]

Packst

N

Dim1

Dim2

Dim3

Cox

Coy

Coz

Packx

Packy

Packz

Vol

Boxlist[1]

0

4

70

104

24

0

0

0

0

0

0

174720

Boxlist[2]

0

4

70

104

24

0

0

0

0

0

0

174720

Boxlist[3]

0

4

70

104

24

0

0

0

0

0

0

174720

Boxlist[4]

0

4

70

104

24

0

0

0

0

0

0

174720

Boxlist[5]

0

2

14

104

48

0

0

0

0

0

0

69888

Boxlist[6]

0

2

14

104

48

0

0

0

0

0

0

69888

Boxlist[7]

0

3

40

52

36

0

0

0

0

0

0

74880

Boxlist[8]

0

3

40

52

36

0

0

0

0

0

0

74880

Boxlist[9]

0

3

40

52

36

0

0

0

0

0

0

74880

33

Après avoir entrée les variables entrantes, le modèle détermine les hauteurs des couches et les entre dans un tableau, le `'Layers[]». Ce tableau contient une dimension de chaque boîte moins la dimension y de l'espace de stockage. Le tableau LAYERS[] est créé après l'examen de chaque orientation des boîtes.

Avec le même exemple, voyons maintenant comment obtenir les valeurs des champs dans le tableau Layers[].

XX=104 ; YY=96 ; ZZ=84

Layers[x]=(Layerdim, Layereval)

Layers[X]=(Layerdim, Layereval)

Abs(70-70) + Abs(70-70) + Abs(70-70) + Abs(70-48) + Abs(70-48) + Abs(70-52) +

Abs(70-52) + Abs(70-52) = 98

Layers[l]=(70, 98)

Abs(24-24) + Abs(24-24) + Abs(24-24) + Abs(24-14) + Abs(24-14) + Abs(24-36) +

Abs(24-36) + Abs(24-36) = 56

Layers[2]=(24, 56)

Abs(14-24) + Abs(14-24) + Abs(14-24) + Abs(14-24) + Abs(14-14) + Abs(14-40) +

Abs(14-40) + Abs(14-40) = 106

Layers[3]=(14,106)

Abs(48-70) + Abs(48-70) + Abs(48-70) + Abs(48-70) + Abs(48-48) + Abs(48-40) +

Abs(48-40) + Abs(48-40) = 100

Layers[4]=(48,100)

Abs(40-24) + Abs(40-24) + Abs(40-24) + Abs(40-24) + Abs(40-48) + Abs(40-48) +

Abs(40-40) + Abs(40-40) = 80

Layers[5]=(40, 80)

Abs(52-70) + Abs(52-70) + Abs(52-70) + Abs(52-70) + Abs(52-48) + Abs(52-48) +

Abs(52-52) + Abs(52-52) = 80

Layers[6]=(52, 80)

Abs(36-24) + Abs(36-24) + Abs(36-24) + Abs(36-24) + Abs(36-48) + Abs(36-48) +

Abs(36-36) + Abs(36-36) = 72

Layers[7]=(36, 72)

34

Normalement il y aurait 8 valeurs au total, mais comme la dimension y de certaines boîtes est supérieure à celle de l'espace de stockage, on ne peut pas évaluer ça comme une hauteur de la couche.

Après l'obtention des valeurs du Layer[], on les trie dans l'ordre croissant d'après chaque Layereval.

Tableau 4 : Création du tableau Layers[]

Layers[X]=(Layerdim, Layereval) Layer[1]=(24, 56) Layer[2]=(36, 72) Layer[3]=(52, 80) Layer[4]=(40, 80) Layer[5]=(70, 98) Layer[6]=(48, 100) Layer[7]=(14, 106)

Comme la plus petite Layereval peut être la hauteur la plus convenable pour une couche, trier la liste de ces champs selon l'ordre croissant est un facteur important dans le but de réduire le temps d'exécution d'une solution, spécialement lorsqu'on veut charger un nombre élevé de boîte de différentes tailles.

Complexité de l'algorithme HI-BHA

Les itérations de cet algorithme sont liées aux six orientations possibles que peut prendre une boîte. Pendant les itérations, les boîtes sont d'abord chargées dans toutes les six orientations. Chaque orientation de la boîte est considérée comme une solution de chargement. Evidemment si toutes les trois dimensions d'une boîte sont identiques, c'est-à-dire si la boîte est carrée, il n'y a qu'une seule orientation possible. Généralement on a soit un, deux ou six orientations respectivement pour un, deux ou trois dimensions différentes. Dans chaque itération, chaque orientation de la boîte est chargé une fois dans chaque champs du tableau `'Layers[]».

Ainsi, comme dans notre exemple, nous avons sept différentes dimensions dans notre tableau `'Layers[]`' et que toutes nos boîtes on trois dimensions uniques,

35

l'algorithme va effectuer 6*7=42 itérations. Ainsi, le temps d'exécution de cet algorithme dépend du type de boîte (celles avec une dimension, deux dimensions ou trois dimensions) et du nombre total des boîtes à charger. Le nombre de boîtes identiques (celle avec les mêmes dimensions) n'affecte pas directement le temps d'exécution de cet algorithme.

Maintenant, nous pouvons déterminer la complexité de l'algorithme HI-BHA. Supposons que nous avons n boîtes dans un ensemble de boîtes et d, la valeur des dimensions de toutes les boîtes. Dans le pire de cas, le temps d'exécution sera :

1'(t)=6 n d P(t) ; (1)

Où P(t) est le temps utilisé pour trouver et ranger chaque boîte.

P(t)=6 n E(t) ; (2)

Où E(t) est le temps utilisé pour examiner l'orientation d'une boîte. E(t) dépend

d'un ordinateur à un autre.

Ainsi, dans le pire de cas, la complexité de cet algorithme est :

1'(t)=36 n2 d E(t).

Ainsi, la complexité de cet algorithme est Ø(nk) avec comme k une constante et toujours égale à 2.

2. Largest Area First-Fit

Dans cette section de notre travail, nous présentons un autre algorithme heuristique que nous n'allons pas implémenter suite au temps qui nous est insuffisant mais dont les résultats seront comparés au premier. Le LAFF algorithme résout lui aussi le 3DBPP en un temps polynomial. Nous allons présenter cet algorithme en définissant de prime à bord les variables entrantes et sortantes. Cet algorithme est

36

appelé LAFF minimizing heigth. Il place les boîtes à une plus grande surface en minimisant la hauteur du container.

Variables entrantes (inputs)

La première variable à entrer est le nombre de boîtes de taille différentes noté N. La deuxième entrée c'est les dimensions de chaque type des boites de tailles différentes. Nous notons cela par quatre paramètres (an, bn, cn, kn) où an est la largeur, bn est la profondeur, cn est la hauteur et kn, le nombre de boîtes pour une dimension donnée.

Comme vous pouvez le voir sur une boîte, chaque dimension peut être considérée en largeur, en hauteur ou profondeur. Si vous prenez bn comme la largeur, les autres dimensions c'est-à-dire an et cn peuvent être acceptés comme hauteur ou profondeur. Parce que, la boîte est tridimensionnelle et elle peut être roté et peut être envisagé en des perspectives différentes. La liste suivante montre les paramètres à entrer proposés par l'algorithme :

Nombre des boîtes de tailles différentes : : N

Largeur de la boîte : : an

Profondeur de la boîte : : bn

Hauteur de la boîte : : cn

Nombre de boîte par dimension : : kn

Variables sortantes (outputs)

Après l'exécution de l'algorithme LAFF, le programme doit produire les outputs ci-après :

O1: Le volume de l'espace

O2: L'espace utilisé (Le volume de toutes les boîtes déjà placées)

O3: L'espace non utilisé

37

O4: Le temps d'exécution (exprimée en millisecondes).

Fonctionnement de l'algorithme LAFF

Comme déjà signalé le problème de 3D bin packing est du genre NP-Complet, c'est-à-dire que la solution optimum pour ce problème ne peut être trouvée qu'après avoir essayé toutes les combinaisons possibles. C'est donc un problème difficile. Cependant, si le nombre de boîtes augmente au fur et à mesure, le nombre d'itérations augmentent aussi au point qu'il ne peut pas être résolu en temps polynomial même par l'ordinateur le plus rapide possible qui puisse exister à nos jours. Mais alors, avec quelques suppositions, ces genres de problèmes peuvent être résolus par des algorithmes heuristiques en un temps presque polynomial et fournir une solution près de l'optimum.

L'algorithme LAFF minimizing hieght proposé ci-dessus utilise une heuristique qui place la boîte dans le container en ne prenant pas en compte sa hauteur. Cet algorithme fonctionne de la manière ci-après :

De prime à bord, la largeur et la profondeur de l'espace de stockage doivent être déterminées. Ainsi, en donnant un ensemble de boîtes de tailles différentes, on calcule la profondeur et la largeur de l'espace de stockage et on trouve le plus long des deux bords des boîtes. La largeur et la profondeur de l'espace sont déterminées au début de l'algorithme et restent fixes jusqu'à la fin de son exécution. On suppose ici que la hauteur reste illimitée, elle augmente au fur et à mesure que l'algorithme s'exécute.

Etant ainsi, la largeur (ak) et la profondeur (bk) de l'espace sont trouvées en sélectionnant le premier et deuxième plus long bord des boîtes (ai, bi et ci). Le plus long est pris comme largeur (ak) et le deuxième comme profondeur (bk). Donc ak et bk ne changent jamais.

38

Après avoir déterminé les valeurs de la largeur et de la profondeur de l'espace de stockage, les boîtes peuvent être placées dans le contenant. Dans cet algorithme, deux méthodes de placement sont utilisés. Le premier est alloue un espace à chaque boîte entrante, ce qui augmente la hauteur du contenant. La deuxième méthode alloue un espace aux boîtes restantes s'il y a une boîte qui convient parfaitement dans l'espace encore disponible autour des boîtes déjà placées sans dépasser la hauteur de la boîte placé.

Dans la première méthode de placement, les boîtes ayant la plus grande surface sont déterminées, les boîtes sont sélectionnées pour essayer de trouver la boîte qui a la hauteur minimum dans toutes boîtes sélectionnées. Ainsi, la boîte ayant la hauteur minimum est placée dans le contenant. La plus grande boite sélectionnée doit être en parallèle avec le fond du contenant.

Figure 6 : Première méthode de placement des boîtes avec LAFF

Dans la seconde méthode, les objets sont placés dans un ordre et l'algorithme essaie d'allouer un espace aux boîtes restantes autour de la boîte déjà placée (selon la première méthode). Ainsi, pour les espaces restants autour de la boîte déjà placée comme le montre la figure 7, l'algorithme essaie de les remplir d'après la deuxième méthode de placement. Selon cette méthode, étant donné que les boîtes ont des

39

dimensions ai, bi et ci sur un niveau, l'espace de stockage aura deux espaces vides autour de la boîte déjà placé avec les dimensions ((ak-ai),bk,ci) et (ak,(bk-bi),ci). Donc s'il y a une boîte qui convient parfaitement dans l'espace non alloué, ça peut être une boîte ou plus, on place la boîte qui a le volume maximum à côté de la boîte comme le montre la figure 7. Cette répétition continue jusqu'à ce qu'il n'y ait aucune boîte qui convient dans l'espace vide.

Dans la deuxième méthode de placement, s'il n'y a pas d'espace autour de la boîte placée, alors l'algorithme continue d'après la première méthode.

Figure 7 : seconde méthode de placement des boîtes avec LAFF

A chaque fois qu'il y a des boîtes non encore placées, l'algorithme va à la première méthode de placement et ainsi de suite jusqu'à ce que toutes les boîtes soient placées. À la fin de l'algorithme, une solution possible comme le montre la figure 8 est produite.

40

Figure 8 : solution possible avec LAFF

Etapes de l'algorithme LAFF

Les principales étapes de l'algorithme LAFF sont résumées comme suit :

Etape 1 : Entrer les dimensions et nombres des boîtes

N : Nombre de boîtes uniques

Etape 2 : Déterminer la largeur (ak) et la profondeur (bk) de l'espace de stockage

ak : le bord le plus long de toutes les boîtes

bk : le deuxième bord long des boîtes

ck : 0 (zéro)

Etape 3 : choisir la boîte la plus volumineuse. S'il y en a beaucoup, choisir celle

ayant la plus petite hauteur. Placer cette boîte (ith) à l'endroit le plus large en

parallèle avec la base du contenant.

Etape 3.1 : Déterminer la hauteur de l'espace de stockage et décrémenter le nombre

de boîtes (ith).

ck=ck+ci

ki=ki-1

Etape 3.2 : si le nombre de boîte est égal à 0 alors terminer

41

Etape 3.3 : si l'espace (ak-ai)=0 et (bk-bi)=0 aller à l'étape 3. Par contre, choisir la boîte capable de remplir convenablement l'espace restant. S'il y a plus d'une boîte capable de convenir dans l'espace restant, choisir la boîte la plus volumineuse. Cette boîte est appelée jth.

Etape 3.3.1 : déterminer la dimension de l'espace.

as=max(ak-ai, ak-aj) and bs=bk-bi-bj

Etape 3.3.2 : Décrémenter le nombre des boîtes ith

kj=kj-1

Etape 3.3.3 : si le nombre des boîtes devient égal à 0 alors terminer. Sinon, aller à l'étape 3.3.

Complexité de l'algorithme LAFF

Si on considère n comme le nombre de toutes les boîtes à être placées dans l'espace de stockage et k comme le type de différentes boîtes de tailles différentes, la durée d'exécution pour le cas le pire de cette exécution est exprimé de la manière suivante :

T(n) = n (nk)

T(n) = kn2 où k est une constante.

Au final, la complexité de cet algorithme est O(n2).

Chapitre Quatrième : PROTOTYPAGE, EXPERIMENTATION
ET ARGUMENTATION DES RESULTATS

Ce chapitre sera pour nous une opportunité de présenter la traduction de l'algorithme HI-BHA dans le langage C, nous allons présenter les fonctions utilisées dans le programme et les fichiers des données. Cette partie de notre travail sera pour nous aussi une occasion de présenter le test de l'algorithme HI-BHA et l'argumentation du résultat, c'est-à-dire l'évaluation de celui-ci par rapport au LAFF algorithme.

VI.1. Prototypage

VI.1.1. Les fonctions du programme

Le prototype du programme comporte les fonctions suivantes :

Tableau 5 : les fonctions de l'algorithme HI-BHA

Nom de la Fonction Description

Packlayer Met à jours le `'Boxlist[]Array`' quand une boîte est rangée

Findsmallestz Détermine le vide ayant la valeur z le plus petite dans la courante

couche

Findbox Sert à trouver la boîte qui remplit le mieux le vide courant dans la
couche

Analyzebox Cette fonction est utilisée par la précédente pour analyser les
dimensions des boîtes

Checkfound Détermine quelle boîte charger d'après sa capacité à remplir le
vide

Execiterations Exécute les itérations en appelant les fonctions appropriées

Report Stocke la meilleure solution de chargement

Outputboxlist Ecrit les informations de la solution de chargement dans un fichier

Graphunpackedout Ecrit l'ordre de rangement des articles pour la visualisation

43

La fonction `'Findbox» analyse les boîtes non encore chargées en utilisant la fonction `'Analyzebox». Pour chaque orientation de la boîte non encore chargée, la fonction Analyzebox utilise les paramètres suivants :

Hmx : longueur maximum (dimension x) disponible pour le chargement

Hy : hauteur (dimension y) de la courante couche

Hmy : hauteur maximum (dimension y) disponible pour le chargement

Hz : profondeur (dimension z) de la courante couche pour le chargement
Hmz : profondeur maximum (dimension z) disponible pour le chargement

Dim1 : dimension x de la boîte à examiner après orientation

Dim2 : dimension y de la boîte à examiner après orientation Dim1 : dimension z de la boîte à examiner après orientation

X

Hmy

Z

Hy

Y

Hmx

Hmz

Figure 9 : Paramètres de la fonction FindBox()

La fonction AnalyzeBox cherche, par ordre de priorité, une boîte ayant une hauteur qui est proche de Hy mais pas supérieur à Hmy, une longueur proche mais pas supérieure à Hmx et une largeur proche de Hz mais pas supérieur à Hmz. Ceci

44

veut dire que cette fonction considère d'abord la hauteur (y dimension), donc, parmi les boîtes qui ont une même hauteur, elle vérifie les longueurs (x dimension) et finalement parmi les boîtes ayant la même longueur et la même hauteur, elle vérifie la profondeur (z dimension). Cette fonction calcule les différences entre le volume encore disponible dans la couche (c'est-à-dire le vide) et le volume de chaque boîte, à la fin, elle récupère la boîte qui génère une moindre différence pour un meilleure remplissage. Elle cherche aussi les boîtes ayant une y-dimension supérieure mais proche de la hauteur de la couche courante. Les boîtes qui conviennent, celle qui ont la hauteur appropriée sont chargées. Celles qui ne conviennent pas nécessitent, en effet, une autre considération.

Dans l'algorithme HI-BHA, une méthode appelée `'Layer-in-layer packing`' ceci pour dire chargement d'une couche dans une couche. Layer-in-Layer est une fonction qui crée une couche au sein d'une autre. Cette fonction permet de loger la boîte ayant la hauteur qui ne convient pas à la couche. Si aucune boîte de convient dans le vide, ce vide est considérée comme perdue.

Dans la fonction `'FindBox`', la hauteur de la couche est adaptée au y-dimension de la plus haute boîte. Quand la hauteur de la courante couche augmente, le total des incrémentations de la couche du début à la fin du chargement des boîtes dans cette couche est stocké dans la variable layerinlayer. A la fin du chargement des boites dans cette couche, si la variable layerinlayer est supérieure à zéro, un autre chargement dans la couche est entrepris. Quand, le Layer-in-layer packing`' est utilisé, le modèle utilise beaucoup de volume.

Après chaque chargement, le volume des boîtes chargées ainsi que le volume des boîtes non chargé sont calculés afin d'obtenir le taux d'utilisation de l'entrepôt et la

45

pourcentage du volume des boîtes chargées. La solution avec un meilleur taux d'utilisation est considérée comme la solution finale.

Après qu'on ait obtenu tous les paramètres de la meilleure solution, la fonction `'Report`' est appelée. Cette fonction ré exécute le chargement avec les paramètres de la meilleure solution trouvée et appelle la fonction `'Outputboxlist`' pour générer le rapport (fichier) et `'Graphunpackedout`' pour générer le fichier input de la visualisation. Les informations sur les boîtes non chargées sont affichées à la fin du rapport.

IV.1.2. Formulaire d'entrées des données

Avant de lancer le programme console codé en C, il faut s'assurer que toutes les informations concernant l'entrepôt et les articles (boîtes 3D) à entreposé sont déjà spécifiées par l'utilisateur dans un fichier texte (avec l'extension .txt). Ce fichier doit être enregistré dans le même répertoire que l'exécutable (fichier .exe).

Voici un exemple du formulaire d'entrée des données :

Figure 10 : Fichier des variables entrantes

paramètres x, y et z qui sont respectivement la longueur, la hauteur et la profondeur

La première ligne contient les informations sur l'entrepôt, elle comprend les

46

de l'entrepôt. L'ordre la succession de ces valeurs est d'une importance capitale. Toutes les lignes suivantes comportent les informations concernant les boîtes. Dans chaque ligne, la première valeur représente l'étiquette de la boîte, cette valeur n'a aucun effet sur l'algorithme. La deuxième, troisième et quatrième valeur sont les dimensions x, y et z de la boîte. Ces valeurs sont prises comme tel lorsque le programme aura jugé une orientation comme étant convenable. Le cinquième élément c'est le nombre de boîte de ce type. De toute façon, les virgules entre les chiffres ne sont pas obligatoires, même un simple espacement peut délimiter deux valeurs.

IV.1.3. Les rapports

Ce programme génère au total trois fenêtres. Le premier c'est le console, elle nous permet d'entrer le nom du fichier (.txt) à traiter.

Figure 11 : Fenêtre console avant exécution du programme

47

Figure 12 : Fenêtre après exécution du programme

La deuxième fenêtre contient le rapport de la meilleure solution et l'orientation de chaque boîte après chargement. A la fin de ce rapport, on trouve la liste de toutes les boîtes qui n'ont pas eu de place dans l'entrepôt. Ce rapport est du type .OUT, il peut être ouvert avec Mozilla firefox, google chrome, etc, il est créé après exécution du fichier des variables entrantes dans le même dossier que le fichier exécutable du programme et porte le même nom que le fichier d'entrées des variables. Il comporte toutes les informations nécessaires sur le chargement.

48

Figure 13 : fichier `'Rapport de la meilleure solution du programme`'

La troisième fenêtre est un fichier du type (.txt) qui est créée lui aussi après exécution d'un cas. Elle comporte les coordonnées et les orientations des boites chargées et celles de l'entrepôt. C'est ce qui fichier qui permet à l'interface graphique que nous n'avons pu créer d'avoir une vue 3D de la solution. Il comporte, en effet, toutes les variables entrantes dont le programme de l'interface graphique a besoin. Il est enregistré dans le même répertoire que le fichier exécutable et porte le nom du fichier d'entrée des données privé de la première initiale pour éviter le doublon.

49

Figure 14 : Fichier des variables entrantes de l'interface graphique du programme

IV.2. Expérimentation et Argumentation

L'informatique reste une science de l'ingénieur, ce qui signifie ici, que malgré toutes les études ou les critères théoriques permettant de comparer l'efficacité de deux algorithmes dans l'absolu, dans la pratique nous ne pourrons pas dire qu'il y a un meilleur algorithme pour résoudre tel type de problème. Une méthode pouvant être lente pour certaines configurations de données et dans une autre application qui travaille systématiquement sur une configuration de données favorables la méthode peut s'avérer être la "meilleure".

IV.2.1. Environnement de travail

L'efficacité d'un algorithme est directement liée au programme à implémenter sur un ordinateur. Le programme va s'exécuter en un temps fini et va mobiliser des ressources mémoires pendant son exécution; ces deux paramètres se dénomment complexité temporelle et complexité spatiale.

50

Le programme de résolution du problème d'optimisation d'entreposage des articles 3D a été conçu en utilisant le langage de programmation C. L'expérimentation a été effectuée sur une machine de configuration suivante :

- Type de processeur : Genuine Intel(R) CPU 1.83 GHZ

- Mémoire installée (RAM) : 2,00 Go

- Système d'exploitation : Windows 8 Consumer Preview 32 Bits

- Nous avons utilisé Cod::Blocks 8.02 comme environnement de développement

(IDE), nous l'avons trouvé idéal parce qu'il combine en lui seul l'éditeur de code, le compilateur et le débugger, il nous a permis d'écrire facilement le code source du programme (en C), de transformer ("compiler") notre code source en code binaire et de traquer les erreurs dans notre code.

IV.2.2. Données de test

Nous avons testé notre problème en utilisant douze ensembles différents d'articles. Nous avons pris ces ensembles aléatoirement, mais en respectant les limites numériques de l'algorithme et nous nous sommes arrangés de manière à ce que les boites à entreposer contiennent exactement dans l'espace de stockage pour mieux tester la performance de l'algorithme. Vous pouvez trouver en annexe 1, les détails sur chaque cas que nous avons testé comprenant la liste d'articles et les dimensions de l'entrepôt.

IV.2.3. Résultat de l'algorithme HI-BHA

Apres usage du logiciel issu de cette recherche les résultats suivants ont été observés des chacun des algorithmes (Tableau 6).

Vous pouvez trouver en annexe 1, les détails sur chaque cas que nous avons testé.

51

Tableau 6 : Résultat du test de l'algorithme HI-BHA

Ens. De boite Nbre

de boite

Nbre de
type de
boite

Nbre de
boites
chargées

Utilisation
de l'espace

(%)

Temps

d'exécution
(sec)

Ens. N° 1 307 5 291 89,46 1

Ens. N° 2 1728 5 1714 97,46 41

Ens. N° 3 637 11 591 92,40 13

Ens. N° 4 1493 21 1472 96,37 57

Ens. N° 5 86 7 82 91,59 0

Ens. N° 6 12 4 12 100 0

Ens. N° 7 39 15 35 84,47 0

Ens. N° 8 (pire des cas)

31 31 26 68,65 1

IV.2.4. Argumentation sur les résultats de l'algorithme HI-BHA

De ce tableau, nous constatons que cet algorithme donne des bons résultats par apport aux facteurs temps et espace utilisé. En effet, pour presque toutes les instances, les temps d'exécution de l'algorithme sont tous inférieurs à une minute, et les pourcentages de l'espace utilisé sont généralement supérieurs à 85%, sauf pour le pire de cas où, la performance de l'algorithme baisse mais reste acceptable. Donc, Plus le nombre de types de boîtes augmente, plus la performance de l'algorithme diminue et son temps d'exécution augmente. Nous avons jeté un coup d'oeil sur les résultats de l'algorithme LAFF et avons constaté que les deux algorithmes semblent identiques au point de vue temps d'exécution et espace utilisé, ce qui est normal vu leurs complexités qui sont toutes d'ordre n2. Mais alors, un autre paramètre comme le non pris en charge de la hauteur de l'espace d'entreposage nous pousse à opter pour l'algorithme HI-BHA vu que les entrepôts dont nous faisons allusion dans ce travail sont tous en 3 dimensions, c'est-à-dire qu'ils possèdent tous une longueur, une largeur et une hauteur finie.

52

IV.3. DIFFICULTES RENCONTREES

Au cours de l'élaboration de ce travail nous nous sommes heurtés à des difficultés ci-après :

- Nous n'avons pas pu implémenter l'algorithme LAFF, faute de ressources temporelles, mais nous avons pris les résultats de cet algorithme testé sur un environnement presque similaire au nôtre à partir de l'article de (Gürbüz, Akyokuþ, Emiroðlu, & Güran, 2009), ce qui nous a permis d'avoir une idée sur les performances de l'algorithme.

- Nous avons eu du mal à produire l'interface graphique du modèle HI-BHA, faute du compilateur qui manquait les bibliothèques graphics.h et Xlib.h que nous n'avons pas pu nous procurer. Mais nous avons réussi à générer un fichier (.OUT) où une zone présentant une sélection de colis avec leurs positions et leurs orientation, qui remplit plutôt bien l'entrepôt est disponible.

- Nous n'avons pas pu tester l'algorithme en fonction des cas réels de la ville de Butembo. Nous nous sommes heurtés à des difficultés dans la récolte des données, en fait, beaucoup de magasinier d'ont aucune idée sur les dimensions des entrepôts, moins encore des articles. Mais nous avons testé l'algorithme sur des données générées aléatoirement tout en respectant les contraintes liées à l'algorithme.

CONCLUSION

L'optimisation d'entreposages des articles tridimensionnels dans des aires d'entreposage est un facteur assez important pour réduire les coûts liés à l'emmagasinage des produits commerciaux et industriels. Afin d'être compétitif sur le marché, les entreprises ont besoin d'un outil puissant pour réduire l'ensemble de leurs dépenses.

Dans ce travail intitulé `'Optimisation heuristique du problème d'entreposage d'objets en trois dimensions`', notre soucis était de trouver réponse à la question de savoir s'il existe une méthode capable de ranger les objets 3D dans des espaces de stockage 3D de manière maximiser l'espace disponible, le but étant de proposer une méthode efficace pour optimiser le chargement des boîtes. La grande complexité de ce problème et la présence de nombreuses littératures dans ce domaine nous ont dissuadées de construire nos idées à partir des méthodes déjà prouvés et jugés performantes.

Etant donné que le problème d'entreposage que nous traitons dans ce travail est un problème NP-Difficile et par conséquent très complexe à résoudre en un temps polynomiale, nous avons proposé dans ce travail une méthode heuristique du problème 3D Bin packing. Nous avons analysé deux algorithmes d'approximation, le Largest Area First-Fit et le fameux Human Intelligence-Based Heuristic Approach. Tous les deux algorithmes ont été jugés polynomiaux. Mais alors, nous avons proposé un seul algorithme qui est le Human Intelligence-Based Heuristic Approach

54

pour les avantages qu'il offre, entre autre la prise en compte des rotations d'articles et la considération de la hauteur du contenant.

Nous avons proposé l'algorithme HI-BHA qui est une méthode d'approximation qui résout le problème 3DBP ; nous l'avons présenté sous forme d'ordinogramme. Un prototype d'application codé en langage C a été mis en place pour traduire l'algorithme en programme d'application. Nous avons testé ce modèle et les résultats nous ont montré que le modèle est bel et bien efficace en donnant des réponses près de l'optimum allant jusqu'à utiliser 100% de l'espace de stockage en temps très réduit. Si le modèle proposé venait à être concrétisé dans les entreprises commerciales et industriels qui sont concernées par les entreposages d'objets en 3D, nous osons croire qu'il sera capable de résoudre le problème ci-haut évoque, celui de permettre à chaque entrepôt de contenir plus d'articles 3D possible et ainsi réduire les coûts liés à l'entreposage d'articles.

Loin d'imaginer avoir touché tous les aspects, nous restons ouverts à toutes les avancées sur ce domaine. En effet, nous ne prétendons pas avoir proposé le modèle le plus parfait qui puisse exister. Ainsi donc, tout autre chercheur intéressé dans ce domaine pourra trouver une autre méthode plus efficace que celui-ci. Nous suggérons aussi à tous les travaux futurs de prendre en compte d'autres paramètres comme le poids des boîtes, le prix et la durée de vie des produits qui est limitée, l'idéal serait de pouvoir ranger d'abord les boîtes avec un prix élevé et une courte durée de vie dans l'entrepôt. Ainsi, nous invitons tous les autres chercheurs à nous emboîter le pas et restons réceptifs à toutes les remarques et suggestion.

Wikimepia Foundation. (2008). Optimisation combinatoire. Consulté en Janvier 2013, sur wikipedia: http://fr.wikipedia.org/optimisation_combinatoire

55

BIBLIOGRAPHIE

Baltacioglu, E. (2002). The distributer's Three-dimensional pallet-packing. Washington DC: Air force institute of technologie.

Clautiaux, F. (2010). New collaborative approaches for bin-packing problems. Lille, France: Université des sciences et technologies de Lille.

Cordeau, B. (2006). Cours d'algorithme et Langage C. IUT d'Orsay.

Divay, M. (2004). Algorithmes et structures de données génériques. Paris, France: Dunod.

Dube, E., & Kanavathy, L. R. (2006). Optimizing three-dimensional bin packing through simulation. Durban, South Africa: University of KwaZulu-Natal.

Gazdar, M. (2008). Optimisation heuristique distribuée du problème de stockage de conteneurs dans un port. Lille, France: Ecole centrale de lille.

Gürbüz, Z., Akyokuþ, S., Emiroðlu, t., & Güran, A. (2009). An efficient Algorithm for 3D Rectangular Box packing. Republic of Macedonia: Society for ETAI.

Masivi, O. (2012). Cours de Laboratoire informatique II. Butembo, RDC: UNILUK.

Masivi, O. (2013). Approches méthodologiques de la recherche scientifique en informatique. Butembo, RDC: UNILUK.

Nebra, M. (2010). Apprenez à programmer en C. Paris, France: Simple IT.

Nzalamingi, F. (2012). Optimisation de la coupe et entreposage en une et deux dimensions.(memoire) Butembo, RDC: UNILUK.

Perrot, N. (2005). Integer Programming column generation strategies for the cutting stock problem and its variants. Bordeaux, France: University Bordeaux I.

Rohaut, S. (2007). Algorithmique: Techniques fondamentales de programmation. Edition ENI.

Sanni, L. (2009). Le rôle du système d'information dans les entreprises d'aujourd'hui. Consulté en Mars 2013, sur lookouster: http://www.lookouster.org/blog/ role_systeme_information

Scala, R. d. (2004). Les bases de l'informatique et de la programmation. Alger: Edition Berti.

Wattebled, P. (2010). Résolution heuristique d'un problème de conception de modules automatiques de rangement. Lille, France: INRIA.

Wikimedia Foundation. (2000). Problème de Bin-Packing. Consulté en Mai 2013, sur Wikipedia: http://fr.wikipedia.org/bin_packing

56

ANNEXES

ANNEXE A : DONNEES DE TEST

Ensemble N° 1

104, 96, 84

1. 3, 5, 7, 51

2. 20, 4, 6, 90

3. 11, 21, 16, 80

4. 51, 2, 60, 80

5. 6, 17, 8, 6

Ensemble N° 3

104, 96, 84

1. 3, 5, 7, 200

2. 9, 11, 2, 29

3. 14, 6, 8, 30

4. 1, 4, 19, 51

5. 10, 13, 21, 12

6. 27, 23, 34, 5

7. 12, 9, 13, 10

8. 24, 15, 19, 50

9. 5, 16, 9, 100

10. 10, 20, 5, 100

11. 9, 18, 15, 50

Ensemble N° 2

104, 96, 84

1. 3, 5, 7, 200

2. 9, 11, 2, 290

3. 14, 6, 8, 300

4. 1, 4, 19, 748

5. 10, 13, 21, 190

Ensemble N° 4

104, 96, 84

1. 1, 2, 3, 200

2. 2, 4, 5, 200

3. 6, 7, 1, 200

4. 6, 8, 2, 29

5. 11, 2, 3, 29

6. 9, 4, 2, 29

7. 14, 5, 3, 30

8. 10, 4, 6, 30

9. 11, 8, 3, 30

10. 1, 2, 19, 50

11. 8, 13, 11, 50

12. 1, 3, 21, 10

13. 8, 9, 10, 30

14. 7, 13, 31, 115

15. 12, 66, 3, 30

16. 4, 15, 19, 90

17. 5, 16, 9, 100

18. 10, 2, 5, 100

19. 10, 10, 1, 90

20. 9, 18, 15, 50

21. 6, 9, 14, 1

Ensemble N° 5

104, 96, 84

1. 28, 32, 18, 9

2. 24, 21, 35, 16

3. 19, 26, 20, 4

4. 19, 26, 16, 16

5. 16, 26, 20, 4

6. 20, 20, 26, 1

7. 16, 14, 25, 36

Ensemble N° 6

104, 96, 84

1. 70, 45, 24, 4

2. 70, 59, 24, 4

3. 14, 40, 48, 2

4. 14, 64, 48, 2

57

Ensemble N° 7

 
 

Ensemble N° 8

 

104, 96, 84

 

104, 96, 84

 

1. 19, 20, 42,

2

 

1.

1, 2, 3, 1

 

2.

25, 20, 30,

1

 

2.

4, 5, 6, 1

 

3.

25, 20, 25,

1

 

3.

7, 8, 9, 1

 
 

4.

25, 20, 29,

1

 

4.

10,

11, 12,

1

5.

8, 20, 21, 4

 
 

5.

13,

14, 15,

1

6.

36, 46, 84,

1

 

6.

16,

17, 18,

1

7.

16, 46, 10,

2

 

7.

19,

20, 21,

1

8.

16, 46, 32,

2

 

8.

22,

23, 24,

1

9.

20, 30, 15,

1

 

9.

25,

26, 27,

1

10.

20, 30, 69,

1

 

10.

28,

29, 30,

1

11.

20, 30, 21,

4

 

11.

31,

32, 33,

1

12.

12, 30, 7,

12

 

12.

34,

35, 36,

1

13.

52, 60, 42,

2

 

13.

37,

38, 39,

1

14.

26, 36, 21,

4

 

14.

40,

41, 42,

1

15.

26, 36, 84,

1

 

15.

43,

44, 45,

1

 
 
 
 

16.

46,

47, 48,

1

 

17.

2,

3, 4, 1

 
 
 
 
 
 
 

18.

5,

6, 7, 1

 
 
 
 

19.

8,

9, 10, 1

 
 
 
 

20.

11,

12, 13,

1

 
 
 

21.

14,

15, 16,

1

 
 
 

22.

17,

18, 19,

1

 
 
 

23.

20,

21, 22,

1

 
 
 

24.

23,

24, 25,

1

 
 
 

25.

26,

27, 28,

1

 
 
 

26.

29,

30, 31,

1

 
 
 

27.

32,

33, 34,

1

 
 
 

28.

35,

36, 37,

1

 
 
 

29.

38,

39, 40,

1

 
 
 

30.

41,

42, 43,

1

 
 
 

31.

44,

45, 46,

1

58

ANNEXE B : CODES C DE QUELQUES FONCTIONS DE L'ALGORITHME HUMAN INTELLIGENCE - BASED HEURISTIC APPROACH

//les directives du préprocesseur

#include <time.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <malloc.h>

#include <conio.h>

//fonction main

int main(int argc, char *argv[]) j

if (argc == 1) j

printf("(ASSUREZ VOUS QUE VOUS AVEZ UN FICHIER .TXT CONTENANT LES VARIABLES ENTRANTES)\n");

printf ("ENTREZ LE NOM DU FICHIER D'ENTREES S.V.P :"); scanf ("%s",filename);

}

else

j

printf("%s", argv[1]);

strcpy(filename, argv[1]);

}

initialize();

time(&start);

printf("\nAPPUIYEZ SUR Q POUR ARRETER L'ITERATION\n\n");

execiterations();

time(&finish);

report();

getch();

return 0;

}

//lectures des coordonnées largeur, hauteur et profondeur entrées dans le fichier txt

void inputboxlist(void)j

short int n;

char lbl[5], dim1[5], dim2[5], dim3[5], boxn[5], strxx[5], stryy[5], strzz[5];

strcpy(strtemp, filename);

strcat(strtemp,".txt");

if ((ifp=fopen(strtemp,"r"))==NULL) j

printf("Impossible d'ouvrir le fichier %s", strtemp);

exit(1);

}

tbn=1;

if (fscanf(ifp,"%s %s %s",strxx, stryy, strzz)==EOF)j exit(1);

}

xx=atoi(strxx); yy=atoi(stryy); zz=atoi(strzz);

59

while (fscanf(ifp,"%s %s %s

%s",lbl,dim1,dim2,dim3,boxn)!=EOF){ boxlist[tbn].dim1=atoi(dim1); boxlist[tbn].dim2=atoi(dim2); boxlist[tbn].dim3=atoi(dim3);

boxlist[tbn].vol=boxlist[tbn].dim1*boxlist[tbn].dim2*boxlist[t bn].dim3;

n=atoi(boxn);

boxlist[tbn].n=n;

while (--n){

boxlist[tbn+n]=boxlist[tbn];

}

tbn=tbn+atoi(boxn);

}

--tbn;

fclose(ifp);

return;

}

//recherche de la caisse la plus appropriée en cherchant toutes les

//six orientations possibles, l'espace vide donnée, les caisses

//adjacentes et la limite de l'entrepôt

void findbox(short int hmx, short int hy, short int hmy, short

int hz, short int hmz)

{

short int y;

bfx = 32767; bfy = 32767; bfz = 32767;

bbfx = 32767; bbfy = 32767; bbfz = 32767;

boxi = 0; bboxi = 0;

for (y = 1; y <= tbn; y = y + boxlist[y].n)

{

for (x = y; x < x + boxlist[y].n - 1; x++)

{

if (!boxlist[x].packst) break;

}

if (boxlist[x].packst) continue;

if (x > tbn) return;

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim1,

boxlist[x].dim2, boxlist[x].dim3);

if ( (boxlist[x].dim1 == boxlist[x].dim3) &&

(boxlist[x].dim3 == boxlist[x].dim2) ) continue;

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim1,

boxlist[x].dim3, boxlist[x].dim2);

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim2,

boxlist[x].dim1, boxlist[x].dim3);

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim2,

boxlist[x].dim3, boxlist[x].dim1);

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim3,

boxlist[x].dim1, boxlist[x].dim2);

analyzebox(hmx, hy, hmy, hz, hmz, boxlist[x].dim3,

boxlist[x].dim2, boxlist[x].dim1);

}

}

//analyses de chaque caisse non chargée pour trouver le meilleure

//emplacement dans l'entrepôt

//recherche de la couche ayant la hauteur la plus appropriées

60

void analyzebox (short int hmx, short int hy, short int hmy,

short int hz, short int hmz, short int dim1, short int dim2,

short int dim3)j

if (dim1<=hmx && dim2<=hmy && dim3<=hmz)j

if (dim2<=hy) j

if (hy-dim2<bfy) j

boxx=dim1;

boxy=dim2;

boxz=dim3;

bfx=hmx-dim1;

bfy=hy-dim2;

bfz=abs(hz-dim3);

boxi=x;

}

else if (hy-dim2==bfy && hmx-dim1<bfx) j

boxx=dim1;

boxy=dim2;

boxz=dim3;

bfx=hmx-dim1;

bfy=hy-dim2;

bfz=abs(hz-dim3);

boxi=x;

}

else if (hy-dim2==bfy && hmx-dim1==bfx && abs(hz-

dim3)<bfz) j

boxx=dim1;

boxy=dim2;

boxz=dim3;

bfx=hmx-dim1;

bfy=hy-dim2;

bfz=abs(hz-dim3);

boxi=x;

}

}

else j

if (dim2-hy<bbfy) j

bboxx=dim1; bboxy=dim2; bboxz=dim3; bbfx=hmx-dim1; bbfy=dim2-hy; bbfz=abs(hz-dim3); bboxi=x;

}

else if (dim2-hy==bbfy && hmx-dim1<bbfx) j bboxx=dim1; bboxy=dim2; bboxz=dim3; bbfx=hmx-dim1; bbfy=dim2-hy; bbfz=abs(hz-dim3); bboxi=x;

}

else if (dim2-hy==bbfy && hmx-dim1==bbfx && abs(hz-dim3)<bbfz) j

bboxx=dim1; bboxy=dim2; bboxz=dim3; bbfx=hmx-dim1; bbfy=dim2-hy; bbfz=abs(hz-dim3); bboxi=x;

}

}

}

}

//fonction exigée pour le fonctionnement de la fonction QSORT int complayerlist(const void *i, const void *j)j

return *(long int*)i-*(long int*)j;

}

}

61

//en cherchant les boites non encore chargées et l'espace vide //encore disponible

int findlayer( short int thickness) j

short int exdim,dimdif,dimen2,dimen3,y,z; long int layereval, eval;

layerthickness=0;

eval=1000000;

for(x=1;x<=tbn;x++)j

if (boxlist(x].packst) continue; for(y=1;y<=3;y++)j

switch(y) j

case 1:

exdim=boxlist(x].dim1; dimen2=boxlist(x].dim2; dimen3=boxlist(x].dim3; break;

case 2:

exdim=boxlist(x].dim2; dimen2=boxlist(x].dim1; dimen3=boxlist(x].dim3; break;

case 3:

exdim=boxlist(x].dim3; dimen2=boxlist(x].dim1; dimen3=boxlist(x].dim2; break;

}

layereval=0;

if ((exdim<=thickness) && (((dimen2<=px) && (dimen3<=pz)) || ((dimen3<=px) && (dimen2<=pz)))) j for(z=1;z<=tbn;z++)j

if (!(x==z) && !(boxlist(z].packst))j dimdif=abs(exdim-boxlist(z].dim1); if (abs(exdim-

boxlist(z].dim2)<dimdif)j

dimdif=abs(exdim-

boxlist(z].dim2);

}

if (abs(exdim-

boxlist(z].dim3)<dimdif)j

dimdif=abs(exdim-

boxlist(z].dim3);

}

layereval=layereval+dimdif;

}

}

if (layereval<eval) j

eval=layereval;

layerthickness=exdim;

}

}

}

}

if (layerthickness==0 || layerthickness>remainpy) packing=0;

return 0;

62

//recherche du premier vide à être chargée

//au bord de la couche

void findsmallestz(void) j

scrapmemb=scrapfirst;

smallestz=scrapmemb;

while (!((*scrapmemb).pos==NULL)) j

if((*((*scrapmemb).pos)).cumz<(*smallestz).cumz)j

smallestz=(*scrapmemb).pos;

}

scrapmemb=(*scrapmemb).pos;

}

return;

}

//utilisation des paramètres trouvées pour le chargement de la

meilleure solution trouvée et envoie du rapport à la console

et au fichier OUT

void report(void)j

quit=0;

switch(bestvariant) j

case 1:

px=xx; py=yy; pz=zz;

break;

case 2:

px=zz; py=yy; pz=xx;

break;

case 3:

px=zz; py=xx; pz=yy;

break;

case 4:

px=yy; py=xx; pz=zz;

break;

case 5:

px=xx; py=zz; pz=yy;

break;

case 6:

px=yy; py=zz; pz=xx;

break;

}

packingbest=1;

if ((gfp=fopen(graphout,"w"))==NULL) j

printf("Impossible de lire le fichier %s", filename); exit(1);

}

itoa(px, strpx, 10); itoa(py, strpy, 10); itoa(pz, strpz, 10); fprintf(gfp,"%5s%5s%5s\n",strpx,strpy,strpz); strcat(filename,".out"); if ((ofp=fopen(filename,"w"))==NULL) j

printf("Impossible d'ouvrir le fichier %s", filename); exit(1);

}

percentagepackedbox=bestvolume*100/totalboxvol; percentageused=bestvolume*100/totalvolume;

elapsedtime = difftime( finish, start);

fprintf(ofp," *** RAPPORT DE LA MEILLEURE SOLUTION ***\n\n");

fprintf(ofp," TEMPS ECOULE

:environ %.0f sec\n", elapsedtime);

}

63

fprintf(ofp," itenum);

fprintf(ofp,"

NOMBRE TOTAL D'ITERATIONS MEILLEURE SOLUTION TROUVEE A LA

:

:

%d\n", %d

ITERATION\n", bestite);

fprintf(ofp," NOMBRE TOTAL DE BOITES tbn);

fprintf(ofp," NOMBRE DE BOITES CHARGEES bestpackednum);

:

:

%d\n", %d\n",

fprintf(ofp,"

VOLUME TOTAL DE TOUTES LES BOITES:

 

%.0f\n",totalboxvol);

fprintf(ofp," VOLUME DE L'ENTREPOT :
%.0f\n",totalvolume);

fprintf(ofp," UTILISATION DU VOLUME :%.0f
SUR %.0f\n", bestvolume, totalvolume);

fprintf(ofp," POURCENTAGE DE L'ESPACE UTILISE : %.6f
%%\n", percentageused);

fprintf(ofp," DIMENSIONS DE L'ENTREPOT :

X=%d; Y=%d; Z=%d\n", px, py, pz);

fprintf(ofp,"

fprintf(ofp," POURCENTAGE DES BOITES CHARGEES (VOLUME) : %.6f %%\n",percentagepackedbox);

\n");

fprintf(ofp," NO: PACKSTA DIMEN-1 DIMEN-2 DIMEN-3 COOR-X COOR-Y COOR-Z PACKEDX PACKEDY PACKEDZ\n");

fprintf(ofp," \n");

listcanditlayers();

layers[0].layereval=-1;

qsort(layers,layerlistlen+1,sizeof(struct

layerlist),complayerlist);

packedvolume=0.0;

packedy=0;

packing=1;

layerthickness=layers[bestite].layerdim;

remainpy=py;

remainpz=pz;

for (x=1; x<=tbn; x++){

boxlist[x].packst=0;

}

do{

layerinlayer=0; layerdone=0;

packlayer();

packedy=packedy+layerthickness;

remainpy=py-packedy;

if(layerinlayer){

prepackedy=packedy;

preremainpy=remainpy;

remainpy=layerthickness-prelayer; packedy=packedy-layerthickness+prelayer; remainpz=lilz; layerthickness=layerinlayer;

layerdone=0; packlayer();

packedy=prepackedy;

remainpy=preremainpy;

remainpz=pz;

}

if (!quit){

findlayer(remainpy);

}

64

while (packing && !quit);

fprintf(ofp,"\n\n*** LISTE DES BOITES NON CHARGEES ***\n");

unpacked=1;

for (cboxi=1; cboxi<=tbn; cboxi++)j if(!boxlist[cboxi].packst)j

graphunpackedout();

}

}

unpacked=0;

fclose(ofp);

fclose(gfp);

printf("\n");

for (n=1; n<=tbn; n++)

if (boxlist[n].packst)

printf("%d %d %d %d %d %d %d %d %d %d\n",n,

boxlist[n].dim1,boxlist[n].dim2,boxlist[n].dim3,boxlist[n].cox

,boxlist[n].coy,boxlist[n].coz,boxlist[n].packx,boxlist[n].pac

ky,boxlist[n].packz);

printf(" TEMPS ECOULE : environ
%.0f sec\n",elapsedtime);

printf(" NOMBRE TOTAL D'ITERATIONS : %d\n",

itenum);

printf(" MEILLEUR RESULTAT TROUVE A :

ITERATION: %d\n", bestite);

printf(" NOMBRE TOTAL DES BOITES : %d\n",

tbn);

printf(" NOMBRE TOTAL DES BOITES CHARGEES : %d\n",bestpackednum);

printf(" VOLUME TOTAL DE TOUTES LES BOITES : %.0f\n",totalboxvol);

printf(" VOLUME DE L'ENTREPOT : %.0f\n",
totalvolume);

printf(" UTILISATION DU L'ESPACE : %.0f SUR
%.0f\n", bestvolume, totalvolume);

printf(" POURCENTAGE SU VOLUME TOTAL UTILISE: %.6f %%\n",percentageused);

printf(" POURCENTAGE DES BOITES CHARGEES (VOLUME): %.6f %%\n",percentagepackedbox);

printf(" DIMENSIONS DE L'ENTREPOT : X=%d;
Y=%d; Z= %d\n\n\n", px, py, pz);

printf(" POUR VOIR CETTE SOLUTION EN GRAPHIQUE, EXECUTEZ 'VISUAL.EXE'\n");

}

printf(" DESOLE QUE CELA N'ACCEPTE PAS POUR LE MOMENT, NOUS NOUS EXCUSONS\n");







9Impact, le film from Onalukusu Luambo on Vimeo.



Appel aux couturier(e)s volontaires

Hack the pandemiuc !

Moins de 5 interactions sociales par jour



BOSKELYWOOD from Ona Luambo on Vimeo.