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

Shuffle() public method

public Shuffle ( Random rnd ) : void
rnd System.Random
return void
        public void Shuffle(Random rnd)
        {
            int dayr;
            int classNr;
            int lessonr;
            for (int day = 0; day < this.mDays.Count; ++day)
            {
                for (int classN = 0; classN < this.mDays[day].Classes.Count; ++classN)
                {
                    for (int lesson = 0; lesson < this.mDays[day].Classes[classN].Lessons.Count; ++lesson)
                    {
                        dayr = rnd.Next(this.mDays.Count);
                        //classNr = rnd.Next(this.mDays[dayr].Classes.Count);
                        classNr = classN;
                        lessonr = rnd.Next(this.mDays[dayr].Classes[classNr].Lessons.Count);
                        Lesson swap = this.mDays[day].Classes[classN].Lessons[lesson];
                        this.mDays[day].Classes[classN].Lessons[lesson] = this.mDays[dayr].Classes[classNr].Lessons[lessonr];
                        this.mDays[dayr].Classes[classNr].Lessons[lessonr] = swap;
                    }
                }
            }
            this.mRating = CalculateRating();
        }

Usage Example

 public void EndInit()
 {
     if (this.mIsInitBegan == false)
     {
         throw new GeneticAlgorithmInitializationNotStartedException("EndInit() invoked before BeginInit()");
     }
     try
     {
         this.CheckInitFinished();
     }
     catch (GeneticAlgorithmNotInitializedException e)
     {
         throw new GeneticAlgorithmNotInitializedException("Initialization not completed", e);
     }
     this.mCurrentGeneration = new List<Schedule> { };
     var data = from p in this.mData
                group p by p.Class into gr
                select
                new {
                    Class = gr.Key,
                    Subjects = from t in gr
                            group t by t.Subject into c
                            select new { Subject = c.Key, Groups = c }
                };
     List<Day> timetable = new List<Day>{ };
     for (int i = 0; i < mDaysCount; ++i)
     {
         Day d = new Day(new List<ClassSchedule>{});
         for (int j = 0;j < data.Count(); ++j)
         {
             List<Lesson> lessons = new List<Lesson>{};
             for (int k = 0; k < PeriodsCount; ++k)
             {
                 lessons.Add(null);
             }
             ClassSchedule cs = new ClassSchedule(null, lessons);
             d.Classes.Add(cs);
         }
         timetable.Add(d);
     }
     int day = 0;
     int period = 0;
     int classN = 0;
     int hoursWeekly;
     foreach (var item in data)
     {
         day = 0;
         period = 0;
         for (int i = 0; i < Days; ++i)
         {
             timetable[i].Classes[classN].Class = item.Class;
         }
         foreach (var current in item.Subjects)
         {
             hoursWeekly = 0;
             List<Group> groups = new List<Group>();
             foreach (Curriculum curric in current.Groups)
             {
                 hoursWeekly = curric.HoursPerWeek;
                 Group g = new Group(curric.Teacher, curric.Group, curric.DesiredClassroom, curric.AlternativeClassrooms);
                 groups.Add(g);
             }
             for (int i = 0; i < hoursWeekly; i++)
             {
                 Lesson l = new Lesson(item.Class, current.Subject, groups);
                 timetable[day].Classes[classN].Lessons[period] = l;
                 if (period == PeriodsCount - 1)
                 {
                     day++;
                     period = 0;
                 }
                 else
                 {
                     period++;
                 }
             }
         }
         classN++;
     }
     Random rnd = new Random();
     Schedule s = new Schedule(timetable, mSubjectsDifficulty);
     SaveCopy = new Schedule(s.Timetable, mSubjectsDifficulty);
     s.Shuffle(rnd);
     this.mLastSuiting = s;
     this.mSuitingConstraints = s;
     this.mCurrentGeneration.Add(s);
     for (int i = 0; i < GenerationSize * 10; ++i)
     {
         s = new Schedule(timetable, mSubjectsDifficulty);
         s.Shuffle(rnd);
         this.mCurrentGeneration.Add(s);
     }
     EqualityComparer<Schedule> comp = new ScheduleComparator();
     this.mCurrentGeneration = mCurrentGeneration.OrderByDescending(x => x.Rating.Errors).
         Distinct(comp).ToList();
     this.mCurrentGeneration = mCurrentGeneration.GetRange(0, GenerationSize);
     this.mIsInitialized = true;
 }