Simulation dun système dinventaire
Simulation d'un système d'inventaire2 É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 = 10/mois Une demande correspond à D unités: d1234 P(D=d)1/61/31/31/6 Au début de chaque mois, l'entreprise fait l'inventaire.
3 É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 - Isi I < s 0sinon. 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; le niveau d'inventaire sera négatif.
Simulation d'un système d'inventaire4 É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. c h = coût de stockage par unité de temps (inventaire > 0) c a = 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'inventaire5 É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'inventaire6 Gestion des événements DÉBUT DUN MOIS (DÉCISION DUNE COMMANDE OU NON) Si I < s,PLACER UNE COMMANDE PRÉVOIR SA RÉCEPTION PRÉVOIR LE PROCHAIN DÉBUT DE MOIS; RÉCEPTION DUNE COMMANDE METTRE À JOUR LES COÛTS CUMULÉS; METTRE À JOUR LINVENTAIRE; PRÉVOIR LA PROCHAINE RÉCEPTION À ARRIVÉE DUNE DEMANDE METTRE À JOUR LES COÛTS CUMULÉS; GÉNÉRER LA TAILLE DE LA DEMANDE; DÉCRÉMENTER LE NIVEAU DINVENTAIRE; PRÉVOIR LA PROCHAINE DEMANDE.
Simulation d'un système d'inventaire7 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 const double Maximum_des_reels = 3.4E38; long souche; enum Evenement{Debut_du_mois, Reception_commande, Demande_client, Fin_de_simulation};
Simulation d'un système d'inventaire8 Construction du simulateur float Temps;// Instant courant de la simulation float Duree_de_la_simulation;// Durée de la simulation en mois enum Evenement Evenement_courant;// Événement que nous sommes en train de traiter float Instant_Prochain_Evenement[3];// Instant d'occurrence du prochain événement prévu de // chaque type float Duree_moyenne_entre_2demandes;// Durée moyenne entre les demandes int Taille_demande[4];// F_rep_Demande[i] est la probabilité que la taille dune 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 floatDelai_livraison_min,// Bornes sur le délai de réception Delai_livraison_max;// d'une commande intPetit_s, Grand_S;// Seuils définissant la politique (s, S)
Simulation d'un système d'inventaire9 Construction du simulateur int Inventaire_initial;// Niveau initial de l'inventaire int Inventaire;// Niveau courant de l'inventaire int Items_en_attente_de_livraison;// Nombre d'items en attente de livraison float Cout_total_des_commandes;// Coût total pour les commandes à date float Integrale_inventaire;// Intégrale du nombre d'items en inventaire depuis 0 // jusqu'à l'instant courant float Integrale_arrerage;// Intégrale du nombre d'items en arrérage depuis 0 // jusqu'à l'instant courant float Temps_precedent;// Instant de la dernière mise à jour des intégrales ci-dessus void main() { float Duree_entre_deux_ventes();float Delai_livraison(); int Taille_de_la_demande(); void Lire_Donnees();void Initialisation_Simulation(); void Debut_mois();void Reception(); void Demande();void Rapport();
Simulation d'un système d'inventaire10 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'inventaire11 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) / )) * Duree_moyenne_entre_2demandes); } }
Simulation d'un système d'inventaire12 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) / ); } int Taille_de_la_demande() { // Génère la taille d'une demande. float U; int i = 0; U = (float)((rand() % 10000) / ); while (U > F_rep_Demande[i]) i = i+1; return Taille_demande[i]; }
Simulation d'un système d'inventaire13 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 : \n\n"); 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'inventaire14 Construction du simulateur Duree_moyenne_entre_2demandes = 0.1f; Taille_demande[0] = 1;F_rep_Demande[0] = 1.0f / 6.0f; Taille_demande[1] = 2;F_rep_Demande[1] = 3.0f / 6.0f; Taille_demande[2] = 3;F_rep_Demande[2] = 5.0f / 6.0f; Taille_demande[3] = 4;F_rep_Demande[3] = 1.0f; Cout_fixe_par_commande = 32.0f; Cout_additionnel_par_item = 3.0f; Cout_de_stockage_par_mois = 1.0f; Cout_de_penurie_par_mois = 5.0f; Delai_livraison_min = 0.5f; Delai_livraison_max = 1.0f; }
Simulation d'un système d'inventaire15 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.0f;Temps_precedent = 0.0f; souche = time(NULL);srand((int)souche); Integrale_inventaire = 0.0f;Integrale_arrerage = 0.0f; Cout_total_des_commandes = 0.0f; Inventaire = Inventaire_initial; Instant_Prochain_Evenement[Debut_du_mois] = 0.0f; Instant_Prochain_Evenement[Demande_client] = Duree_entre_deux_ventes(); Instant_Prochain_Evenement[Reception_commande] = (float) Maximum_des_reels; }
Simulation d'un système d'inventaire16 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.0f; }
Simulation d'un système d'inventaire17 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'inventaire18 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'inventaire19 Construction du simulateur void Rapport() { //Imprime les résultats. printf("Resultats de la simulation dun modele dinventaire : \n\n"); printf("Politique : (%d, %d)", Petit_s, Grand_S); printf("\nDuree de la simulation : %f", Duree_de_la_simulation); printf("\nCommandes : %f", Cout_total_des_commandes / Duree_de_la_simulation); printf("\nStockage : %f", Cout_de_stockage_par_mois * Integrale_inventaire / Duree_de_la_simulation); printf("\nPenurie : %f", Cout_de_penurie_par_mois * Integrale_arrerage / Duree_de_la_simulation); printf("\nTotal : %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'inventaire20 Résultats obtenus de la simulation dun modèle dinventaire PolitiqueCoûts moyens par mois pour les: CommandesStockagePénurieTotal Inventaire initial = 60Durée de la simulation = 120 mois (20, 40) (20, 60) (20, 80) (20, 100) (40, 60) (40, 80) (40, 100) (60, 80) (60, 100)