/// <summary> /// U1 - Príchod zákazníka /// Naplánujem: /// - Začiatok spracovania objednávky - naplánujem udalosť okamžite, ak je volny pracovnik. /// - Front čakajúcich zákazníkov - Vložím do frontu čakajúcich zákazníkov zákazníka s aktuálnym časom príchodu. /// - Príchod nového zákazníka s vygenerovaným časom z Generátora 1. /// Štatistiky: /// - S1a - Začnem merať čas čakania zákazníka v rade čakajúcich zákazníkov na zadanie objednávky. /// - S2a – Pripočítam jedného zákazníka v rade čakajúcich zákazníkov. /// - S3a - Začnem počítať čas strávený zákazníkov v servise. /// </summary> public override void Execute() { if (AktualnyZakaznik == null) { throw new Exception("NULL zakaznik. "); } AktualnyZakaznik.S1_ZacniCakanie_front_cakajucich_zakaznikov(EventTime); AktualnyZakaznik.S3_ZacniCakanie_bytia_v_servise(EventTime); ((AppCore)ReferenceSimCore).S2_AddValue(); if (((AppCore)ReferenceSimCore).JeVolnyPracovnik1()) { //obsad volneho pracovnik ((AppCore)ReferenceSimCore).ObsadPracovnikaSkupiny1(); var zadanie = new ZaciatokSpracovaniaObjednavkyEvent(EventTime, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(zadanie); } else { ((AppCore)ReferenceSimCore).S2_AddValue(); //inak vlozim zakaznika do frontu cakajucich zakaznikov ((AppCore)ReferenceSimCore).Front_CakajuciZakaznici_PridajZakaznika(AktualnyZakaznik); } //naplanujem novy prichod zákazníka var a = ((AppCore)ReferenceSimCore).Gen.Generator1_ZakazniciPrichod(); var time = EventTime + a; var prichod = new PrichodZakaznikaEvent(time, ReferenceSimCore, new Zakaznik()); ReferenceSimCore.ScheduleEvent(prichod); }
/// <summary> /// U8 - Preparkovanie auta späť zákazníkovi /// Naplánujem: /// - Odchod zákazníka v čase vygenerovanom Generátorom 6 – prevzatie auta. /// </summary> public override void Execute() { //odchod zakaznika var time = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator6_Prevzatie(); var odchod = new OdchodZakaznikaEvent(time, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(odchod); }
/// <summary> /// U5 - Preparkovanie auta k dielni /// </summary> /// Vyberiem opravené auto z frontu opravených áut. /// Naplánujem: /// - Začiatok opravy v okamžitom čase, ak je voľný pracovník skupiny 2. Obsadím pracovníka 2 skupiny. /// - Front pokazených áut - Pridám auto (aktuálneho zákazníka) do frontu pokazených áut, ak existuje a zároveň nie je voľný pracovník skupiny 2. /// - Preparkovanie auta späť zákazníkovi – prioritne (pracovníci skupiny 1 uprednostňujú vrátenie opraveného auta zákazníkovi pred prijatím novej objednávky). Vyberiem opravené auto z frontu opravených áut. Ak nie je front opravených prázdny, tak naplánujem udalosť s vygenerovaným časom Generátora 5 – preparkovanie s opraveným autom. /// - Začiatok spracovania objednávky - s druhou prioritou, ak je front opravených áut prázdny a zároveň nie je front čakajúcich zákazníkov prázdny. Vyberiem zákazníka z frontu čakajúcich zákazníkov. Naplánujem okamzite. /// - Uvoľnenie pracovníka – ak front opravených áut prázdny, a zároveň front čakajúcich zákazníkov, tak uvoľním pracovníka skupiny 1. public override void Execute() { if (AktualnyZakaznik != null) { if (((AppCore)ReferenceSimCore).JeVolnyPracovnik2()) { ((AppCore)ReferenceSimCore).ObsadPracovnikaSkupiny2(); //naplanujem zaciatok opravy var oprava = new ZaciatokOpravyEvent(EventTime, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(oprava); } else { //vlozim do frontu auto pokazenych aut ((AppCore)ReferenceSimCore).Front_PokazeneAuta_Pridaj(AktualnyZakaznik); } } var opraveneAuto = ((AppCore)ReferenceSimCore).Front_OpraveneAuta_Vyber(); //PRIORITNE if (opraveneAuto != null) { //cas preparkovanie spat var casPreparkovania = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator5_Preparkovanie(); //vyberiem auto z frontu //preparkovanie auta naspat var preparkovanieNaspat = new PreparkovanieAutaSpatEvent(casPreparkovania, ReferenceSimCore, opraveneAuto); ReferenceSimCore.ScheduleEvent(preparkovanieNaspat); } else { ((AppCore)ReferenceSimCore).S2_AddValue(); var cakajuciZakaznik = ((AppCore)ReferenceSimCore).Front_CakajuciZakaznici_VyberZakaznika(); //NEPRIORITNE if (cakajuciZakaznik != null) { //vyberiem z frontu cakajucich zakaznikov //naplanujem zaciatok obsluhy var zaciatokObsluhy = new ZaciatokSpracovaniaObjednavkyEvent(EventTime, ReferenceSimCore, cakajuciZakaznik); ReferenceSimCore.ScheduleEvent(zaciatokObsluhy); } else { //uvolnim pracovnika 1 ((AppCore)ReferenceSimCore).UvolniPracovnikaSkupiny1(); } } }
/// <summary> /// U0 - Koniec dňa /// Vynuluje sa front čakajúcich zákazníkov. /// Naplánujem: /// - Koniec dňa – s časom o osem hodín (28 800 sekúnd). /// Štatistiky: /// - S11 – počet zákazníkov v rade na konci dňa. /// </summary> public override void Execute() { if (ReferenceSimCore != null) { //vynulujem den ((AppCore)ReferenceSimCore).Front_CakajuciZakaznici_Reset(); //naplanujem koniec dna var time = EventTime + AppCore.DlzkaDnaSekundy; var newEvent = new KoniecDnaEvent(time, ReferenceSimCore, new Zakaznik()); ReferenceSimCore.ScheduleEvent(newEvent); } }
/** * Odchod zákazníka * - môžu nastať tieto dve situácie * a. niekto čaká * b. je voľný */ public override void Execute() { Customer customer = ((SimCoreShop)ReferenceSimCore).NextCustomer(); ((SimCoreShop)ReferenceSimCore).IsServed = false; if (customer != null) { StartPayment st = new StartPayment(EventTime, ReferenceSimCore, customer); ReferenceSimCore.ScheduleEvent(st, EventTime); ((SimCoreShop)ReferenceSimCore).IsServed = true; } }
/// <summary> /// U3 - Koniec spracovania objednávky /// Vyberiem zákazníka z frontu čakajúcich zákazníkov. /// Naplánujem: /// - Prevzatie auta od zákazníka s vygenerovaným časom Generátorom 4 – prevzatie auta. /// Štatistiky: /// - S1b – Skončím meranie času čakania zákazníka v rade na zadanie objednávky. /// - S2b – Skončím počítanie doby zákazníkov v rade čakajúcich zákazníkov. /// </summary> public override void Execute() { if (AktualnyZakaznik == null) { throw new Exception("NULL zakaznik. "); } //naplanujem prevzatie auta var timePrevzatia = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator4_PrevzatieAuta(); var prevzatie = new PrevzatieAutaOdZakaznikaEvent(timePrevzatia, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(prevzatie); }
/// <summary> /// U2 - Začiatok spracovania objednávky /// Naplánujem: /// - Koniec spracovania objednávky, /// tak naplánujem udalosť v čase vygenerovaným Generátorom 3 – prevzatie objednávky. /// Znížim počet voľných pracovníkov o jedna. /// </summary> public override void Execute() { if (AktualnyZakaznik == null) { throw new Exception("NULL zakaznik. "); } ((AppCore)ReferenceSimCore).S1_AddValue( AktualnyZakaznik.S1_SkonciCakanie_front_cakajucich_zakaznikov(EventTime)); //naplanujem spracovanie objednavky var time = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator3_PrevzatieObjednavky(); var spracovanie = new KoniecSpracovaniaObjednavky(time, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(spracovanie); }
/// <summary> /// U6 - Začiatok opravy /// </summary> /// Naplánujem: /// - Koniec opravy – Vygenerujem Generátorom 2 počet opráv, ktoré má auto, a pre každú opravu vygenerujem Generátorom 7 – dobu opravy auta v sekundách.Súčet počtu opráv s dobami naplánujem udalosť koniec opravy, kde bude auto kompletne opravené.Znížim počet voľných pracovníkov o jedna. public override void Execute() { //koniec opravy var dobaOpravySpolu = 0; var pocetOprav = ((AppCore)ReferenceSimCore).Gen.Generator2_PocetOprav(); for (var i = 0; i < pocetOprav; i++) { dobaOpravySpolu += ((AppCore)ReferenceSimCore).Gen.Generator7_DobaOpravy(); } var time = EventTime + dobaOpravySpolu; var koniecOpravy = new KoniecOpravyEvent(time, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(koniecOpravy, time); }
/// <summary> /// U4 - Prevzatie auta od zákazníka /// Naplánujem: /// - Preparkovanie auta pred dielnou s vygenerovaným časom Generátora 5 – preparkovanie. /// Štatistiky: /// - S3b – Skončím počítanie doby stráveného v servise. /// - S4a – Začnem merať čas strávený čakaním na opravu. (od ukončenia prevzatia auta do servisu) /// </summary> public override void Execute() { if (AktualnyZakaznik == null) { throw new Exception("NULL zakaznik. "); } //statistiky ((AppCore)ReferenceSimCore).S3_AddValue(AktualnyZakaznik.S3_SkonciCakanie_bytia_v_servise(EventTime)); AktualnyZakaznik.S4_ZacniCakanie_oprava(EventTime); //naplanujem preparkovanie auta var time = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator5_Preparkovanie(); var preparkovanie = new PreparkovanieAutoEvent(time, ReferenceSimCore, AktualnyZakaznik); ReferenceSimCore.ScheduleEvent(preparkovanie); }
/** * Príchod zákazníka * 1. Naplánuem príchod ďalšieho zákazníka. (Nemá inštancie) * 2. Naplanujem na časovú os. * 3. Naplánujem príchod, referenciujem nového zákaznika. * 4. Vytvorím príchod samého seba. * * Príznak IsServed * a. TRUE - vložím do frontu referenciu zákaznika. * b. FALSE * - 1. nastavím na TRUE * - 2. vytvorím inštanciu StartPayment * - 3. naplánujem si udalosť s aktuálnym simulačným časom. * **/ public override void Execute() { //1. var time = (this.EventTime + ((SimCoreShop)ReferenceSimCore).Generators[1].GenerateDouble()); //initializaiton of new event - arrival of Customer var newEvent = new Arrival(time, ReferenceSimCore, new Customer()); //2. //planning of event on timeline ReferenceSimCore.ScheduleEvent(newEvent, time); //////////3. //////////set current customer time of his/her arrival to the system. ////////this. //4. //a. if (((SimCoreShop)ReferenceSimCore).IsServed) { //3. //set current customer time of his/her arrival to the system. CurrentCustomer.StartWaiting(EventTime); //add him to waiting queue as last ((SimCoreShop)ReferenceSimCore).AddCustomer(this.CurrentCustomer); // Console.WriteLine(core.CurrentTime+"\tCustomer is wainting in queue." ); } else { //b. //b.1. // core.IsServed = true; //b.2. //do other event //customer is paying for his newspapers //initialization of new event - start of payment StartPayment sp = new StartPayment(EventTime, ReferenceSimCore, CurrentCustomer); //b.3. //plan this event ((SimCoreShop)ReferenceSimCore).ScheduleEvent(sp, EventTime); // Console.WriteLine(core.CurrentTime + "\tCustomer started paying."); } }
/*** * Refresh event is always carried out. **/ public override void Execute() { if (ReferenceSimCore.Refresh) { double refreshTime = EventTime + ReferenceSimCore.RefreshRate; RefreshEvent refreshEvent = new RefreshEvent(refreshTime, ReferenceSimCore); ReferenceSimCore.ScheduleEvent(refreshEvent, refreshTime); try { Thread.Sleep((int)Math.Round(ReferenceSimCore.SleepingTime)); } catch (ThreadInterruptedException ex) { Console.WriteLine(ex.Message); Thread.CurrentThread.Interrupt(); } } }
/** Začiatk platenia * 1. Vytvorím si inštanciu Exit. * 2. Nastavím si simulačný čas. * 3. Zavolám si generátor => Vygenerujem 5 minút. * 4. Nastavím simulačný čas na aktuálny čas. * 5. Naplánujem čas. * 6. Vložím do prioritného frontu. * 7. Vytvorím inštanciu Customer. * * Instancia triedy Customers - musím nastaviť referenciu zákazníka na toho, * ktorého plánujem odchod. * Posúvam referenciu, aby zákazník skutočne odišiel. * Pribudne atribúút IsAvailable... */ public override void Execute() { //set is served to true ((SimCoreShop)(this.ReferenceSimCore)).IsServed = true; //1. //2. var waitingTime = CurrentCustomer.EndWaiting(EventTime); //for statistics ((SimCoreShop)(this.ReferenceSimCore)).AddStatisticsWaitingTimeStat(waitingTime); //3. //4. //set time of event -> genrate from random number var time = this.EventTime + ((SimCoreShop)(this.ReferenceSimCore)).Generators[0].GenerateDouble(); //5. //6. //7. Exit ex = new Exit(time, ReferenceSimCore, CurrentCustomer); ReferenceSimCore.ScheduleEvent(ex, time); }