Пример #1
0
        public Model(int stoly, int obsluha, int kuchar)
        {
            this.cas = 0;

            /*Restaurace bude otvorena 8 hodin, teda po 8 hodinach prestaneme prijimat
             * objednavky. Hostia, ktori su este v restauraci dojedia, zaplatia a tym sa den skonci.*/
            this.MaxCas                = 8 * 60;
            this.CisloZakaznika        = 1;
            this.ZakazniciOdisli       = 0;
            this.LudiaOdisli           = 0;
            this.ObsluzenychZakaznikov = 0;
            this.ObsluzenychLudi       = 0;

            this.MaxPocStol = stoly;
            this.MaxPocObsl = obsluha;
            this.MaxPocKuch = kuchar;

            this.MaxPotrebKuchar  = 0;
            this.MaxPotrebObsluha = 0;
            this.MaxPotrebStolov  = 0;

            this.VRestauraci        = new List <Zakaznik>();  // seznam zakaznikov usadenych v restauracis
            this.FrontaNaVstupe     = new Queue <Zakaznik>(); //vytvorenie fronty zakaznikov cakajucich na vstup do restaurace
            this.KalendarRestaurace = new Kalendar();         //vytvorenie kalendaru udalosti v restauraci
            this.kuchyna            = new Kuchyna(MaxPocKuch);
            this.obsluha            = new Obsluha(MaxPocObsl);

            this.PocetVolStoly = MaxPocStol;

            this.rnd = new Random();
        }
Пример #2
0
 public void OdoberZKalendara(ref Kalendar Kalendar, int cislo, ref List <Zakaznik> VRestauraci, ref Kuchyna kuchyna, int cas)
 {
     foreach (Udalost ud in Kalendar.zoznam)
     {
         if ((ud.kdo == Osoba.Casnik) && (ud.host == cislo))
         {
             Kalendar.zoznam.Remove(ud);
             PocetVolObsluha += 1;                                              //odstranili sme z kalendara ulohu pre casnika zadanu zakaznikom, ktory odchadza
             ZamestnajObsluhu(ref Kalendar, ref VRestauraci, ref kuchyna, cas); //Uvolneneho casnika skusime zamestnat
         }
     }
     return;
 }
Пример #3
0
            public void SpracujUlohu(int cas, int cisloHosta, ref Kalendar kalendar, ref List <Zakaznik> VRestauraci, ref Kuchyna kuchyna)
            {
                if (cisloHosta == -1) //Identifikace uvolneni casnika
                {
                    PocetVolObsluha += 1;
                }
                else //Prisla nova uloha pre obsluhu
                {
                    ZoznamUlohPreObsluhu.Add(new UlohaPreObsluhu(cas, cisloHosta));
                }

                ZamestnajObsluhu(ref kalendar, ref VRestauraci, ref kuchyna, cas);
            }
Пример #4
0
 public void OdoberZKalendara(ref Kalendar Kalendar, int cislo, int cas)
 {
     for (int i = 0; i < Kalendar.zoznam.Count; i++)
     {
         if ((Kalendar.zoznam[i].kdo == Osoba.Kuchar) && (Kalendar.zoznam[i].host == cislo))
         {
             Udalost ud = Kalendar.zoznam[i];
             Kalendar.zoznam.Remove(ud);
             PocetVolKuchar += 1; //odstranili sme z kalendara zamestnanych kucharov, pracujucich na objednavke, pre zakaznika, ktory odchadza
             ZamestnajKuchara(ref Kalendar, cas);
         }
     }
     return;
 }
Пример #5
0
            public void PridajObjednavkuDoKuchyne(int cislo, int[] jedlo, ref Kalendar Kalendar, int cas)
            {
                FrontaObjednavokVKuchyni.Add(new ObjednavkaVKuchyni(cislo, jedlo, cas));

                int PredchadzajuciPovetvolnychKucharov = PocetVolKuchar + 1;

                //Kedze jedna objednavka moze obsahovat viac jedal, po prichode objednavky zamestname co mozno najviac kucharov
                //Teda pokusame sa zamestnat kucharov, dokym pocet kucharov po pokuse ich zamestnat neklesne oproti predchajucemu poctu kucharov
                //To sa zastavi aj v pripade, ze nie je dost kucharov na vsetky aktualne objednavky
                while (PocetVolKuchar != PredchadzajuciPovetvolnychKucharov)
                {
                    PredchadzajuciPovetvolnychKucharov = PocetVolKuchar;
                    ZamestnajKuchara(ref Kalendar, cas);
                }
            }
Пример #6
0
            public void SpracujHotoveJedlo(ref Kalendar kalendar, int cislo, int cas) //Jeden kuchar dovaril jeden chod z objednavky
            {
                foreach (ObjednavkaVKuchyni objednavka in ZoznamPripravovanychObjednavok)
                { //Vyradenie daneho zakaznika z pripravovanych objednavok
                    if (objednavka.CisloObjednavky == cislo)
                    {
                        objednavka.HotoveJedla += 1;                                                             //Jedno jedlo z danej objednavky je hotove
                        PocetVolKuchar         += 1;                                                             //Kuchar, ktory varil dane jedlo sa uvolnil
                        ZamestnajKuchara(ref kalendar, cas);                                                     //Uvolneneho kuchara mozeme zas zamestnat
                        if (objednavka.HotoveJedla == objednavka.CelkovoObjednanych)                             //Objednavka je hotova, moze sa odniest hostom
                        {
                            kalendar.Pridaj(cas, Osoba.Casnik, StavHosta.Objednane, objednavka.CisloObjednavky); //Dame pokyn casnikovy, ze jedlo je hotove a moze ho odniest zakaznikom
                            ZoznamPripravovanychObjednavok.Remove(objednavka);                                   //Hotovu objednavku vyradime z kuchyne
                        }

                        return; // odoberame len prvy vyskyt
                    }
                }
            }
Пример #7
0
            public void ZamestnajObsluhu(ref Kalendar KalendarRestaurace, ref List <Zakaznik> VRestauraci, ref Kuchyna kuchyna, int cas)
            {
                if (PocetVolObsluha > 0) // Ak je volny casnik, zamestname ho
                {
                    //Vyhladanie ulohy, ktora sa musi spracovat nejdriv. Ak nemame ziadnu ulohu, nic sa nestane.
                    UlohaPreObsluhu NaSpracovanie = null;
                    foreach (UlohaPreObsluhu uloha in ZoznamUlohPreObsluhu)
                    {
                        if ((NaSpracovanie == null) || (uloha.cas < NaSpracovanie.cas))
                        {
                            NaSpracovanie = uloha;
                        }
                    }

                    if (NaSpracovanie != null)                                                     //Ak sa nasla uloha pre obsluhu, tak ta, ktoru treba spracovat nejdriv
                    {
                        ZoznamUlohPreObsluhu.Remove(NaSpracovanie);                                //Odstranenie ulohy zo zoznamu uloh

                        int Pozice = NajdiStolSoZakaznikom(NaSpracovanie.cisloHosta, VRestauraci); //Pozice zakaznika v zozname VRestauraci

                        if (Pozice == -1)                                                          //Host s danym cislem se nenasel v restauraci
                        {
                            Console.WriteLine("CHYBA. Nenasiel sa host s danym cislom, medzi hostami usadenymi v restauraci, chyba moze byt v zruseni udalosti v kalendari, ak hostovy dojde trpezlivost na cakanie na casnika.");
                        }
                        else //Host s danym cislom sa nasiel v restauraci
                        {
                            KalendarRestaurace.Odober(Osoba.Host, VRestauraci[Pozice].Cislo); //Odoberieme z kalendara zakaznikovu trpezlivost
                            PocetVolObsluha -= 1;

                            int CasNaPripravuNapojov;
                            switch (VRestauraci[Pozice].Stav)
                            {
                            case StavHosta.Usadeny:                                                                                                   //Usadeny host si chce objednat, zamestna 1 casnika
                                kuchyna.PridajObjednavkuDoKuchyne(VRestauraci[Pozice].Cislo, VRestauraci[Pozice].jedlo, ref KalendarRestaurace, cas); //Predanie objednavky do kuchyne, to da pokyn kucharom, aby varili
                                VRestauraci[Pozice].Stav = StavHosta.Objednane;

                                //Uvolnenie casnika po tom, co prijme objednavku a donesie zakaznikovi napoje
                                CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi;                                             //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty
                                KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3, Osoba.Casnik, StavHosta.Objednane, -1); //Casnika uvolnime za 3 min (cas na prijatie objednavky) + pol minuty za kazdeho hosta na pripravu napoja

                                //Trpezlivost zakaznika na prinesenie jedla, po objednani a prineseni napojov
                                int CasNaCakanieNaJedlo = VRestauraci[Pozice].PocetStolov * 10 + 15;     //Trpezlivost na pripravu jedla bude 15 min + 10 min za kazdy stol daneho zakaznika (viac ludi bude musiet dlhsie cakat na pripravu)
                                KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3 + CasNaCakanieNaJedlo, Osoba.Host, StavHosta.Objednane, VRestauraci[Pozice].Cislo);
                                break;

                            case StavHosta.Objednane:     //Jedlo je hotove, kuchyna dala pokyn na odnesenie
                                VRestauraci[Pozice].Stav = StavHosta.DoneseneJedlo;

                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.DoneseneJedlo, -1);                           //Uvolnenie casnika po 2 min, kedy nosi jedlo na stol
                                KalendarRestaurace.Pridaj(cas + 4 + 15, Osoba.Host, StavHosta.DoneseneJedlo, VRestauraci[Pozice].Cislo); //15 min zakaznik je
                                break;

                            case StavHosta.CakaNaObjednanieNapoja:
                                VRestauraci[Pozice].Stav = StavHosta.DonesenyNapoj;

                                CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi;                                                                           //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty
                                KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov, Osoba.Casnik, StavHosta.DonesenyNapoj, -1);                           //Uvolnenie casnika po 1 min na prijatie objednavky + priprava napojov
                                KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov + 15, Osoba.Host, StavHosta.DonesenyNapoj, VRestauraci[Pozice].Cislo); //15 min na vypitie napojov
                                break;

                            case StavHosta.Zaplatim:
                                VRestauraci[Pozice].Spokojnost = 0;
                                VRestauraci[Pozice].Stav       = StavHosta.Odchod;
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo);
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1);
                                break;

                            case StavHosta.Odchod:     //Odchod nespokojneho zakaznika z restaurace po uklideni
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo);
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1);
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
            }
Пример #8
0
            public void ZamestnajKuchara(ref Kalendar Kalendar, int cas)
            {
                int Pom = -1;
                int i   = 0;

                if (PocetVolKuchar > 0)
                {                                                                  // Najprv dokoncime rozpracovanu objednavku. Ak su vsetky jedla z rozpracovanych objednavom uz v priprave, volny kuchar zacne pracovat na novej objednavke
                    for (int j = 0; j < ZoznamPripravovanychObjednavok.Count; j++) //Zistujeme, ci existuje rozpracovana objednavka, ktoru treba dokoncit
                    {
                        if (ZoznamPripravovanychObjednavok[j].jedlo[0] + ZoznamPripravovanychObjednavok[j].jedlo[1] + ZoznamPripravovanychObjednavok[j].jedlo[2] > 0)
                        {
                            Pom = j;
                        }
                    }

                    if (Pom >= 0)
                    { //V zozname pripravovanych objednavok je este objednavka, ktoru treba dokoncit
                        i = 2;
                        while (ZoznamPripravovanychObjednavok[Pom].jedlo[i] == 0)
                        {
                            i -= 1;
                        }
                        ZoznamPripravovanychObjednavok[Pom].jedlo[i] -= 1;
                        switch (i)
                        {       //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky
                        case 0: //Jedla na pozicii 0 trva pripravit 4 minuty
                            Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        case 1:     //Jedla na pozicii 1 trva pripravit 7 minut
                            Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        case 2:     //Jedla na pozicii 2 trva pripravit 10 minut
                            Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        default:
                            break;
                        }
                        PocetVolKuchar -= 1;
                    }
                    else //Ziadna objednavka uz nie je rozpracovana, teda vezmeme dalsiu objednavku z fronty a zacneme na nej pracovat
                    {
                        if (FrontaObjednavokVKuchyni.Count > 0)
                        {
                            //Najdeme objednavku, ktora prisla najskor
                            ObjednavkaVKuchyni pomocna = null;
                            foreach (ObjednavkaVKuchyni objednavka in FrontaObjednavokVKuchyni)
                            {
                                if ((pomocna == null) || (objednavka.cas < pomocna.cas))
                                {
                                    pomocna = objednavka;
                                }
                            }
                            FrontaObjednavokVKuchyni.Remove(pomocna); //Odstranime objednavku z fronty na pripravu

                            i = 2;                                    //Najdeme jedlo, ktore treba pripravit, od casovo narocnejich po menej narocne
                            while (pomocna.jedlo[i] == 0)
                            {
                                i -= 1;
                            }
                            pomocna.jedlo[i] -= 1;

                            switch (i)
                            {       //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky
                            case 0: //Jedla na pozicii 0 trva pripravit 4 minuty
                                Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            case 1:      //Jedla na pozicii 1 trva pripravit 7 minut
                                Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            case 2:     //Jedla na pozicii 2 trva pripravit 10 minut
                                Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            default:
                                break;
                            }

                            ZoznamPripravovanychObjednavok.Add(pomocna); //Do zoznamu pridame objednavku, kde uz oznacime, ktore jedlo ide dany kuchar pripravit

                            PocetVolKuchar -= 1;                         // Jeden kuchar sa zamestna varenim
                        }
                    }
                }
            }