Simulation dun systme dinventaire Simulation dun systme dinventaire

  • Slides: 20
Download presentation
Simulation d’un système d’inventaire Simulation d'un système d'inventaire

Simulation d’un système d’inventaire Simulation d'un système d'inventaire

Énoncé du problème L'entreprise vend un seul produit. Elle veut déterminer combien d'items, elle

Énoncé du problème L'entreprise vend un seul produit. Elle veut déterminer combien d'items, elle doit avoir en inventaire à chaque mois. Période : n mois. Délai entre chaque demande: v. a. exponentielle I. I. D. avec l = 10/mois Une demande correspond à D unités: d 1 2 P(D=d) 1/6 1/3 3 1/3 4 1/6 Au début de chaque mois, l'entreprise fait l'inventaire. Simulation d'un système d'inventaire 2

Énoncé du problème (suite) Elle commande Z items à un coût de K +

Énoncé du problème (suite) Elle commande Z items à un coût de K + CZ, (Z > 0). On reçoit la commande après U[0. 5, 1] mois. Politique de l'entreprise (s, S): Si l'inventaire est égale à I au début du mois, Z= S-I 0 si I < s sinon. Lorsqu'une demande arrive, si elle peut être satisfaite en entier, elle l'est immédiatement. Si la demande ne peut être satisfaite en entier, alors les items disponibles sont remis; les items manquants sont remis à la réception de nouveaux items; 3 le niveau d'inventaire sera négatif.

Énoncé du problème (suite) I(t) = niveau d'inventaire au temps t. I+(t) = max

Énoncé du problème (suite) I(t) = niveau d'inventaire au temps t. I+(t) = max {I(t), 0}= # items réellement en inventaire. I-(t) = max {-I(t), 0}= # items en arrérage. ch = coût de stockage par unité de temps (inventaire > 0) ca = coût d'arrérage par unité de temps (inventaire < 0) Nombre moyen d'items en inventaire par mois pour une période de n moi + I = Simulation d'un système d'inventaire 4

Énoncé du problème (suite) Nombre moyen d'items en arrérage par mois pour une période

Énoncé du problème (suite) Nombre moyen d'items en arrérage par mois pour une période de n mois: - I = But: estimer le coût moyen par mois pour une politique (s, S) donnée: Simulation d'un système d'inventaire 5

Gestion des événements DÉBUT D’UN MOIS (DÉCISION D’UNE COMMANDE OU NON) Si I <

Gestion des événements DÉBUT D’UN MOIS (DÉCISION D’UNE COMMANDE OU NON) Si I < s, PLACER UNE COMMANDE PRÉVOIR SA RÉCEPTION PRÉVOIR LE PROCHAIN DÉBUT DE MOIS; RÉCEPTION D’UNE COMMANDE METTRE À JOUR LES COÛTS CUMULÉS; METTRE À JOUR L’INVENTAIRE; PRÉVOIR LA PROCHAINE RÉCEPTION À ARRIVÉE D’UNE DEMANDE METTRE À JOUR LES COÛTS CUMULÉS; GÉNÉRER LA TAILLE DE LA DEMANDE; DÉCRÉMENTER LE NIVEAU D’INVENTAIRE; PRÉVOIR LA PROCHAINE DEMANDE. Simulation d'un système d'inventaire 6

Construction du simulateur /*************************************** Simulation d'un système d'inventaire à un seul produit. On peut

Construction du simulateur /*************************************** Simulation d'un système d'inventaire à un seul produit. On peut référer à Law et Kelton pour plus de détails. Le temps est mesuré en mois. Afin de raccourcir le dialogue lors de la lecture des données, plusieurs paramètres sont initialisés directement dans la procédure Lire_Donnees(). ***************************************/ #include <stdio. h> #include <stdlib. h> #include <time. h> #include <math. h> const double Maximum_des_reels = 3. 4 E 38; long souche; enum Evenement{Debut_du_mois, Reception_commande, Demande_client, Fin_de_simulation}; Simulation d'un système d'inventaire 7

Construction du simulateur float Temps; float Duree_de_la_simulation; enum Evenement_courant; float Instant_Prochain_Evenement[3]; // Instant courant

Construction du simulateur float Temps; float Duree_de_la_simulation; enum Evenement_courant; float Instant_Prochain_Evenement[3]; // Instant courant de la simulation // Durée de la simulation en mois // Événement que nous sommes en train de traiter // Instant d'occurrence du prochain événement prévu de // chaque type float Duree_moyenne_entre_2 demandes; // Durée moyenne entre les demandes int Taille_demande[4]; // F_rep_Demande[i] est la probabilité que la taille d’une float F_rep_Demande[4]; // demande soit <= à Taille_demande[i]. float Cout_fixe_par_commande; // Coût fixe pour chaque commande float Cout_additionnel_par_item; // Coût additionnel par item commandé float Cout_de_stockage_par_mois; // Coût de stockage par mois. float Cout_de_penurie_par_mois; // Coût par mois pour la pénurie float Delai_livraison_min, // Bornes sur le délai de réception Delai_livraison_max; // d'une commande int Petit_s, Grand_S; // Seuils définissant la politique (s, S) Simulation d'un système d'inventaire 8

Construction du simulateur int Inventaire_initial; int Inventaire; int Items_en_attente_de_livraison; float Cout_total_des_commandes; float Integrale_inventaire; float

Construction du simulateur int Inventaire_initial; int Inventaire; int Items_en_attente_de_livraison; float Cout_total_des_commandes; float Integrale_inventaire; float Integrale_arrerage; // Niveau initial de l'inventaire // Niveau courant de l'inventaire // Nombre d'items en attente de livraison // Coût total pour les commandes à date // Intégrale du nombre d'items en inventaire depuis 0 // jusqu'à l'instant courant // Intégrale du nombre d'items en arrérage depuis 0 // jusqu'à l'instant courant // Instant de la dernière mise à jour des intégrales ci-dessus float Temps_precedent; void main() { float Duree_entre_deux_ventes(); int Taille_de_la_demande(); void Lire_Donnees(); void Debut_mois(); void Demande(); float Delai_livraison(); void Initialisation_Simulation(); void Reception(); void Rapport(); Simulation d'un système d'inventaire 9

Construction du simulateur Lire_Donnees(); Initialisation_Simulation(); do { Evenement_courant = Debut_du_mois; if( Instant_Prochain_Evenement[Reception_commande] <= Instant_Prochain_Evenement[Evenement_courant])

Construction du simulateur Lire_Donnees(); Initialisation_Simulation(); do { Evenement_courant = Debut_du_mois; if( Instant_Prochain_Evenement[Reception_commande] <= Instant_Prochain_Evenement[Evenement_courant]) Evenement_courant = Reception_commande; if( Instant_Prochain_Evenement[Demande_client] <= Instant_Prochain_Evenement[Evenement_courant]) Evenement_courant = Demande_client; Temps = Instant_Prochain_Evenement[Evenement_courant]; if((Evenement_courant == Debut_du_mois) && (Temps >= Duree_de_la_simulation)) Evenement_courant = Fin_de_simulation; Simulation d'un système d'inventaire 10

Construction du simulateur switch (Evenement_courant) { case Debut_du_mois : Debut_mois(); break; case Reception_commande :

Construction du simulateur switch (Evenement_courant) { case Debut_du_mois : Debut_mois(); break; case Reception_commande : Reception(); break; case Demande_client : Demande(); break; case Fin_de_simulation : Rapport(); break; }; } while (Evenement_courant != Fin_de_simulation); } float Duree_entre_deux_ventes() { // Génère la durée entre deux ventes successives. return (float) (-log(1. 0 - (float)((rand() % 10000) / 10000. 0)) * Duree_moyenne_entre_2 demandes); } Simulation d'un système d'inventaire 11

Construction du simulateur float Delai_livraison() { // Génère une durée entre une commande et

Construction du simulateur float Delai_livraison() { // Génère une durée entre une commande et sa livraison. return Delai_livraison_min + (Delai_livraison_max - Delai_livraison_min) * (float)((rand() % 10000) / 10000. 0); } int Taille_de_la_demande() { // Génère la taille d'une demande. float U; int i = 0; U = (float)((rand() % 10000) / 10000. 0); while (U > F_rep_Demande[i]) i = i+1; return Taille_demande[i]; } Simulation d'un système d'inventaire 12

Construction du simulateur void Lire_Donnees() { /* Lecture de la durée de la simulation,

Construction du simulateur void Lire_Donnees() { /* Lecture de la durée de la simulation, de l'invention initial et des valeurs de seuil et initialisation des paramètres du modèle de simulation. */ printf(" Veuillez fournir les renseignements suivants : nn"); printf(" Duree de la simulation (mois) = "); scanf("%f", &Duree_de_la_simulation); printf(" Inventaire initial = "); scanf("%d", &Inventaire_initial); printf(" Valeur du seuil minimal s = "); scanf("%d", &Petit_s); printf(" Valeur du seuil maximal S = "); scanf("%d", &Grand_S); Simulation d'un système d'inventaire 13

Construction du simulateur Duree_moyenne_entre_2 demandes = 0. 1 f; Taille_demande[0] = 1; F_rep_Demande[0] =

Construction du simulateur Duree_moyenne_entre_2 demandes = 0. 1 f; Taille_demande[0] = 1; F_rep_Demande[0] = 1. 0 f / 6. 0 f; Taille_demande[1] = 2; F_rep_Demande[1] = 3. 0 f / 6. 0 f; Taille_demande[2] = 3; F_rep_Demande[2] = 5. 0 f / 6. 0 f; Taille_demande[3] = 4; F_rep_Demande[3] = 1. 0 f; Cout_fixe_par_commande = 32. 0 f; Cout_additionnel_par_item = 3. 0 f; Cout_de_stockage_par_mois = 1. 0 f; Cout_de_penurie_par_mois = 5. 0 f; Delai_livraison_min = 0. 5 f; Delai_livraison_max = 1. 0 f; } Simulation d'un système d'inventaire 14

Construction du simulateur void Initialisation_Simulation() { /* Initialise le système à vide, initialise l'horloge

Construction du simulateur void Initialisation_Simulation() { /* Initialise le système à vide, initialise l'horloge et tous les compteurs à 0. On prévoit le premier début de mois et la première vente (demande). Temps = 0. 0 f; Temps_precedent = 0. 0 f; souche = time(NULL); */ srand((int)souche); Integrale_inventaire = 0. 0 f; Integrale_arrerage = 0. 0 f; Cout_total_des_commandes = 0. 0 f; Inventaire = Inventaire_initial; Instant_Prochain_Evenement[Debut_du_mois] = 0. 0 f; Instant_Prochain_Evenement[Demande_client] = Duree_entre_deux_ventes(); Instant_Prochain_Evenement[Reception_commande] = (float) Maximum_des_reels; } Simulation d'un système d'inventaire 15

Construction du simulateur void Debut_mois() { if(Inventaire < Petit_s) { Items_en_attente_de_livraison = Grand_S -

Construction du simulateur void Debut_mois() { if(Inventaire < Petit_s) { Items_en_attente_de_livraison = Grand_S - Inventaire; Cout_total_des_commandes += Cout_fixe_par_commande + Items_en_attente_de_livraison * Cout_additionnel_par_item; Instant_Prochain_Evenement[Reception_commande] = Temps + Delai_livraison(); }; Instant_Prochain_Evenement[Debut_du_mois] = Temps + 1. 0 f; } Simulation d'un système d'inventaire 16

Construction du simulateur void Reception() { if(Inventaire > 0) Integrale_inventaire += Inventaire * (Temps

Construction du simulateur void Reception() { if(Inventaire > 0) Integrale_inventaire += Inventaire * (Temps - Temps_precedent); else Integrale_arrerage += Inventaire * (Temps_precedent - Temps); Temps_precedent = Temps; Inventaire += Items_en_attente_de_livraison; Instant_Prochain_Evenement[Reception_commande] = (float) Maximum_des_reels; } Simulation d'un système d'inventaire 17

Construction du simulateur void Demande() { if(Inventaire > 0) Integrale_inventaire += Inventaire * (Temps

Construction du simulateur void Demande() { if(Inventaire > 0) Integrale_inventaire += Inventaire * (Temps - Temps_precedent); else Integrale_arrerage += Inventaire * (Temps_precedent - Temps); Temps_precedent = Temps; Inventaire = Inventaire - Taille_de_la_demande(); Instant_Prochain_Evenement[Demande_client] = Temps + Duree_entre_deux_ventes(); } Simulation d'un système d'inventaire 18

Construction du simulateur void Rapport() { // Imprime les résultats. printf("Resultats de la simulation

Construction du simulateur void Rapport() { // Imprime les résultats. printf("Resultats de la simulation d’un modele d’inventaire : nn"); printf("Politique : (%d, %d)", Petit_s, Grand_S); printf("n. Duree de la simulation : %f", Duree_de_la_simulation); printf("n. Commandes : %f", Cout_total_des_commandes / Duree_de_la_simulation); printf("n. Stockage : %f", Cout_de_stockage_par_mois * Integrale_inventaire / Duree_de_la_simulation); printf("n. Penurie : %f", Cout_de_penurie_par_mois * Integrale_arrerage / Duree_de_la_simulation); printf("n. Total : %f", (Cout_total_des_commandes + (Cout_de_stockage_par_mois * Integrale_inventaire) + (Cout_de_penurie_par_mois * Integrale_arrerage)) / Duree_de_la_simulation); } Simulation d'un système d'inventaire 19

Résultats obtenus de la simulation d’un modèle d’inventaire Inventaire initial = 60 Durée de

Résultats obtenus de la simulation d’un modèle d’inventaire Inventaire initial = 60 Durée de la simulation = 120 mois Politique moyens par mois pour les: Stockage Pénurie Total 7. 97 20. 96 130. 35 17. 45 15. 49 124. 93 25. 57 12. 51 124. 97 34. 71 9. 10 131. 96 26. 68 1. 47 126. 11 36. 30 0. 96 123. 62 43. 62 1. 46 131. 72 45. 31 0. 00 145. 64 53. 96 0. 02 144. 29 (20, 40) (20, 60) (20, 80) (20, 100) (40, 60) (40, 80) (40, 100) (60, 80) (60, 100) Coûts Commandes 101. 43 91. 98 86. 89 88. 15 97. 96 86. 36 86. 64 100. 33 90. 32 Simulation d'un système d'inventaire 20