using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication31 { enum TypUdalosti { Start, ZacinaNakladat, VyjizdizAdoB, ZacinaVykladat, VyjizdiZBdoA } abstract class Proces { public abstract void ZpracujUdalost(TypUdalosti Co); } class Auto : Proces { Model model; int nosnost; int dobaJizdy; int kolikVeze; int dobaNakladani; int dobaVykladani; public Auto( Model model, int nosnost, int dobaJizdy, int dobaNakladani, int dobaVykladani) { this.model = model; this.nosnost = nosnost; this.dobaJizdy = dobaJizdy; this.dobaNakladani = dobaNakladani; this.dobaVykladani = dobaVykladani; model.Naplanuj(model.Cas, this, TypUdalosti.Start); } public override void ZpracujUdalost(TypUdalosti Co) { switch (Co) { case TypUdalosti.Start: int KdyMuzuZacitNakladat = Math.Max(model.Cas, model.KdyBudeMozneZacitMNakladat); model.Naplanuj(KdyMuzuZacitNakladat, this, TypUdalosti.ZacinaNakladat); model.KdyBudeMozneZacitMNakladat = KdyMuzuZacitNakladat + dobaNakladani; break; case TypUdalosti.ZacinaNakladat: kolikVeze = Math.Min(nosnost, model.PisekVA); model.PisekVA -= kolikVeze; if (kolikVeze > 0) model.Naplanuj(model.Cas + dobaNakladani, this, TypUdalosti.VyjizdizAdoB); break; case TypUdalosti.VyjizdizAdoB: model.Naplanuj(model.Cas + dobaJizdy, this, TypUdalosti.ZacinaVykladat); break; case TypUdalosti.ZacinaVykladat: model.Naplanuj(model.Cas + dobaVykladani, this, TypUdalosti.VyjizdiZBdoA); break; case TypUdalosti.VyjizdiZBdoA: model.PisekVB += kolikVeze; model.Naplanuj(model.Cas + dobaJizdy, this, TypUdalosti.Start); break; default: break; } } } class Udalost { public int Kdy; public Proces Kdo; public TypUdalosti Co; public Udalost( int Kdy, Proces Kdo, TypUdalosti Co) { this.Kdy = Kdy; this.Kdo = Kdo; this.Co = Co; } } class Kalendar { List seznam; public Kalendar() { seznam = new List(); } public Udalost NajdiVratAZnicPrvniUdalost() { int imin = 0; for (int i = 1; i < seznam.Count; i++) { if (seznam[i].Kdy < seznam[imin].Kdy) imin = i; } Udalost prvni = seznam[imin]; seznam.RemoveAt(imin); return prvni; } public void Pridej( Udalost u) { seznam.Add( u ); } } class Model { public int Cas; public int KdyBudeMozneZacitMNakladat; public int PisekVA; public int PisekVB; private Kalendar kalendar; public virtual void VytvorAuta() { new Auto(this, 10, 120, 120, 5); new Auto(this, 10, 120, 120, 5); new Auto(this, 30, 360, 360, 5); } public void Naplanuj(int Kdy, Proces Kdo, TypUdalosti Co) { kalendar.Pridej(new Udalost(Kdy, Kdo, Co)); } public int Spocitej(int PisekCelkem) { kalendar = new Kalendar(); VytvorAuta(); PisekVA = PisekCelkem; PisekVB = 0; KdyBudeMozneZacitMNakladat = 0; while (PisekVB < PisekCelkem) { Udalost u = kalendar.NajdiVratAZnicPrvniUdalost(); Cas = u.Kdy; (u.Kdo).ZpracujUdalost(u.Co); } return Cas; } } class ModelSViceAuty:Model { protected int PocetAut; public ModelSViceAuty( int PocetAut) { this.PocetAut = PocetAut; } public override void VytvorAuta() { for (int i = 0; i < PocetAut; i++) { new Auto(this, 10, 120, 120, 5); } } } class ModelSViceAutyAViceNakladateli:ModelSViceAuty { int PocetNakladatelu; public ModelSViceAutyAViceNakladateli ( int PocetAut, int PocetNakladatelu):base(PocetAut) { this.PocetNakladatelu= PocetNakladatelu; } public override void VytvorAuta() { for (int i = 0; i < PocetAut; i++) { new Auto(this, 10, 120, 120/PocetNakladatelu, 5); } } } class Program { static void Main(string[] args) { Console.WriteLine( new Model().Spocitej(3000) ); for (int i = 1; i < 10; i++) { Console.WriteLine( new ModelSViceAuty(i).Spocitej(3000) ); } Console.WriteLine("--------------------"); for (int nak = 1; nak < 10; nak++) { for (int i = 1; i < 10; i++) { Console.Write( "{0};", new ModelSViceAutyAViceNakladateli(i,nak). Spocitej(3000) ); } Console.WriteLine(); } } } }