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();
}
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 }