public VectorOfCourses(VectorOfCourses i_Vector)
 {
     int count = 0;
     m_Vector = new List<CourseBlock>();
     for (; count < k_MaximumNumberOfCourses; count++)
     {
         m_Vector.Add(new CourseBlock(i_Vector.m_Vector[count]));
     }
     m_VectorRating = i_Vector.m_VectorRating;
 }
 public static int CompareVectors(VectorOfCourses i_VectorOne, VectorOfCourses i_VectorTwo)
 {
     if (i_VectorOne.Rate > i_VectorTwo.Rate)
     {
         return 0;
     }
     else
     {
         return 1;
     }
 }
        private bool isDuplicateVector(VectorOfCourses i_FirstVector, VectorOfCourses i_SecondVector)
        {
            bool res = true; ;
            int i;
            VectorOfCourses tempVectorFirst = CreateOnlyStudyCoursesVector(i_FirstVector);
            VectorOfCourses tempVectorSecond = CreateOnlyStudyCoursesVector(i_SecondVector);
            if (i_FirstVector.Rate != i_SecondVector.Rate)
            {
                res = false;
            }
            else if (CountNumberOfCourses(i_FirstVector) != CountNumberOfCourses(i_SecondVector))
            {
                res = false;
            }
            else
            {
                for (i = 0; i < tempVectorFirst.Vector.Count; i++)
                {
                    if (!isCourseInVector(tempVectorFirst.Vector[0], tempVectorSecond.Vector))
                    {
                        res = false;
                    }
                }

                //if (isCourseInVector(i_FirstVector.Vector[0], i_SecondVector.Vector))
                //{
                //    if (isCourseInVector(i_FirstVector.Vector[1], i_SecondVector.Vector))
                //    {
                //        if (isCourseInVector(i_FirstVector.Vector[2], i_SecondVector.Vector))
                //        {
                //            if (isCourseInVector(i_FirstVector.Vector[3], i_SecondVector.Vector))
                //            {
                //                if (isCourseInVector(i_FirstVector.Vector[4], i_SecondVector.Vector))
                //                {
                //                    if (isCourseInVector(i_FirstVector.Vector[5], i_SecondVector.Vector))
                //                    {
                //                        if (isCourseInVector(i_FirstVector.Vector[6], i_SecondVector.Vector))
                //                        {
                //                            res = true;
                //                        }
                //                    }
                //                }
                //            }
                //        }
                //    }
                //}
            }
            return res;
        }
        private void ShowSolution(VectorOfCourses weekCourses)
        {
            lblRate.Text = (100 - weekCourses.Rate).ToString();
            List<AgendaItem> allAgendaItems = new List<AgendaItem>();

            for (int i = 0; i < MAX_NUMBER_OF_COURSES; i++)
            {
                allAgendaItems.AddRange(ExtractAgendaItemsFromBlock(weekCourses.Vector[i]));
            }
            AssignBackColors(allAgendaItems);

            var groupedItems = allAgendaItems.GroupBy(item => (int)item.Day).ToArray(); // Group by day of the week

            // For each day of the week
            for (int i = 0; i < 6; i++)
            {
                var foundItemsForDay = groupedItems.FirstOrDefault(g => g.Key == i);
                this.DailyUserControls[i].AgendaItems = foundItemsForDay == null ? new List<AgendaItem>() : foundItemsForDay.ToList();
                Console.WriteLine("Day " + i + " -> " + (foundItemsForDay != null ? foundItemsForDay.Count() : 0) + " items");
            }

            Console.WriteLine("----------------- SOLUTION SHOW ENDED -----------------");
        }
        private void crossOverFatherList(List<VectorOfCourses> i_Vector )
        {
            List<VectorOfCourses> crossedVector = new List<VectorOfCourses>();
            VectorOfCourses vectorFirst;
            VectorOfCourses vectorSecond;
            int count = 0;
            int first, second, cut;
            for (; count < k_SizeOfFatherList; count++)
            {
                first= rnd.Next(k_SizeOfFatherList);
                second = rnd.Next(k_SizeOfFatherList);
                cut = rnd.Next(k_NumberOfStandartElectivesCourses + k_NumberOfStandartRequiredCourses);
                if ((cut != 0) && (first != second))
                {
                    crossOver(out vectorFirst, out vectorSecond, i_Vector[first], i_Vector[second], cut);
                    checkForMutation(vectorFirst, courseBlockDB);
                    checkForMutation(vectorSecond, courseBlockDB);
                    //vectorFirst.rateVector(m_Student);
                    //vectorSecond.rateVector(m_Student);
                    if(vectorFirst.Rate < vectorSecond.Rate)
                    {
                        crossedVector.Add(vectorFirst);
                    }
                    else if (vectorFirst.Rate > vectorSecond.Rate)
                    {
                        crossedVector.Add(vectorSecond);
                    }
                    else
                    {
                        if (rnd.Next(2) == 1)
                        {
                            crossedVector.Add(vectorFirst);
                        }
                        else
                        {
                            crossedVector.Add(vectorSecond);
                        }
                    }

                }
                else
                {
                    if (first == second)
                    {
                        vectorFirst = new VectorOfCourses(i_Vector[first]);
                        checkForMutation(vectorFirst, courseBlockDB);
                        crossedVector.Add(vectorFirst);
                    }
                    else
                    {
                        vectorFirst = new VectorOfCourses(i_Vector[first]);
                        vectorSecond = new VectorOfCourses(i_Vector[second]);
                        checkForMutation(vectorFirst, courseBlockDB);
                        checkForMutation(vectorSecond, courseBlockDB);
                        if (vectorFirst.Rate < vectorSecond.Rate)
                        {
                            crossedVector.Add(vectorFirst);
                        }
                        else if (vectorFirst.Rate > vectorSecond.Rate)
                        {
                            crossedVector.Add(vectorSecond);
                        }
                        else
                        {
                            if (rnd.Next(2) == 1)
                            {
                                crossedVector.Add(vectorFirst);
                            }
                            else
                            {
                                crossedVector.Add(vectorSecond);
                            }
                        }
                    }
                }
            }
            m_Fathers.Clear();
            m_Fathers = crossedVector;
        }
 //insert rateVector function
 private void crossOver(out VectorOfCourses o_VectorFirst, out VectorOfCourses o_VectorSecond, VectorOfCourses i_VectorOfCoursesFirst, VectorOfCourses i_VectorOfCoursesSecond, int i_CutRatio)
 {
     o_VectorFirst = new VectorOfCourses();
     o_VectorSecond = new VectorOfCourses();
     o_VectorFirst.Vector.AddRange(i_VectorOfCoursesFirst.Vector.GetRange(0, i_CutRatio));
     o_VectorFirst.Vector.AddRange(i_VectorOfCoursesSecond.Vector.GetRange(i_CutRatio, i_VectorOfCoursesSecond.Vector.Count - i_CutRatio));
     o_VectorSecond.Vector.AddRange(i_VectorOfCoursesSecond.Vector.GetRange(0, i_CutRatio));
     o_VectorSecond.Vector.AddRange(i_VectorOfCoursesFirst.Vector.GetRange(i_CutRatio, i_VectorOfCoursesFirst.Vector.Count - i_CutRatio));
     o_VectorFirst.rateVector(m_Student);
     o_VectorSecond.rateVector(m_Student);
 }
 private VectorOfCourses CreateOnlyStudyCoursesVector(VectorOfCourses i_Vector)
 {
     VectorOfCourses resVector = new VectorOfCourses();
     int i;
     for (i = 0; i < i_Vector.Vector.Count; i++)
     {
         if (i_Vector.Vector[i].StartTimeSlotOfFirstClass != -1)
         {
             resVector.Vector.Add(i_Vector.Vector[i]);
         }
     }
     return resVector;
 }
 private int CountNumberOfCourses(VectorOfCourses i_Vector)
 {
     int count = 0;
     int i;
     for (i = 0; i < i_Vector.Vector.Count; i++)
     {
         if (i_Vector.Vector[i].StartTimeSlotOfFirstClass != -1)
         {
             count++;
         }
     }
     return count;
 }
 //insert rateVector function
 private void checkForMutation(VectorOfCourses i_Vector, List<List<CourseBlock>> i_CourseBlock)
 {
     int count = 0;
     bool rateAgain = false;
     int index;
     for (; count < i_Vector.Vector.Count; count++)
     {
         if (rnd.Next(k_MutationCrossOverSize) == 1)
         {
             rateAgain = true;
             index = getIndex(i_Vector.Vector[count].ID, i_CourseBlock);
             i_Vector.Vector[count] = i_CourseBlock[index][rnd.Next(i_CourseBlock[index].Count)];
         }
     }
     if (rateAgain)
     {
         i_Vector.rateVector(m_Student);
     }
 }