ScheduleWorks.Algorithm.Schedule.Mutate C# (CSharp) Method

Mutate() public method

public Mutate ( int mutationCount ) : void
mutationCount int
return void
        public void Mutate(int mutationCount)
        {
            /*
             * Possibly I can implement mutation adopted to remove errors
             */
            /*
            Dictionary<Teacher, List<Index>> dict = new Dictionary<Teacher, List<Index>>();
            for (int day = 0; day < this.mDays.Count; ++day)
            {
                for (int lesson = 0; lesson < this.mDays[day].Classes[0].Lessons.Count; ++lesson)
                {
                    dict.Clear();
                    for (int classN = 0; classN < this.mDays[day].Classes.Count; ++classN)
                    {
                        if (this.mDays[day].Classes[classN].Lessons[lesson] != null)
                        {
                            if (dict.ContainsKey(this.mDays[day].Classes[classN].Lessons[lesson].Teacher))
                            {
                                dict[this.mDays[day].Classes[classN].Lessons[lesson].Teacher].Add(new Index(day, classN, lesson));
                            }
                            else
                            {
                                dict.Add(this.mDays[day].Classes[classN].Lessons[lesson].Teacher, new List<Index>(){new Index(day, classN, lesson)});
                            }
                        }
                    }
                }
            }
            */
            for (int i = 0; i < mutationCount; ++i)
            {
                Random rnd = new Random();
                int classN = rnd.Next(this.mDays[0].Classes.Count);
                int firstDay = rnd.Next(this.mDays.Count);
                int secondDay = rnd.Next(this.mDays.Count);
                int firstLesson = rnd.Next(this.mDays[firstDay].Classes[classN].Lessons.Count);
                int secondLesson = rnd.Next(this.mDays[secondDay].Classes[classN].Lessons.Count);
                Lesson swap;
                swap = mDays[firstDay].Classes[classN].Lessons[firstLesson];
                mDays[firstDay].Classes[classN].Lessons[firstLesson] = mDays[secondDay].Classes[classN].Lessons[secondLesson];
                mDays[secondDay].Classes[classN].Lessons[secondLesson] = swap;
            }
            this.mRating = CalculateRating();
        }

Usage Example

        private void MakeNewGeneration(int mutationsCount)
        {
            Random rnd = new Random();
            /*
            foreach (var item in mCurrentGeneration)
            {
                mNextGeneration.Add(item);
            }*/
            for (int f = 0; f < this.mCurrentGeneration.Count; ++f)
            {
                for (int s = 0; s < this.mCurrentGeneration.Count; ++s)
                {
                    if (f != s)
                    {
                        s1 = new Schedule(this.mCurrentGeneration[f], this.mCurrentGeneration[s], SubjectsDifficulty);
                        double randomNumber = rnd.NextDouble();
                        if (randomNumber < MutationPercentage)
                        {
                            s1.Mutate(mutationsCount);
                        }
                        /*if (s1.Not(this.compDict))
                        {
                            s1 = new Schedule(SaveCopy.Timetable, mSubjectsDifficulty);
                            s1.Shuffle(rnd);
                        }*/
                        mNextGeneration[f * this.mCurrentGeneration.Count + s] = s1;

                    }
                    else
                    {
                        mNextGeneration[f * mCurrentGeneration.Count + s] = mCurrentGeneration[f];
                    }
                }
            }
            //mNextGeneration[rnd.Next(mNextGeneration.Count)].Mutate(Days * PeriodsCount);
            //EqualityComparer<Schedule> comp = new ScheduleComparator(false);
            this.mCurrentGeneration = mNextGeneration.
            OrderByDescending(x => {
                return x.Rating.Errors ;
            }).
            /*Distinct(comp).*/ToList().GetRange(0, GenerationSize);
            // my generation, babyy :D
        }