示例#1
0
 //Wyswietlenie statystyk dla 10 symulacji
 public static void PodsumowanieStatystyk()
 {
     Statystyka.Histogramy();
     Console.BackgroundColor = ConsoleColor.DarkBlue;
     Console.WriteLine("PODSUMOWANIE SYSTEMU:");
     Console.WriteLine("Faza poczatkowa trwa do: {0} ms", Math.Round(FazaPoczatkowa(), 4));
     Console.WriteLine("Średnia pakietowa stopa błędu wynosi: {0}", Math.Round((SrStopaBledu / Program.liczbaSymulacji), 6));
     Console.WriteLine("Maksymalna pakietowa stopa błedu wynosi: {0}", Math.Round(MaxStBledu, 6));
     Console.WriteLine("Średnia liczba retransmisji wynosi: {0}", Math.Round((Retransmisja / Program.liczbaSymulacji), 4));
     Console.WriteLine("Przepływność systemu wynosi:{0} pakiet/sek", Math.Round((Przeplywnosc / Program.liczbaSymulacji), 4));
     Console.WriteLine("Średnie opóźnienie wynosi: {0} ms", Math.Round((Opoznienie / Program.liczbaSymulacji), 4));
     Console.WriteLine("Średnie oczekiwanie wynosi: {0} ms", Math.Round((Oczekiwanie / Program.liczbaSymulacji), 4));
     Console.ResetColor();
     Console.ReadKey();
 }
示例#2
0
        static void Main(string[] args)
        {
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Ziarno.Generuj();
            int liczbaSymulacji = Program.liczbaSymulacji;

            Console.WriteLine("Wybierz opcje wyswietlania informacji o przebiegu programu: ");
            Console.WriteLine("{0} - logi wylaczone");
            Console.WriteLine("{1} - logi wlaczone");
            int zmiennaLogi = int.Parse(Console.ReadLine());

            switch (zmiennaLogi)
            {
            case 0:
                Program.logi = false;
                break;

            case 1:
                Program.logi = true;
                break;

            default:
                Console.WriteLine("Podano nieoczekiwana liczbe");
                break;
            }
            Console.WriteLine("Wybierz opcje krokowego wykonywania petli glownej: ");
            Console.WriteLine("{0} - krokowo");
            Console.WriteLine("{1} - ciagle");
            int zmiennaKrokowo = int.Parse(Console.ReadLine());

            switch (zmiennaKrokowo)
            {
            case 0:
                Program.symulacjaKrokowa = true;
                break;

            case 1:
                Program.symulacjaKrokowa = false;
                break;

            default:
                Console.WriteLine("Podano nieoczekiwana liczbe");
                break;
            }
            Console.WriteLine("Wybierz opcje: ");
            Console.WriteLine("{0} - program dla ustalonych w raporcie parametrow");
            Console.WriteLine("{1} - program dla nowych parametrow");
            int zmiennaParametry = int.Parse(Console.ReadLine());

            switch (zmiennaParametry)
            {
            case 0:
                Console.WriteLine("Rozpoczynam wykonywanie programu, za chwilę na ekranie pojawią się statystyki pierwszej symulacji...");
                break;

            case 1:
                Console.WriteLine("Podaj wartosc lambda: ");
                Program.lambda = double.Parse(Console.ReadLine());
                Console.WriteLine("Podaj czas symulacji w [ms]: ");
                Program.czasSymulacji = int.Parse(Console.ReadLine());
                Console.WriteLine("Podaj liczbe symulacji: ");
                Program.liczbaSymulacji = int.Parse(Console.ReadLine());
                Console.WriteLine("Podaj faze poczatkowa jako ilosc pakietow:");
                Program.fazaPoczatkowa = int.Parse(Console.ReadLine());
                break;

            default:
                Console.WriteLine("Podano nieoczekiwana liczbe");
                break;
            }

            while (liczbaSymulacji > 0)
            {
                Program.zegar = 0;
                Siec siecSymulowana = new Siec();
                while (zegar < Program.czasSymulacji)
                {
                    obecnyProces = agenda.First()._proces;
                    zegar        = agenda.First()._czasZdarzenia;
                    agenda.RemoveAt(0);
                    obecnyProces.Execute();
                    if (Program.symulacjaKrokowa)
                    {
                        Console.ReadKey();
                    }
                }
                Statystyka.Wyswietl();
                Console.WriteLine();
                Statystyka.ZerujStatystyki();
                agenda.Clear();
                --liczbaSymulacji;
            }

            Statystyka.PodsumowanieStatystyk();
            Ziarno.sr.Close();
            Console.WriteLine("Zakonczono");
            Console.ReadKey();
        }
        override public void Execute()
        {
            bool active = true;

            while (active)
            {
                switch (_faza)
                {
                //Faza 0 - aktywacja kolejnego pakietu, ustawienie go w buforze, przechodzi do
                //fazy 1
                case 0:
                    //tworzony jest nowy pakiet ktory zostanie dodany do buforu w chwili aktywacji
                    new Pakiet(this.Id).Activate(Siec.UstawCGPk(this));
                    //dodanie istniejacego do buforu
                    Siec.DodajDoNadawczej(this);
                    CzasPojawienia = Program.zegar;
                    if (Program.logi)
                    {
                        Console.WriteLine("Pakiet id {0} aktywuje kolejny pakiet, liczba pakietow w stacji nadawczej {1}, czas {2}", this.Id, Siec.SprawdzBufor(this), Program.zegar);
                    }
                    _faza = 1;

                    break;

                //Faza 1 - sprawdza czy pakiet jest pierwszy w buforze, jesli
                //jest przechodzi do kolejnej fazy
                case 1:
                    if (Siec.PierwszyPakiet(this) == this)
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} jest pierwszy w nadajniku, czas {1}", this.Id, Program.zegar);
                        }
                        CzasNadania = Program.zegar;
                        Statystyka.SrednieOczekiwanie.Add(CzasNadania - CzasPojawienia);
                        _faza = 2;
                    }
                    else
                    {
                        active = false;
                    }
                    break;

                //Faza 2 - nasluchuje kanal co 0.5ms, jezeli kanal
                //jest wolny to przechodzi do fazy 3
                case 2:
                    if (Program.logi)
                    {
                        Console.WriteLine("Pakiet id {0} sprawdza stan kanalu, czas {1}", this.Id, Program.zegar);
                    }
                    if (!Lacze.KanalWolny)
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} oczekuje na zwolnienie kanalu co 0.5ms, czas {1}", this.Id, Program.zegar);
                        }
                        this.Activate(0.5);
                        active = false;
                    }
                    else
                    {
                        _faza = 3;
                    }
                    break;

                //Faza 3 - jezeli kanal jest wolny losuje liczbe i
                //sprawdza jej prawdopodobienstwo
                case 3:
                    if (Siec.PT() <= Program.PT)
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} ma p-stw mniejsze od 0.6 rozpoczyna transmisje, czas {1}", this.Id, Program.zegar);
                        }
                        _faza = 5;
                    }
                    else
                    {
                        //wait a slot
                        if (Program.zegar % 1 == 0)     //czeka 1ms do szczeliny
                        {
                            if (Program.logi)
                            {
                                Console.WriteLine("Pakiet id {0} ma p-stwo wieksze niz 0.6 wiec oczekuje do szczeliny, czas {1}", this.Id, Program.zegar);
                            }
                            _faza = 4;
                            this.Activate(1.0);
                            active = false;
                        }
                        else
                        {
                            if (Program.logi)
                            {
                                Console.WriteLine("Pakiet id {0} ma p-stwo wieksze niz 0.6 wiec oczekuje do szczeliny, czas {1}", this.Id, Program.zegar);
                            }
                            _faza = 4;
                            this.Activate(1 - (Program.zegar % 1));     //odczekuje do szczeliny
                            active = false;
                        }
                    }
                    break;

                case 4:
                    if (!Lacze.KanalWolny)
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} sprawdza czy kanal jest wolny 1ms i wraca do odpytywania co 0.5ms, czas {1}", this.Id, Program.zegar);
                        }
                        _faza = 2;     //wraca do odpytywania co 0.5ms
                        this.Activate(1.0);
                        active = false;
                    }
                    else
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} wraca do losowania liczby, czas {1}", this.Id, Program.zegar);
                        }
                        _faza = 3;
                    }
                    break;

                //faza 5 - sprawdzanie kanalu i kolizji. Jesli wystapila przechodzi do fazy 6,
                //jesli nie, dodaje pakiet do kanalu i rozpoczyna transmisje
                case 5:
                    if (Program.zegar % 1 == 0)
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} rozpoczal transmisje w pelnej szczelinie, czas {1}. Planowany czas transmisji {2}", this.Id, Program.zegar, this.CzasCTPk);
                        }
                        if (Lacze.Kolizja())
                        {
                            if (Program.logi)
                            {
                                Console.WriteLine("Pakiet id {0} wykryl kolizje, czas {1}", this.Id, Program.zegar);
                            }
                            Lacze.UstawFlagiKolizji();
                            this.FlagaKolizji = true;
                        }

                        Lacze.DodajDoKanalu(this);
                        _faza = 6;
                        this.Activate(0.0, 1);
                        active = false;
                    }
                    else     //jesli nie to odczekaj czas do następnej szczeliny i ponownie sprawdz czy kolizja
                    {
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} czeka na poczatek szczeliny, czas {1}", this.Id, Program.zegar);
                        }
                        this.Activate((1 - (Program.zegar % 1)));
                        active = false;
                    }
                    break;

                //Faza 6 - transmisja
                case 6:
                    if (Program.logi)
                    {
                        Console.WriteLine("Pakiet id {0} zajal kanal, czas {1}", this.Id, Program.zegar);
                    }
                    Lacze.KanalWolny = false;
                    _faza            = 8;
                    this.Activate(CzasCTPk);
                    active = false;
                    break;

                //Faza 7 - retransmisja
                case 7:
                    if (Program.logi)
                    {
                        Console.WriteLine("Pakiet id {0} rozpoczyna retransmisje, czas {1}", this.Id, Program.zegar);
                    }
                    ++this.LiczbaRetransmisji;
                    if (this.LiczbaRetransmisji < Program.liczbaRetransmisji)
                    {
                        double czas = Siec.R(this) * CzasCTPk;
                        this.FlagaKolizji = false;
                        _faza             = 2;
                        this.Activate(czas);
                        active = false;
                    }
                    else
                    {
                        //usuwa pakiet z systemu
                        if (Program.logi)
                        {
                            Console.WriteLine("Przekroczono LR wiec usuwam pakiet z systemu");
                        }
                        Siec.StraconePakiety(this);
                        Siec.UsunZNadawczej(this);
                        if (Siec.SprawdzBufor(this) != 0)
                        {
                            Siec.PierwszyPakiet(this).Activate(0.0);
                        }
                        active = false;
                    }

                    break;

                //Faza 8 - sprawdzenie czy wystąpiła kolizja
                case 8:
                    if (this.FlagaKolizji)
                    {
                        Console.BackgroundColor = ConsoleColor.Red;
                        if (Program.logi)
                        {
                            Console.WriteLine("Pakiet id {0} wystaplia kolizja, czas {1}", this.Id, Program.zegar);
                        }
                        Console.ResetColor();
                        Lacze.UsunZKanalu(this);
                        if (!Lacze.Kolizja())
                        {
                            Lacze.KanalWolny = true;
                        }
                        _faza = 7;
                    }
                    else
                    {
                        _faza = 9;
                        ACK   = true;
                        Activate(1.0);
                        active = false;
                    }
                    break;

                //Faza 9 - odbior pakietu
                case 9:
                    Siec.DodajDoOdbiorczej(this);
                    if (!Statystyka.wyznaczonoFaze)
                    {
                        ++Statystyka.odliczanieDoFazyPoczatkowej;
                        Statystyka.ZerujPrzedFazaPoczatkowa();
                        if (Statystyka.odliczanieDoFazyPoczatkowej == Program.fazaPoczatkowa)
                        {
                            Statystyka.czasFazyPoczatkowej.Add(Program.zegar);
                            Statystyka.wyznaczonoFaze = true;
                        }
                    }
                    this.CzasOdbioru = Program.zegar;
                    Statystyka.SrednieOpoznienie.Add((CzasOdbioru - CzasPojawienia));
                    Lacze.UsunZKanalu(this);
                    Siec.UsunZNadawczej(this);
                    Lacze.KanalWolny = true;
                    _wykonano        = true;
                    if (Siec.SprawdzBufor(this) != 0)
                    {
                        Siec.PierwszyPakiet(this).Activate(0.0);
                    }
                    active = false;
                    Console.BackgroundColor = ConsoleColor.DarkGreen;
                    if (Program.logi)
                    {
                        Console.WriteLine("Pakiet id {0} zapisal sie w stacji odbiorczej, czas {1}", this.Id, Program.zegar);
                    }
                    Console.ResetColor();
                    break;

                default:
                    break;
                }
            }
        }
示例#4
0
 //wywoluje metody zapisujace do plikow dane, na podstawie
 //ktorych tworzone sa histogramy
 public static void Histogramy()
 {
     Statystyka.HistogramRownomierny();
     Statystyka.HistogramWykladniczy();
 }