/// <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);
        }
コード例 #2
0
        /// <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();
                }
            }
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
        /**
         * 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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
        }
コード例 #10
0
        /**
         * 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.");
            }
        }
コード例 #11
0
 /***
  * 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();
         }
     }
 }
コード例 #12
0
        /** 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);
        }