public static int CheckMinSeparation(int[,] individ, List <Flight> FlightsData)
 {
     for (int i = 0; i < individ.GetLength(1) - 1; i++)
     {
         int  NextFlightID     = individ[0, i + 1];
         int  CurrentFlightID  = individ[0, i];
         char NextFlightCat    = FlightsData[NextFlightID].Cat;
         char CurrentFlightCat = FlightsData[CurrentFlightID].Cat;
         char NextFlightAD     = FlightsData[NextFlightID].AD;
         char CurrentFlightAD  = FlightsData[CurrentFlightID].AD;
         int  SeperationTime   = BasicFunctions.GetSeperationDistance(CurrentFlightCat, NextFlightCat, CurrentFlightAD, NextFlightAD);
         if (Math.Abs(individ[1, i + 1] - individ[1, i]) < SeperationTime)
         {
             return(i);
         }
     }
     return(-1);
 }
        private void SetChildTime(ref int[,] Individ, int StartIndex, List <Flight> FlightsData)
        {
            int ChildID, ChildLastTime = -1, ChildCurrentScheduledTime;

            if (StartIndex > 0)
            {
                ChildLastTime = Individ[1, StartIndex - 1];
            }
            for (int index = StartIndex; index < Individ.GetLength(1); index++)
            {
                ChildID = Individ[0, index];

                ChildCurrentScheduledTime = FlightsData[ChildID].intScheduledTime;

                if (index == 0)
                {
                    Individ[1, index] = ChildCurrentScheduledTime;
                }
                else
                {
                    int  PreviousFlightID  = Individ[0, index - 1];
                    int  CurrentFlightID   = Individ[0, index];
                    char PreviousFlightCat = FlightsData[PreviousFlightID].Cat;
                    char CurrentFlightCat  = FlightsData[CurrentFlightID].Cat;
                    char PreviousFlightAD  = FlightsData[PreviousFlightID].AD;
                    char CurrentFlightAD   = FlightsData[CurrentFlightID].AD;
                    int  SeperationTime    = BasicFunctions.GetSeperationDistance(PreviousFlightCat, CurrentFlightCat, PreviousFlightAD, CurrentFlightAD);
                    if (ChildCurrentScheduledTime >= (ChildLastTime + SeperationTime))
                    {
                        Individ[1, index] = ChildCurrentScheduledTime;
                    }
                    else
                    {
                        Individ[1, index] = ChildLastTime + SeperationTime;
                    }
                }

                ChildLastTime = Individ[1, index];
            }
        }
        public int[,] GetRandomSolution(List <Flight> FlightsData)
        {
            int[,] result = new int[2, FlightsData.Count];
            int        resultIndex      = 0;
            List <int> Temp             = new List <int>();
            int        LastAssignedTime = 0;
            int        TempTime         = 0;

            for (int FlightID = 0; FlightID <= result.GetLength(1); FlightID++)
            {
                if (FlightID < result.GetLength(1) && Temp.Count == 0)
                {
                    Temp.Add(FlightID);
                    TempTime = FlightsData[FlightID].intScheduledTime;
                }
                else if (FlightID < result.GetLength(1) && FlightsData[FlightID].intScheduledTime == TempTime)
                {
                    Temp.Add(FlightID);
                }
                else
                {
                    if (FlightID < result.GetLength(1))
                    {
                        FlightID--;
                    }
                    while (Temp.Count > 0)
                    {
                        int RandIndex = r.Next(Temp.Count);
                        result[0, resultIndex] = Temp[RandIndex];
                        int SeperationTime;
                        if (resultIndex == 0)
                        {
                            SeperationTime = 0;
                        }
                        else
                        {
                            int  PreviousFlightID  = result[0, resultIndex - 1];
                            int  CurrentFlightID   = result[0, resultIndex];
                            char PreviousFlightCat = FlightsData[PreviousFlightID].Cat;
                            char CurrentFlightCat  = FlightsData[CurrentFlightID].Cat;
                            char PreviousFlightAD  = FlightsData[PreviousFlightID].AD;
                            char CurrentFlightAD   = FlightsData[CurrentFlightID].AD;
                            SeperationTime = BasicFunctions.GetSeperationDistance(PreviousFlightCat, CurrentFlightCat, PreviousFlightAD, CurrentFlightAD);
                        }
                        if (LastAssignedTime == 0 || FlightsData[Temp[RandIndex]].intScheduledTime - LastAssignedTime >= SeperationTime)
                        {
                            result[1, resultIndex] = FlightsData[Temp[RandIndex]].intScheduledTime;
                        }
                        else
                        {
                            // Per rastet:
                            // LastAssignedTime > FlightsData[Temp[RandIndex]].intScheduledTime
                            // FlightsData[Temp[RandIndex]].intScheduledTime-LastAssignedTime<2
                            result[1, resultIndex] = LastAssignedTime + SeperationTime;
                        }
                        // Pergaditjet per shtimin e fluturimit vijues
                        LastAssignedTime = result[1, resultIndex];
                        Temp.RemoveAt(RandIndex);
                        resultIndex++;
                    }
                }
            }

            return(result);
        }