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(); }
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; }
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); }
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; }
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); } }
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 } } }
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; } } } } }
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 } } } }