Académique Documents
Professionnel Documents
Culture Documents
2023/2024
Remerciements
“
Louange à Dieu seul, clément et miséricordieux,
2|Page
Table of Contents
Chapitre 1 : Notions Générales sur l’Ordonnancement................................................4
1. Introduction........................................................................................................4
1.1.3. Modélisation.............................................................................................16
1.1.5. L’implémentation.....................................................................................22
Bibliographie..............................................................................................................24
Webographie...............................................................................................................27
3|Page
Chapitre 1 : Notions Générales sur
l’Ordonnancement
1. Introduction
L'ordonnancement revêt une importance cruciale dans la gestion de la production, visant à coordonner et
organiser les activités opérationnelles au sein des entreprises. Il englobe la planification minutieuse des
tâches, des ressources et des délais pour optimiser l'efficacité des processus de fabrication, de distribution
ou de prestation de services.
L'interaction entre la modélisation et la conception dans l'ordonnancement est essentielle pour améliorer
les performances opérationnelles. La modélisation fournit une représentation structurée et abstraite des
systèmes de production, tandis que la conception crée des solutions pratiques et applicables basées sur
ces modèles. Cette collaboration entre la conceptualisation et la mise en œuvre d'algorithmes et de
stratégies permet de relever les défis complexes de l'ordonnancement dans des environnements de plus
en plus diversifiés et mondialisés, contribuant ainsi à une gestion plus efficace des opérations.
Variables et paramètres : Identifier les éléments variables et constants qui influencent le problème.
Les variables peuvent être des facteurs changeants (prix, quantités, etc.), tandis que les paramètres
restent constants (taux de croissance, capacité maximale, etc.).
Relations et équations : Établir les relations entre les variables et les paramètres. Cela peut inclure
des équations mathématiques, des lois physiques, des modèles statistiques, des règles empiriques, etc.
4|Page
Limites et contraintes : Définir les limites et les contraintes du modèle. Ces limites peuvent être des
contraintes physiques, des contraintes budgétaires, des restrictions temporelles, etc.
Données et hypothèses : Collecter des données pertinentes pour alimenter le modèle. Les
hypothèses, souvent nécessaires en raison de la simplification du monde réel, doivent être clairement
définies pour comprendre les limites du modèle.
Validation et vérification : Évaluer et tester la performance du modèle en utilisant des données
réelles ou des scénarios connus pour vérifier s'il reproduit fidèlement le comportement attendu dans la
réalité.
Interprétation des résultats : Analyser et interpréter les résultats du modèle pour en tirer des
conclusions utiles et pertinentes par rapport à l'objectif initial.
Méthodes analytiques : Pour certains modèles mathématiques, des solutions analytiques peuvent
être dérivées à l'aide de calculs et de méthodes algébriques. Ces méthodes sont souvent applicables à des
modèles simples et bien définis.
Méthodes numériques : Lorsque des solutions analytiques ne sont pas réalisables, les méthodes
numériques sont utilisées pour résoudre des modèles mathématiques complexes. Il s'agit notamment de
méthodes d'optimisation, de simulations numériques, de méthodes itératives (comme la méthode des
différences finies ou la méthode des éléments finis) ou d'algorithmes de résolution pour des systèmes
d'équations.
Méthodes heuristiques : Pour des problèmes où la recherche de la solution optimale est difficile en
raison de la complexité ou de la taille du problème, les méthodes heuristiques offrent des solutions
proches de l'optimum sans garantie de l'atteindre. Les algorithmes génétiques, les algorithmes évolutifs,
les algorithmes de recherche locale (comme la recherche taboue ou le recuit simulé) font partie de ces
méthodes.
5|Page
Chapitre 2 : Etude d’un premier exemple
Dans le cadre de ce projet de modélisation et de simulation industrielle, nous nous penchons sur un
système de production impliquant la fabrication de boîtes de craies à travers un processus de flow
shop. Notre objectif est de concevoir, simuler et optimiser ce système en utilisant le logiciel FlexSim.
Ce système spécifique comprend quatre types de boîtes de craies distincts, chaque type étant soumis
à un processus séquentiel de trois machines.
Chaque boîte de craies passe par une phase de préparation, un assemblage et un contrôle avant d'être
acheminée vers un stockage ou une reprise du processus, selon les résultats de l'inspection. Une
attention particulière est accordée à la troisième machine, dédiée au contrôle qualité, assurant ainsi que
seules les pièces conformes sont incluses dans le stock final.
Dans cette introduction, nous détaillerons les caractéristiques spécifiques de chaque job, y compris les
temps de préparation, les temps de traitement, et les détails du processus d'inspection. Notre approche
intégrera la simulation dans FlexSim pour visualiser le flux de production et évaluer les performances
du système, en tenant compte de la machine de contrôle qualité. En parallèle, nous développerons un
modèle de programmation linéaire dans le logiciel Lingo pour optimiser l'ordonnancement et
minimiser le temps total de production, en prenant en compte les contraintes du processus.
Ce projet combine les aspects pratiques de la modélisation avec FlexSim et les analyses de
performance avec Lingo pour fournir des solutions efficaces pour la production de boîtes de craies
tout en garantissant la qualité via le processus d'inspection dédié.
Les caractéristiques spécifiques de chaque job sont définies dans les propriétés de chaque source. Cela
inclut le type de boîte (couleur), les temps de préparation, les temps de traitement.
6|Page
2.2 Machines de traitement :
Les machines de traitement dans FlexSim sont généralement représentées par des objets "Processor".
Dans notre modèle, chaque machine de traitement est responsable de traiter une étape spécifique du
processus de production (préparation, assemblage et contrôle).
Les temps de préparation et de traitement pour chaque job sont configurés dans les propriétés de chaque
machine.
3. Logique de simulation :
Les jobs commencent leur parcours à partir des sources, représentant les différentes boîtes
de craies.
On les a différenciés en utilisant les Label et les pourcentages d’apparition et bien sûr par leurs
couleurs
7|Page
Job Rouge :
- Temps de Préparation S: [3 minutes, 2 minutes, 1 minute] (Décoration, Assemblage, Inspection).
- Temps de Traitement P : [10 minutes, 8 minutes, 5 minutes] (Machine 1, Machine 2,
machine 3).
Job Vert :
- Temps de Préparation S: [4 minutes, 2 minutes, 3 minutes] (Décoration,
Assemblage, Inspection).
- Temps de Traitement P : [12 minutes, 10 minutes, 6 minutes] (Machine 1, Machine 2,
machine 3).
Job Bleu :
- Temps de Préparation S : [3 minutes, 1 minute, 4 minutes] (Décoration,
Assemblage, Inspection).
- Temps de Traitement P : [8 minutes, 6 minutes, 4 minutes] (Machine 1, Machine 2, machine 3).
*Job Jaune :*
- Temps de Préparation S : [5 minutes, 3 minutes, 2 minutes] (Décoration,
Assemblage, Inspection).
- Temps de Traitement P : [15 minutes, 12 minutes, 7 minutes] (Machine 1, Machine 2,
machine 3).
Chaque job suit une séquence de tâches définie, passant par les machines de
traitement (Machine 1, Machine 2) et arrivant à la machine de contrôle qualité.
Voici ci-dessous le temps de préparation et le temps de traitement de la machine 1 :
8|Page
Une file d'attente est utilisée après chaque machine de traitement pour réguler le flux des jobs.
Elle détecte les pièces défectueuses et les envois vers un port lié à un convoyeur pour qu’elle repasse par
le processus.
9|Page
4. Programmation Linéaire avec Lingo :
4.1 Problématique :
La problématique de ce modèle de programmation linéaire en Lingo est d'optimiser l'ordonnancement des jobs sur
des machines tout en minimisant la date de fin du dernier job (Cmax).
Cependant, plusieurs contraintes complexes ont été introduites pour prendre en compte des aspects spécifiques du
problème.
10 | P a g e
11 | P a g e
Dans cette première section, notre attention s'est portée sur la minimisation
du temps de complétion. À présent, nous orientons notre analyse vers un
autre paramètre significatif : la minimisation du temps total d'écoulement
(total flow time).
Cette étape de notre investigation vise à élargir notre compréhension des
impératifs d'ordonnancement en considérant un aspect différent de la
performance des systèmes de production. En examinant de près le temps total
d'écoulement, nous chercherons à identifier les stratégies et les pratiques qui
favorisent une gestion plus efficace des processus, contribuant ainsi à une
optimisation globale des performances. Cette démarche analytique enrichit
notre exploration des concepts d'ordonnancement, offrant une perspective
équilibrée et approfondie sur les multiples facettes qui influent sur l'efficacité
opérationnelle des systèmes industriels.
12 | P a g e
Commentaire :
le total flow time (TFT) est égal à 139, cela indique la durée totale nécessaire
pour l'achèvement d'un ensemble de tâches .
Pour réduire le total flow time, il est souvent nécessaire d'optimiser la séquence
des opérations, d'améliorer l'efficacité des ressources, ou de mettre en œuvre
des stratégies d'ordonnancement plus efficaces. Cela peut impliquer l'utilisation
de méthodes d'ordonnancement avancées, telles que des algorithmes
heuristiques ou des approches basées sur la théorie des files d'attente. De plus,
une évaluation approfondie des goulots d'étranglement potentiels dans le
processus de production pourrait permettre d'identifier des zones d'amélioration
spécifiques. L'objectif ultime serait de minimiser le total flow time tout en
maintenant la qualité et l'efficacité globale du processus.
Pour remédier à ce problème, intéressons-nous maintenant à l'étude de la
minimisation du completion time sous les contraintes de "no wait" et "no
idle".
13 | P a g e
La notion de "no idle" se réfère à l'absence d'inactivité ou de temps d'arrêt non
productif dans un processus ou un système. Dans un contexte de gestion de
production, le principe "no idle" vise à minimiser les périodes où les ressources
(machines, travailleurs, etc.) sont inutilisées ou ne contribuent pas directement à
la production. En d'autres termes, il s'agit de maximiser l'utilisation des
ressources disponibles de manière continue, afin d'optimiser l'efficacité
opérationnelle du système. Cette approche cherche à éliminer les temps morts
non nécessaires, favorisant ainsi une utilisation plus efficiente des capacités de
production.
14 | P a g e
La notion de "no wait" signifie l'absence de temps d'attente dans un processus
ou un système. Dans le contexte de la gestion de production, "no wait" vise à
minimiser les périodes où les ressources, telles que les machines ou les
travailleurs, sont inactives en raison de l'attente de matières premières,
d'instructions, ou d'autres facteurs. L'objectif est d'optimiser le flux continu du
processus de production en éliminant ou en réduisant au maximum les temps
d'attente, ce qui contribue à accroître l'efficacité et à réduire les délais.
15 | P a g e
16 | P a g e
17 | P a g e
Commentaire :
Dans notre situation, l'incorporation de contraintes visant à réduire Cmax
semble inefficace, étant donné que cela entraîne une augmentation du temps de
complétion. En d'autres termes, l'ajout de ces contraintes ne contribue pas à
l'optimisation du processus, mais plutôt à son allongement.
18 | P a g e
5.Conclusion :
Le modèle linéaire développé dans Lingo a été une étape clé dans l'optimisation des temps de fin des
jobs. En respectant les contraintes spécifiques du système, il a renforcé la planification opérationnelle,
offrant ainsi des résultats significatifs en termes d'efficacité et de performance.
La simulation avec FlexSim a complété cette approche en fournissant des données pratiques. Cette phase
a permis d'évaluer le flux de production, d'analyser les temps d'attente et de mettre en lumière des zones
d'amélioration potentielle.
19 | P a g e
Chapitre 3 : Etude d’un deuxième exemple
L’organisation de l’atelier :
Pour les formes sèches l’atelier est de type FJS à 8 étapes FJ8 où des tâches peuvent
être traitées par plus d’une machine par étape.
Ri
• La préemption :
La préemption des taches est impossible, toute opération, une fois commencée ne
peut être interrompue.
PRMP
• La précédence :
Nous avons une contrainte de précédence entre les machines, chaque lot a sa propre
séquence d’opérations.
PREC
20 | P a g e
• La production en lot (batch(b)) :
Les machines ne peuvent traiter qu’un seul lot simultanément.
b=1
• Le blocage (blocking) :
Pour les lignes sous forme sèche, nous n’avons aucun blocage contrairement aux
lignes sous forme liquide.
Block
• La recirculation :
Les produits ne circulent qu’une seule fois sur chaque machine rendant larecirculation
impossible.
RCRC
21 | P a g e
Chapitre 4 : Construction du modèle
d’ordonnancement
22 | P a g e
23 | P a g e
4.1.2 Modélisation
1. Les Tâches
Les tâches dans le problème sont les opérations de chaque lot qui doivent être
traitées par une seule machine, par exemple : L’opération de granulation du lot 2
qui peut être traitée par la machine ”SGRN9”. La pesée ne va pas être prise en
considération dans la modélisation parce que son temps opératoire et négligeable
par rapport aux autres étapes et elle n’a pas de changeovers, elle va être planifiée
selon le plan de l’ordonnancement et selon la séquence des lots à fabriquer, pour
préparer la matière première.
2. Les Ressources
Les seules ressources qui existent sont les ressources renouvelables qui sont les
machines M et les équipes (shifts) de chaque ligne.
3. Les Contraintes
• Ordonner les tâches selon l’ordre de fabrication (la séquence).
• Le nombre de machines est limité dans chaque étape.
• Une machine ne peut opérer qu’une seule opération à la fois.
• Une machine ne peut traiter qu’une seule opération à la fois.
• Après chaque changement de type de produit dans une ligne, un temps de
passage (changeover) est nécessaire pour préparer la machine pour le prochain
produit.
24 | P a g e
4.1.3 Choix de la méthode de résolution
Pour la solution du problème de FJSP-SD nous avons choisi un algorithme génétique
(méta heuristique basé sur une population) après une recherche bibliographique
approfondie.
La complexité du problème étant élevée, l’algorithme génétique est l’un des meilleurs choix
ZAGHDOUD 2015pour la résolution de ce type de problème, de plus :
25 | P a g e
4.1.3.1 Le déroulement de l’algorithme génétique
Inspiré de l’évolution biologique des espèces l’algorithme génétique fait partie dela
famille des algorithmes évolutionnaires où une population est générée et dont chaque
individu (aussi dit chromosome) est évalué par une fonction fitness qui déterminera la
probabilité avec laquelle il risque d’être sélectionné.
Dans la phase de sélection, les parents les plus performants sont choisis puis sont croisés
à l’aide d’un opérateur de croisement afin de générer des enfants.
Les nouveaux individus sont alors mutés afin de modifier leur code génétique. Ainsi,
seuls les individus les plus performants sont gardés pour former la population de la
génération suivante.
Ce méta heuristique converge vers une solution optimale au fil des générations, le
processus est alors répété jusqu’à satisfaire un critère d’arrêt.
L’individu est représenté par un chromosome, qui est un vecteur qui porte
l’ensemble des indices de chaque opération Oj de chaque lot Ji avec l’ensemble des
machines qui peut le traiter Mk.
Parce que le problème est de type SD d’autres travaux ont proposé des
chromosomes en deux parties, l’une pour représenter la séquence d’opérations et
l’autre pour l’affectation des machines.
Le tableau : 4.3 présente un exemple de codage utilisé par l’algorithme génétique.
Le tableau contient 3 lots avec leurs séquences d’opérations et les machines possibles,
le lot 1 à 3 opérations, l’opération 2 peut être traitée par deux machines 7 et 18avec
un temps opératoire de 400 et 695 minutes respectivement.
Un chromosome est alors un vecteur de taille k, égale au nombre de lignes, généré
aléatoirement dans lequel chaque élément a un indice qui mappe une ligne.
26 | P a g e
nombre de combinaisons qui augmente exponentiellement avec le nombre
d’opérations, chaque vecteur contenant un indice machine est codé. Le vecteur
final est le résultat de la combinaison des vecteurs selon l’ordre des étapes.
Pour le cas précédent voilà l’exemple d’un chromosome codé généré par l’algorithme :
[4, 0, 2, 8, 5, 1, 9, 3, 10, 6, 7]
indice 4 0 2 8 5
mappe j(2, 1, 5) j(1, 1, 13) J(1, 2, j(3, 1, 18) j(2, 2, 18)
18)
1 9 3 10 6 7
j(1, 2, 7) j(3, 2, 11) j(1, 3, 8) j(3, 3, 8) j(2, 4, 8) j(2, 3, 11)
Afin que la solution soit faisable, le chromosome doit respecter les contraintes
suivantes :
4.1.3.3.2 Une opération est traitée par une et une seule machine ;
4.1.3.3.4 La séquence d’opération doit être respectée et donc leurs indices doivent être
27 | P a g e
ordonné selon un ordre croissant (ex : J(0,1,4), J(0,2,2), J(0,3,13)) si l’une des
opérations ne suit pas un ordre croissant alors une permutations a lieu (ex :
J(0,3,13), J(0,2,2), J(0,1,4) devient J(0,1,4), J(0,2,2), J(0,3,13)) et l’ordre est
remplacé dans le vecteur ;
[0, 2, 8, 9, 3, 4, 10, 5, 7, 6]
Le Job 1 J (1,2,7)) a été supprimé car il existe déjà dans le vecteur sous forme de
Job 2 (J(1,2,18)) qui a déjà été parcourue dans l’algorithme.
Les autres opérations ont été modifiés selon la séquence qui doit être respectée.
4.1.3.3.7 Une opération Oi,0,k commence dès que la machines est disponible ;
4.1.3.3.9 Une opération s’achève au bout de son temps opératoire sur une machine ;
4.1.3.3.10 Le temps de changeover est ajouté pour le cas des changements de série
28 | P a g e
ordonné selon un ordre croissant (ex : J(0,1,4), J(0,2,2), J(0,3,13)) si l’une des
6 BF153 2 4 8 788 210 1234 2022
29 | P a g e
4.1.3.4 La population initiale
La population initiale composée de n individu est générée aléatoirement en prenant
l’ensemble des indices de la table d’inputs et les mélangeant.
4.1.3.6 La sélection
La sélection est un procédé qui permet d’identifier les individus répondant au
mieux au problème étudié, c’est-à-dire, que chaque individu est choisi en fonction
de sa valeur d’évaluation. Ce procédé ne permet pas de créer de nouveaux
individus, mais de privilégier les individus en fonction de leur valeur d’évaluation,
et cela, afin de les exposer au croisement et à la mutation (reproduction).
Dans notre cas nous avons choisi la méthode de sélection par tournoi qui
consisteà choisir aléatoirement k individus de la population, puis à sélectionner le
meilleur individu.
Ce processus est répété à plusieurs fois, avec ou sans remise, jusqu’à ce que le nombre
d’individus nécessaires pour le croisement soit atteint.
4.1.3.7 Le croisement
L’opération de croisement permet de générer des individus afin de créer de
nouvelles solutions. Le croisement consiste donc à générer à partir de deux
individus sélectionnés (parents), plusieurs nouvelles solutions chacune composée
d’une partie des caractéristiques de leurs parents.
30 | P a g e
4.1.3.8 La mutation
La mutation permet de maintenir la diversité et empêche la dégénérescence des
solutions entre elles dans la population.
L’opérateur de mutation apporte une propriété d’érgodicité de parcours d’espace de
solutions aux algorithmes génétiques.
Cette propriété indique que l’algorithme génétique est capable d’atteindre tout les
points de l’espace de recherche, sans pour autant les parcourir dans le processus de
résolution DURAND 2004.
L’opérateur de mutation joue le rôle d’un élément perturbateur qui consiste en un
changement au niveau des gènes d’un individu choisi avec une certaine probabilité
Pmappelée la probabilité ou le taux de mutation. Dans notre cas nous avons
appliqué la méthode des indices aléatoires car le problème est un problème de
séquence et d’ordre.
4.1.4 L’implémentation
L’algorithme
31 | P a g e
17 Fin de l’algorithme de permutation
18 Début de l’algorithme génétique
19 Initialiser les paramètres de l’algorithme génétique
20 Générer la population une population de taille pop = 50
21 while (ngen ≤ 100) do
22 Évaluation des individus
23 Sélection par tournoi de taille tournsize = 5
24 Croisement uniforme à correspondance partielle avec indpb=0.05
et cxpb=0.3
25 Mutation avec indpb = 0.05 et mutpb = 0.1
26 Remplacement de la population
27 Retourner Le meilleur individu
28 Retourner Le programme de production
29 Retourner Le diagramme de Gantt
30 Fin de l’algorithme
31 Fin
Le code
Ceci est justifiable car le principe et les bibliothèques utilisées sont très différentes, une annexe
spéciale permet au lecteur intéressé par un algorithme particulier de la retrouve facilement. Pour
l’algorithme génétique nous avons travaillé avec les paramètres
32 | P a g e
Bibliographie
33 | P a g e
GUIMARAES, Kairon Freitas et Marcia Aparecida F ERNANDES (2006). “An approachfor
flexible job-shop scheduling with separable sequence-dependent setup time”. In :
2006 IEEE International Conference on Systems, Man and Cybernetics. T. 5. IEEE,p.
3727- 3731.
HABCHI, Georges (2001). “Conceptualisation et Modélisation pour la Simulation des
Systèmes de Production”. In : Rapport d’habilitation à diriger des recherches,
Université de Savoie.
HARJUNKOSKI, Iiro et al. (2014). “Scope for industrial applications of production
scheduling models and solution methods”. In : Computers & Chemical Engineering
62,
p. 161-193.
HARRATH, Youssef (2003). “Contribution à l’ordonnancement conjoint de la production
et de la maintenance : Application au cas d’un Job Shop.” Thèse de doct. Universitéde
Franche-Comté.
HENTOUS, Hamid (1999). “Contribution au pilotage des systèmes de production de type
Job Shop”. Thèse de doct. Lyon, INSA.
LARIBI, Imane (2018). “Résolution de problèmes d’ordonnancement de type Flow-Shop
de permutation en présence de contraintes de ressources non-renouvelables”. Thèse de
doct. Thèse de doctorat.
LEE, Young Hae, Chan Seok JEONG et Chiung MOON (2002). “Advanced planning and
scheduling with outsourcing in manufacturing supply chain”. In : Computers &
Industrial Engineering 43.1-2, p. 351-374.
LI, Jun-qing et al. (2020). “An improved Jaya algorithm for solving the flexible job shop
scheduling problem with transportation and setup times”. In : Knowledge-Based
Systems 200, p. 106032.
LI, Zukui et Marianthi IERAPETRITOU (2008). “Process scheduling under uncertainty :
Review and challenges”. In : Computers & Chemical Engineering 32.4-5, p. 715-727.
MENDEZ, Carlos A et al. (2006). “State-of-the-art review of optimization methods for
short- term scheduling of batch processes”. In : Computers & chemical engineering
30.6-7, p. 913-946.
MILLMAN, K Jarrod et Michael AIvAZIS (2011). “Python for scientists and engineers”.
In : Computing in Science & Engineering 13.2, p. 9-12.
ÖZGüvEN, Cemal, Lale ÖZBAKıR et Yasemin YAvUZ (2010). “Mathematical models for job-
shop scheduling problems with routing and process plan flexibility”. In : Applied
Mathematical Modelling 34.6, p. 1539-1548.
PIERRE BAPTISTE Robert pellerin, Michel Guevremont (2019).
“L’ORDONNANCEMENT DE LA PRODUCTION : BIEN PLUS QU’UNE
QUESTION DE CALCUL”. In :
PINEDO, ML (2016). Scheduling : theory, algorithms, and systems. 5-th ed. Cham.
Springer.
ROSHANAEI, V, Ahmed AZAB et H ELMARAGHY (2013). “Mathematical modelling and
a meta-heuristic for flexible job shop scheduling”. In : International Journal of
Production Research 51.20, p. 6247-6274.
SHEN, Liji, Stéphane DAUZERE-PERES et Janis S NEUFELD (2018). “Solving the flexible
job shop scheduling problem with sequence-dependent setup times”. In : European
Journal of Operational Research 265.2, p. 503-516.
TALBI, El-Ghazali (2009). Metaheuristics : From Design to Implementation. Wiley.
34 | P a g e
ZAGHDOUD, Radhia (2015). “Hybridation d’algorithme génétique pour les problèmes des
véhicules intelligents autonomes : applications aux infrastructures portuaires de
moyenne taille”. In :
ZHANG, Guohui et al. (2020). “An improved genetic algorithm for the flexible job shop
scheduling problem with multiple time constraints”. In : Swarm and Evolutionary
Computation 54, p. 100664.
35 | P a g e
Webographie
STATISTA (p. d.). Revenue of the worldwide pharmaceutical market from 2001 to 2020. URL
: https://www.statista.com/statistics/263102/pharmaceutical-market-worldwide-revenue-since-2001/.
36 | P a g e
Annexe : Solution des lignes de
production sous forme sèche
le = 'Input.xlsx'
tput = 'output_Solide.xlsx'
ead and create the dataframes
ug = pd.read_excel(file,sheet_name='Drug') ep =
pd.read_excel(file,sheet_name="Step")
ocess = pd.read_excel(file,sheet_name="Process") chine =
pd.read_excel(file,sheet_name="Machine") mande
=
pd.read_excel(file,sheet_name="Demand")
ug_mach = pd.read_excel(file,sheet_name="Couple Machine-Produit") te =
pd.read_excel(file,sheet_name="Dates")
sm = pd.merge(step,machine)dd
= pd.merge(drug,demande)
batch creation
= []
r i in dfdd.index :
m.append(np.ceil(dfdd.at[i,'reqdemand'] / dfdd.at[i,'batchsize']))dd['nbatch']= m
=0
37 | P a g e
=1
ch = []
= []
tch = pd.DataFrame()
=1
r index, row in dfdd.iterrows() :j =
row['nbatch']
while i <= j :
ID.append(row['ID'])
btch.append(k) #btch.append( i*100000 + index * 100 +
‹→ row['month'] )
i +=1
k +=1
i = 1 tch['ID'] = ID
tch['lot'] = btch # dataframe of batches with the product name
tch=pd.merge(batch,drug)
tch=pd.merge(batch,process)
tch=batch.sort_values('lot').reset_index()tch = batch.drop(['index'],
axis=1)
reate activity
=1
= []
= []
t = []
tegory =[] ape
= [] lding=[]
eration =[]7
tivity = pd.DataFrame()
rint(batch.to_string())
r index , row in batch.iterrows()
:
while i<= j:s= 6
+i
m = str(batch.iloc[index][s])
if m != 'nan' : #a.append(row['lot']*100 + i
)ID.append(row['ID'])
lot.append(row['lot'])
category.append(row['category'])
etape.append(m)
holding.append(row['holdingtime'])
38 | P a g e
operation.append(i)i+= 1
i=1
ctivity['id_a'] = a tivity['ID'] =
ID tivity['lot'] = lot tivity['operation'] =
operationtivity['step'] = etape
tivity['holdingtime'] = holding
tivity["order"] = np.arange(len(activity))
how='left', on='step')
‹→ #.set_index("order").iloc[np.arange(len(activity)), :]
rint(activity.to_string())
activity.sort_values("order")
rint(activity.to_string())
chines = machine.set_index(['id_m'])
nom = activity #.drop(['nmachine','id_a','category','n_machine','id_m'],
‹→ axis=1)
nom = genom[['ID','lot','operation', 'machine', 'proc-time',
‹→ 'holdingtime','changeover']]
iter = pd.ExcelWriter(output)
nom.to_excel(writer,'data')
chine.to_excel(writer,'machine')
te.to_excel(writer,'Agenda')iter.save()
int('DataFrame is written successfully to Excel file.')
port pandas as pd
port os
port random
port numpy as np
om deap import algorithms
39 | P a g e
om deap import base om
deap import creatorom
deap import tools port
math
port sys
port matplotlib.pyplot as plt
EET_NAME = 1
chine = pd.read_excel(os.path.join('output_Solide.xlsx'),
‹→ sheet_name=SHEET_NAME) chine
= machine[['machine','id_m']]
de la réparation individuelle
1. Supprime les opérations répétées en privilégiant l'ordre d'apparition
‹→ sur le chromosome
2. s'assure que les opérations respectent les prérequis, en privilégiant
‹→ l'ordre d'apparition sur le chromosome
40 | P a g e
3. Il ajoute le temps de changeover selon l'ordre des opérations
f fix_individual(individual) :
# Créer un nouveau individual :
individual = shuffle(mach)
# réparer l'individu
for i in individual_df.index :
if(not (i in individual_df.index)) :
continue
if(math.isnan(prev_lot_op)) : prev_lot_op
=0
# recherche de prérequis
lot_req_op = (individual_df.loc[(individual_df['lot'] == lot) &
(individual_df['operation'] <
‹→ operation)]).sort_values(by='operation',ascending=True)
‹→
indexes = lot_req_op.index.values
fixed_individual.append(index)
return fixed_individual
33 | P a g e
ndividual
N indexes that are mapped to jobs_df
f decode(individual) :
34 | P a g e
max_index = schedule_df.loc[schedule_df['machine'] ==
‹→ machine]['finish']
if(max_index.empty == True) : max_index
=i
last_product = jobs_df.loc[max_index,'ID']
else :
max_index = pd.to_numeric(max_index)max_index
= max_index.idxmax()
last_product = schedule_df.loc[max_index,'ID']
#print('id :', i, 'max_index :', max_index)
#récupere le ID du dernier produit ffabriqué par la machine on
‹→ utilisant l'index :
#last_product = scedule_df.loc[max_index,'ID']
#print(last_product) #print(jobs_df.loc[i]['ID'])
35 | P a g e
#Create the schedule list of all the operations
schedule_lst = [[ID, lot, operation, machine, 0 , start, start +
‹→ proc_time]]
df = pd.DataFrame(schedule_lst, columns = ['ID','lot', 'operation',
‹→ 'machine','changeover', 'start', 'finish']) schedule_df =
schedule_df.append(df, ignore_index=True)
#print('lot :',lot,'operation :',operation,'machine :',machine)
return schedule_df
f objective_function(individual) :
schedule_df = decode(individual) grouped_df =
schedule_df.groupby("machine")maximums = grouped_df.max()
maximums = maximums.reset_index() somme =
sum(maximums['finish']) makespan =
schedule_df['finish'].max()return makespan,
olbox = base.Toolbox()
Initialiseur individuel et de population
Initialiseur d'opérateurs
olbox.register("evaluate", objective_function)
‹→ # Function objective
olbox.register("mate", tools.cxUniformPartialyMatched, indpb=0.05)
36 | P a g e
olbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05)olbox.register("select", tools.selTournament,
Meilleure solution
int("Meuilleur solution :")
= hof[0] int(hof[0])
int(decode(hof[0])) int(decode(hof[0])
['finish'].max())
=decode(hof[0])
hedule_df = df
kespan = schedule_df['finish'].max()
= schedule_df[schedule_df['ID']=='Changeover'].index
=len(n)
chine_last = pd.concat([schedule_df[schedule_df["machine"]==
‹→ 2],schedule_df[schedule_df["machine"]== 3],
‹→ schedule_df[schedule_df["machine"]==
‹→ 12],schedule_df[schedule_df["machine"]== 14] ], ignore_index=True)ouped_last =
machine_last.groupby("machine")
ouped_df = schedule_df.groupby("machine")ouped =
schedule_df.groupby("ID")
xm = grouped_last.max()xm
= maxm.reset_index()
37 | P a g e
x =grouped.max()
x = max.reset_index()
mme = sum(maximums['finish'])m =
sum(max['finish'])
mm = sum(maxm['finish'])
['startdate'] = b ['finishdate'] = b
= df.rename(columns={'machine' :'Task','startdate' :
‹→ 'Start','finishdate' :'Finish'})l = list(gf['lot'])
r i in range(len(lol)) :
lol[i] = str(lol[i])['lot']=lol
= lambda : random.randint(0,200)
lors = ['#%02X%02X%02X' % (r(),r(),r())]
r i in range(1, gf.lot.nunique()+1) : colors.append('#%02X%02X%02X' % (r(),r(),r()))
38 | P a g e
= pd.merge(df,machine)
= gd.rename(columns={'id_m' :'Task','startdate' :
‹→ 'Start','finishdate' :'Finish'})
f= df.rename(columns={'machine' :'Task','startdate' :
‹→ 'Start','finishdate' :'Finish'})
l = list(gf['lot'])
r i in range(len(lol)) :
lol[i] =
str(lol[i])
['lot']=lol
port
plotly.figure_factory as
ffport plotly.express as
px
port plotly
port pandas as pd
Upade/Change Layout
g.update_yaxes(autorange='reversed')
g.update_layout(
title_font_size=4
2, font_size=18,
title_font_family='A
rial'
)
38 | P a g e
Interactive Gantt
g = ff.create_gantt(gf,colors=colors, index_col='ID', show_colorbar=True,
‹→ group_tasks=True, bar_width=0.4,showgrid_x=True, showgrid_y=True)g
Save Graph and Export to HTML
otly.offline.plot(fig, filename='Task_Overview_Gantt.html')iter =
pd.ExcelWriter(output)
.to_excel(writer,'data')
.to_excel(writer,'
data')iter.save()
int('DataFrame is written successfully to Excel file.')
39 | P a g e