Exemplo n.º 1
0
        //loading input into each server's service time dist table and interarrival time dist table
        private void SimBtn_Click(object sender, EventArgs e)
        {
            List <Server> Servers = new List <Server>();
            // server[0] contains the time distrubution of interarivaltime throughout the entire program
            int Cols = 0;

            for (int i = 0; i < NoServers; i++)
            {
                Server new_server = new Server();
                Servers.Add(new_server);
                new_server.ServiceTimeDistribution = new List <TimeDistribution>();

                for (int j = 0; j < InputGrdView.RowCount; j++)
                {  //we should check if cells are not empty
                    // add  a new service time dist row in the current server
                    if (InputGrdView.Rows[j].Cells[Cols].Value != null)
                    {
                        TimeDistribution new_td = new TimeDistribution(); //new row
                        Servers[i].ServiceTimeDistribution.Add(new_td);
                        Servers[i].ServiceTimeDistribution[j].Time        = Int32.Parse(InputGrdView.Rows[j].Cells[Cols].Value.ToString());
                        Servers[i].ServiceTimeDistribution[j].Probability = double.Parse(InputGrdView.Rows[j].Cells[Cols + 1].Value.ToString());
                    }
                }
                Cols += 2;
            }

            SimSystem.CompleteServiceTimeDistributionData(NoServers, InputGrdView.RowCount, Servers);

            Enums.ServerSelectionMethod   SelectionMethod   = new Enums.ServerSelectionMethod();
            Enums.ServerStoppingCondition StoppingCondition = new Enums.ServerStoppingCondition();
            if (PriorityRadioBtn.Checked)
            {
                SelectionMethod = Enums.ServerSelectionMethod.HighestPriority;
            }
            else if (RandomRadioBtn.Checked)
            {
                SelectionMethod = Enums.ServerSelectionMethod.Random;
            }
            else if (LeastUtiRadioBtn.Checked)
            {
                SelectionMethod = Enums.ServerSelectionMethod.LowestUtilization;
            }


            if (MaxNoRadioBtn.Checked)
            {
                StoppingCondition = Enums.ServerStoppingCondition.NumberOfCustomers;
                List <SimualtionCase> result = SimSystem.Simulate(SelectionMethod, StoppingCondition, MaxNoTxtbox.Text);
                show_results(result);
            }
            else if (SimEndTimeRadioBtn.Checked)
            {
                StoppingCondition = Enums.ServerStoppingCondition.SimulationEndTime;
                List <SimualtionCase> result = SimSystem.Simulate(SelectionMethod, StoppingCondition, SimTimeTxtbox.Text);
                show_results(result);
            }
        }
Exemplo n.º 2
0
        private void Results_Load(object sender, EventArgs e)
        {
            DataTable Res = new DataTable();
            int       NumberOfCustomers = 100;

            Enums.ServerSelectionMethod   ssm = Enums.ServerSelectionMethod.HighestPriority;
            Enums.ServerStoppingCondition ssc = Enums.ServerStoppingCondition.NumberOfCustomers;
            simulation.createResultsTable(Res, Servers, InterArrivalDirtribution, ssm, ssc, NumberOfCustomers);
            ResultGV.DataSource = Res;
        }
 public void createResultsTable(DataTable Res, List <Server> Servers, List <TimeDistribution> InterArrivalDirtribution, Enums.ServerSelectionMethod ssm, Enums.ServerStoppingCondition ssc, int NumberOfCustomers)
 {
     createTableColumns(Res, Servers);
     MaxQueueLength = 0;
     rand           = new Random();
     makeSimulationCalc(Res, Servers, InterArrivalDirtribution, ssm, ssc, NumberOfCustomers);
 }
        public List <SimualtionCase> Simulate(Enums.ServerSelectionMethod SelectionMethod, Enums.ServerStoppingCondition StoppingCondition, string TextBoxData)
        {
            Random Rnd = new Random();

            Customers = new List <SimualtionCase>(); //each selection method and stopping condition need a list of customers
            SystemStatistics.NoOfCustomersWait = 0;
            if (SelectionMethod == Enums.ServerSelectionMethod.HighestPriority && StoppingCondition == Enums.ServerStoppingCondition.NumberOfCustomers)
            {
                int NoOfCustomers = Int32.Parse(TextBoxData.ToString());
                Customers = new List <SimualtionCase>(NoOfCustomers);
                for (int i = 0; i < NoOfCustomers; i++)
                {
                    SimualtionCase NewCustomer = new SimualtionCase();
                    Customers.Add(NewCustomer);
                    Customers[i].CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        Customers[i].RandomInterarrivalTime = Rnd.Next(1, 101);
                        Customers[i].InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], Customers[i]);
                        if (Customers[i].RandomInterarrivalTime == 100)
                        {
                            Customers[i].RandomInterarrivalTime = 0;
                        }

                        SystemStatistics.AppendNewUnitTimes(Customers[i].InterarrivalTime);
                        Customers[i].ArrivalTime = Customers[i - 1].ArrivalTime + Customers[i].InterarrivalTime;
                    }
                    else
                    {
                        Customers[i].RandomInterarrivalTime = -1;
                        Customers[i].InterarrivalTime       = -1;
                        Customers[i].ArrivalTime            = 0;
                        SystemStatistics.AppendNewUnitTimes(1);
                    }
                    Customers[i].RandomServiceTime = Rnd.Next(1, 101);
                    Server FirstIdle = new Server();
                    FirstIdle.ServerEndTime = 100000;
                    int FirstIdleID = -1;
                    for (int q = 1; q < NoServers; q++)
                    {   //get the first idle server in order
                        if (Servers[q].ServerEndTime <= Customers[i].ArrivalTime)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            break;
                        }
                        //if that current server end time is greater that customers arrival time, pick the one that will finish early
                        else if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                        }
                    }
                    // if all servers are busy and customer has to wait then calculate wait time
                    if (Servers[FirstIdleID].ServerEndTime > Customers[i].ArrivalTime)
                    {
                        Customers[i].WaitingTime = Servers[FirstIdleID].ServerEndTime - Customers[i].ArrivalTime;
                        SystemStatistics.NoOfCustomersWait++;
                        SystemStatistics.TotalWaitingTime += Customers[i].WaitingTime;
                        for (int x = Customers[i].ArrivalTime; x < Servers[FirstIdleID].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                    }
                    Customers[i].AssignedServer            = Servers[FirstIdleID];
                    Customers[i].TimeServiceBegins         = Customers[i].ArrivalTime + Customers[i].WaitingTime;
                    Customers[i].ServiceTime               = this.GetServiceTimeFromRange(Customers[i].AssignedServer, Customers[i]);
                    Customers[i].TimeServiceEnds           = Customers[i].TimeServiceBegins + Customers[i].ServiceTime;
                    Servers[FirstIdleID].TotalServiceTime += Customers[i].ServiceTime;
                    Servers[FirstIdleID].TotalNumberOfCustomers++;
                    Servers[FirstIdleID].ServerEndTime = Customers[i].TimeServiceEnds;
                    if (Customers[i].RandomServiceTime == 100)
                    {
                        Customers[i].RandomServiceTime = 0;
                    }
                }
                return(Customers);
            }

            else if (SelectionMethod == Enums.ServerSelectionMethod.HighestPriority && StoppingCondition == Enums.ServerStoppingCondition.SimulationEndTime)
            {
                int SimulationEndTime = Int32.Parse(TextBoxData), i = 0;
                SystemStatistics.InitializeQueueLength(SimulationEndTime);
                while (true)
                {
                    SimualtionCase CurrentCustomer = new SimualtionCase();
                    CurrentCustomer.CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        CurrentCustomer.RandomInterarrivalTime = Rnd.Next(1, 101);
                        CurrentCustomer.InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], CurrentCustomer);
                        CurrentCustomer.ArrivalTime            = Customers[i - 1].ArrivalTime + CurrentCustomer.InterarrivalTime;
                        if (CurrentCustomer.RandomInterarrivalTime == 100)
                        {
                            CurrentCustomer.RandomInterarrivalTime = 0;
                        }
                    }
                    else
                    {
                        CurrentCustomer.RandomInterarrivalTime = -1;
                        CurrentCustomer.InterarrivalTime       = -1;
                        CurrentCustomer.ArrivalTime            = 0;
                    }
                    CurrentCustomer.RandomServiceTime = Rnd.Next(1, 101);
                    Server FirstIdle = new Server();
                    FirstIdle.ServerEndTime = 100000;
                    int FirstIdleID = -1;
                    for (int q = 1; q < NoServers; q++)
                    {
                        if (Servers[q].ServerEndTime <= CurrentCustomer.ArrivalTime)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            break;
                        }
                        else if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                        }
                    }
                    if (Servers[FirstIdleID].ServerEndTime > CurrentCustomer.ArrivalTime)
                    {
                        CurrentCustomer.WaitingTime = Servers[FirstIdleID].ServerEndTime - CurrentCustomer.ArrivalTime;
                        SystemStatistics.NoOfCustomersWait++;
                        SystemStatistics.TotalWaitingTime += CurrentCustomer.WaitingTime;
                        for (int x = CurrentCustomer.ArrivalTime; x < Servers[FirstIdleID].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                    }
                    CurrentCustomer.AssignedServer    = Servers[FirstIdleID];
                    CurrentCustomer.TimeServiceBegins = CurrentCustomer.ArrivalTime + CurrentCustomer.WaitingTime;
                    CurrentCustomer.ServiceTime       = this.GetServiceTimeFromRange(CurrentCustomer.AssignedServer, CurrentCustomer);

                    CurrentCustomer.TimeServiceEnds    = CurrentCustomer.TimeServiceBegins + CurrentCustomer.ServiceTime;
                    Servers[FirstIdleID].ServerEndTime = CurrentCustomer.TimeServiceEnds;
                    if (CurrentCustomer.TimeServiceEnds > SimulationEndTime)
                    {
                        break;
                    }
                    if (CurrentCustomer.RandomServiceTime == 100)
                    {
                        CurrentCustomer.RandomServiceTime = 0;
                    }
                    Customers.Add(CurrentCustomer);
                    Servers[FirstIdleID].TotalServiceTime += CurrentCustomer.ServiceTime;
                    Servers[FirstIdleID].TotalNumberOfCustomers++;
                    i++;
                }
                return(Customers);
            }

            else if (SelectionMethod == Enums.ServerSelectionMethod.Random && StoppingCondition == Enums.ServerStoppingCondition.NumberOfCustomers)
            {
                int NoOfCustomers  = Int32.Parse(TextBoxData);
                int AssignedServer = -1;
                Customers = new List <SimualtionCase>(NoOfCustomers);
                for (int i = 0; i < NoOfCustomers; i++)
                {
                    SimualtionCase NewCustomer = new SimualtionCase();
                    Customers.Add(NewCustomer);
                    Customers[i].CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        Customers[i].RandomInterarrivalTime = Rnd.Next(1, 101);
                        Customers[i].InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], Customers[i]);
                        Customers[i].ArrivalTime            = Customers[i - 1].ArrivalTime + Customers[i].InterarrivalTime;
                        if (Customers[i].RandomInterarrivalTime == 100)
                        {
                            Customers[i].RandomInterarrivalTime = 0;
                        }
                        SystemStatistics.AppendNewUnitTimes(Customers[i].InterarrivalTime);
                    }
                    else
                    {
                        Customers[i].RandomInterarrivalTime = -1;
                        Customers[i].InterarrivalTime       = -1;
                        Customers[i].ArrivalTime            = 0;
                        SystemStatistics.AppendNewUnitTimes(1);
                    }
                    Customers[i].RandomServiceTime = Rnd.Next(1, 101);
                    this.FillFreeServers(Customers[i].ArrivalTime);
                    if (FreeServers.Count > 0)
                    {
                        AssignedServer = Rnd.Next(FreeServers.Count);
                        Customers[i].AssignedServer = Servers[AssignedServer];
                    }
                    else
                    {
                        Server FirstIdle = new Server();
                        FirstIdle.ServerEndTime = 100000;

                        for (int q = 1; q < NoServers; q++)
                        {
                            if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime)
                            {
                                FirstIdle      = Servers[q];
                                AssignedServer = q;
                            }
                        }
                        Customers[i].WaitingTime = Servers[AssignedServer].ServerEndTime - Customers[i].ArrivalTime;
                        SystemStatistics.NoOfCustomersWait++;
                        SystemStatistics.TotalWaitingTime += Customers[i].WaitingTime;
                        for (int x = Customers[i].ArrivalTime; x < Servers[AssignedServer].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                        Customers[i].AssignedServer = Servers[AssignedServer];
                        Servers[AssignedServer].TotalNumberOfCustomers++;
                        Servers[AssignedServer].TotalServiceTime += Customers[i].ServiceTime;
                    }

                    Customers[i].TimeServiceBegins        = Customers[i].ArrivalTime + Customers[i].WaitingTime;
                    Customers[i].ServiceTime              = this.GetServiceTimeFromRange(Customers[i].AssignedServer, Customers[i]);
                    Customers[i].TimeServiceEnds          = Customers[i].TimeServiceBegins + Customers[i].ServiceTime;
                    Servers[AssignedServer].ServerEndTime = Customers[i].TimeServiceEnds;
                    if (Customers[i].RandomServiceTime == 100)
                    {
                        Customers[i].RandomServiceTime = 0;
                    }
                }
                return(Customers);
            }

            else if (SelectionMethod == Enums.ServerSelectionMethod.Random && StoppingCondition == Enums.ServerStoppingCondition.SimulationEndTime)
            {
                int AssignedServer = -1;
                int SimulationEndTime = Int32.Parse(TextBoxData.ToString()), i = 0;
                SystemStatistics.InitializeQueueLength(SimulationEndTime);
                while (true)
                {
                    SimualtionCase CurrentCustomer = new SimualtionCase();
                    CurrentCustomer.CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        CurrentCustomer.RandomInterarrivalTime = Rnd.Next(1, 101);
                        CurrentCustomer.InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], CurrentCustomer);
                        CurrentCustomer.ArrivalTime            = Customers[i - 1].ArrivalTime + CurrentCustomer.InterarrivalTime;
                        if (CurrentCustomer.RandomInterarrivalTime == 100)
                        {
                            CurrentCustomer.RandomInterarrivalTime = 0;
                        }
                    }
                    else
                    {
                        CurrentCustomer.RandomInterarrivalTime = -1;
                        CurrentCustomer.InterarrivalTime       = -1;
                        CurrentCustomer.ArrivalTime            = 0;
                    }
                    CurrentCustomer.RandomServiceTime = Rnd.Next(1, 101);
                    this.FillFreeServers(CurrentCustomer.ArrivalTime);
                    if (FreeServers.Count > 0)
                    {
                        AssignedServer = Rnd.Next(FreeServers.Count);
                        CurrentCustomer.AssignedServer = Servers[AssignedServer];
                    }
                    else
                    {
                        Server FirstIdle = new Server();
                        FirstIdle.ServerEndTime = 100000;

                        for (int q = 1; q < NoServers; q++)
                        {
                            if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime)
                            {
                                FirstIdle      = Servers[q];
                                AssignedServer = q;
                            }
                        }
                        CurrentCustomer.WaitingTime        = Servers[AssignedServer].ServerEndTime - CurrentCustomer.ArrivalTime;
                        SystemStatistics.TotalWaitingTime += CurrentCustomer.WaitingTime;
                        SystemStatistics.NoOfCustomersWait++;
                        for (int x = CurrentCustomer.ArrivalTime; x < Servers[AssignedServer].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                        CurrentCustomer.AssignedServer = Servers[AssignedServer];
                    }

                    CurrentCustomer.TimeServiceBegins     = CurrentCustomer.ArrivalTime + CurrentCustomer.WaitingTime;
                    CurrentCustomer.ServiceTime           = this.GetServiceTimeFromRange(CurrentCustomer.AssignedServer, CurrentCustomer);
                    CurrentCustomer.TimeServiceEnds       = CurrentCustomer.TimeServiceBegins + CurrentCustomer.ServiceTime;
                    Servers[AssignedServer].ServerEndTime = CurrentCustomer.TimeServiceEnds;
                    if (CurrentCustomer.TimeServiceEnds > SimulationEndTime)
                    {
                        break;
                    }
                    if (CurrentCustomer.RandomServiceTime == 100)
                    {
                        CurrentCustomer.RandomServiceTime = 0;
                    }
                    Customers.Add(CurrentCustomer);
                    Servers[AssignedServer].TotalNumberOfCustomers++;
                    Servers[AssignedServer].TotalServiceTime += CurrentCustomer.ServiceTime;
                }
                return(Customers);
            }
            else if (SelectionMethod == Enums.ServerSelectionMethod.LowestUtilization && StoppingCondition == Enums.ServerStoppingCondition.NumberOfCustomers)
            {
                int NoOfCustomers = Int32.Parse(TextBoxData.ToString());
                Customers = new List <SimualtionCase>(NoOfCustomers);
                for (int i = 0; i < NoOfCustomers; i++)
                {
                    SimualtionCase NewCustomer = new SimualtionCase();
                    Customers.Add(NewCustomer);
                    Customers[i].CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        Customers[i].RandomInterarrivalTime = Rnd.Next(1, 101);
                        Customers[i].InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], Customers[i]);
                        if (Customers[i].RandomInterarrivalTime == 100)
                        {
                            Customers[i].RandomInterarrivalTime = 0;
                        }

                        SystemStatistics.AppendNewUnitTimes(Customers[i].InterarrivalTime);
                        Customers[i].ArrivalTime = Customers[i - 1].ArrivalTime + Customers[i].InterarrivalTime;
                    }
                    else
                    {
                        Customers[i].RandomInterarrivalTime = -1;
                        Customers[i].InterarrivalTime       = -1;
                        Customers[i].ArrivalTime            = 0;
                        SystemStatistics.AppendNewUnitTimes(1);
                    }
                    Customers[i].RandomServiceTime = Rnd.Next(1, 101);
                    Server FirstIdle = new Server();
                    FirstIdle.ServerEndTime = 100000;
                    int   FirstIdleID = -1;
                    float utilization = 3;
                    bool  free_found  = false;


                    for (int q = 1; q < NoServers; q++)
                    {   //get the first idle server in order
                        if (i == 0)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            break;
                        }
                        float server_utilization = Servers[q].TotalServiceTime / Customers[i - 1].TimeServiceEnds;
                        // if server is free and least utilization , update global utiization
                        if (Servers[q].ServerEndTime <= Customers[i].ArrivalTime && (server_utilization < utilization))
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            utilization = server_utilization;
                            free_found  = true;
                        }
                        //if that current server end time is greater that customers arrival time, pick the one that will finish early
                        else if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime && free_found == false)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                        }
                    }
                    // if all servers are busy and customer has to wait then calculate wait time

                    if (Servers[FirstIdleID].ServerEndTime > Customers[i].ArrivalTime)
                    {
                        Customers[i].WaitingTime = (Servers[FirstIdleID].ServerEndTime - Customers[i].ArrivalTime);
                        SystemStatistics.NoOfCustomersWait++;
                        SystemStatistics.TotalWaitingTime += Customers[i].WaitingTime;
                        for (int x = Customers[i].ArrivalTime; x < Servers[FirstIdleID].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                    }
                    Customers[i].AssignedServer            = Servers[FirstIdleID];
                    Customers[i].TimeServiceBegins         = Customers[i].ArrivalTime + Customers[i].WaitingTime;
                    Customers[i].ServiceTime               = this.GetServiceTimeFromRange(Customers[i].AssignedServer, Customers[i]);
                    Customers[i].TimeServiceEnds           = Customers[i].TimeServiceBegins + Customers[i].ServiceTime;
                    Servers[FirstIdleID].TotalServiceTime += Customers[i].ServiceTime;
                    Servers[FirstIdleID].TotalNumberOfCustomers++;
                    Servers[FirstIdleID].ServerEndTime = Customers[i].TimeServiceEnds;
                    if (Customers[i].RandomServiceTime == 100)
                    {
                        Customers[i].RandomServiceTime = 0;
                    }
                }
                return(Customers);
            }

            else if (SelectionMethod == Enums.ServerSelectionMethod.LowestUtilization && StoppingCondition == Enums.ServerStoppingCondition.SimulationEndTime)
            {
                int SimulationEndTime = Int32.Parse(TextBoxData), i = 0;
                SystemStatistics.InitializeQueueLength(SimulationEndTime);
                while (true)
                {
                    SimualtionCase CurrentCustomer = new SimualtionCase();
                    CurrentCustomer.CustomerNumber = i + 1;
                    if (i != 0)
                    {
                        CurrentCustomer.RandomInterarrivalTime = Rnd.Next(1, 101);
                        CurrentCustomer.InterarrivalTime       = this.GetInterarrivalTimeFromRange(Servers[0], CurrentCustomer);
                        CurrentCustomer.ArrivalTime            = Customers[i - 1].ArrivalTime + CurrentCustomer.InterarrivalTime;
                        if (CurrentCustomer.RandomInterarrivalTime == 100)
                        {
                            CurrentCustomer.RandomInterarrivalTime = 0;
                        }
                    }
                    else
                    {
                        CurrentCustomer.RandomInterarrivalTime = -1;
                        CurrentCustomer.InterarrivalTime       = -1;
                        CurrentCustomer.ArrivalTime            = 0;
                    }
                    CurrentCustomer.RandomServiceTime = Rnd.Next(1, 101);
                    Server FirstIdle = new Server();
                    FirstIdle.ServerEndTime = 100000;
                    int   FirstIdleID = -1;
                    float utilization = 3;
                    bool  free_found  = false;


                    for (int q = 1; q < NoServers; q++)
                    {   //get the first idle server in order
                        if (i == 0)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            break;
                        }
                        float server_utilization = Servers[q].TotalServiceTime / Customers[i - 1].TimeServiceEnds;
                        // if server is free and least utilization , update global utiization
                        if (Servers[q].ServerEndTime <= CurrentCustomer.ArrivalTime && (server_utilization < utilization))
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                            utilization = server_utilization;
                            free_found  = true;
                        }
                        else if (Servers[q].ServerEndTime < FirstIdle.ServerEndTime && free_found == false)
                        {
                            FirstIdle   = Servers[q];
                            FirstIdleID = q;
                        }
                    }
                    if (Servers[FirstIdleID].ServerEndTime > CurrentCustomer.ArrivalTime)
                    {
                        CurrentCustomer.WaitingTime = Servers[FirstIdleID].ServerEndTime - CurrentCustomer.ArrivalTime;
                        SystemStatistics.NoOfCustomersWait++;
                        SystemStatistics.TotalWaitingTime += CurrentCustomer.WaitingTime;
                        for (int x = CurrentCustomer.ArrivalTime; x < Servers[FirstIdleID].ServerEndTime; x++)
                        {
                            SystemStatistics.QueueLength[x]++;
                        }
                    }
                    CurrentCustomer.AssignedServer    = Servers[FirstIdleID];
                    CurrentCustomer.TimeServiceBegins = CurrentCustomer.ArrivalTime + CurrentCustomer.WaitingTime;
                    CurrentCustomer.ServiceTime       = this.GetServiceTimeFromRange(CurrentCustomer.AssignedServer, CurrentCustomer);

                    CurrentCustomer.TimeServiceEnds    = CurrentCustomer.TimeServiceBegins + CurrentCustomer.ServiceTime;
                    Servers[FirstIdleID].ServerEndTime = CurrentCustomer.TimeServiceEnds;
                    if (CurrentCustomer.TimeServiceEnds > SimulationEndTime)
                    {
                        break;
                    }
                    if (CurrentCustomer.RandomServiceTime == 100)
                    {
                        CurrentCustomer.RandomServiceTime = 0;
                    }
                    Customers.Add(CurrentCustomer);
                    Servers[FirstIdleID].TotalServiceTime += CurrentCustomer.ServiceTime;
                    Servers[FirstIdleID].TotalNumberOfCustomers++;
                    i++;
                }
                return(Customers);
            }
            else
            {
                return(new List <SimualtionCase>());
            }
        }
        private void makeSimulationCalc(DataTable table, List <Server> Servers, List <TimeDistribution> InterArrivalDistribution, Enums.ServerSelectionMethod ssm, Enums.ServerStoppingCondition ssc, int NumberOfCustomers)
        {
            int[] serverEndTime = new int[Servers.Count];
            CustomerIsServed = new bool[NumberOfCustomers];
            Customer customer = new Customer();

            for (int i = 0; i < Servers.Count; i++)
            {
                serverEndTime[i] = 0;
            }
            ////initialize CustomersWaiting Time.
            CustomersWaitingTime = new List <int>(NumberOfCustomers);
            CustomerQueue        = new  Queue <Customer>();
            CustomersIds         = new Queue <int>();
            for (int i = 0; i < NumberOfCustomers; i++)
            {
                CustomersWaitingTime.Add(0);
            }
            CustomerArrivalTimes = new int[NumberOfCustomers];


            for (int i = 0; (i < NumberOfCustomers) || (CustomerQueue.Count > 0); i++)
            {
                //free
                //CustomerQueue.Enqueue(i);
                //int serverId = -1;
                ///////get idle server and assign it to a customer
                ////if no servers avaliable serverId =-1
                int serverId = -1;

                if (i == 0)
                {
                    customer.CustomerId             = 0;
                    customer.ArrivalTime            = 0;
                    customer.RandomInterarrivalTime = 0;
                    customer.InterarrivalTime       = 0;
                }
                else
                {
                    if (i < NumberOfCustomers)
                    {
                        customer = customerData(InterArrivalDistribution, table, i);
                    }
                }
                if (CustomerQueue.Count != 0)
                {
                    do
                    {
                        Customer customerInQueue = CustomerQueue.Peek();
                        serverId = Selection(Servers, serverEndTime, customerInQueue.ArrivalTime, customerInQueue.CustomerId);
                        if (serverId != -1)
                        {
                            customerInQueue = CustomerQueue.Dequeue();
                            CustomersIds.Dequeue();
                            //serverId = Selection(Servers, serverEndTime, customerInQueue.ArrivalTime, customerInQueue.CustomerId);
                            AssignedServer = Servers[serverId];
                            serveCustomer(customerInQueue, table, InterArrivalDistribution, ref serverEndTime);
                        }
                    } while (CustomerQueue.Count != 0 && serverId != -1);
                    if (CustomerQueue.Count == 0 && serverId != -1)
                    {
                        serverId = Selection(Servers, serverEndTime, customer.ArrivalTime, customer.CustomerId);
                        if (serverId != -1)
                        {
                            AssignedServer = Servers[serverId];
                            serveCustomer(customer, table, InterArrivalDistribution, ref serverEndTime);
                        }
                        else
                        {
                            if (!CustomersIds.Contains(customer.CustomerId))
                            {
                                CustomerQueue.Enqueue(customer);
                                CustomersIds.Enqueue(customer.CustomerId);
                                updateWaitingTime();
                            }
                        }
                    }
                    else if (CustomerQueue.Count != 0 && serverId == -1)
                    {
                        if (!CustomersIds.Contains(customer.CustomerId))
                        {
                            CustomerQueue.Enqueue(customer);
                            CustomersIds.Enqueue(customer.CustomerId);
                            updateWaitingTime();
                        }
                    }
                }
                else
                {
                    serverId = Selection(Servers, serverEndTime, customer.ArrivalTime, customer.CustomerId);
                    if (serverId != -1)
                    {
                        AssignedServer = Servers[serverId];
                        serveCustomer(customer, table, InterArrivalDistribution, ref serverEndTime);
                    }
                    else
                    {
                        if (!CustomersIds.Contains(customer.CustomerId))
                        {
                            CustomerQueue.Enqueue(customer);
                            CustomersIds.Enqueue(customer.CustomerId);
                            updateWaitingTime();
                        }
                    }
                }
                if (MaxQueueLength < CustomerQueue.Count)
                {
                    MaxQueueLength = CustomerQueue.Count;
                }
            }
        }