/// <summary> /// Random fill the given individual /// </summary> /// <param name="individual">individual to be filled</param> /// <returns>success</returns> private bool RandomFillIndividual(Individual individual) { for (int courseIndex = 0; courseIndex < individual.Courses.GetLength(0); courseIndex++) { List<PlacementContainer> possibilities = GetPossibilitiesForCourse(courseIndex, individual); if (possibilities.Count <= 0) { //When no possibilities left, restart individual.Clear(); return false; } possibilities.Sort(SortPlacementContainerByBlock); List<PlacementContainer> subset = new List<PlacementContainer>(); if (ttData.Courses[courseIndex].IsDummy) { //choose possibility that is late subset.Add(possibilities[possibilities.Count - 1]); for (int i = possibilities.Count - 2; i >= 0; i--) { if (possibilities[i].block >= subset[0].block) subset.Add(possibilities[i]); else break; } } else { //choose possibility that is early subset.Add(possibilities[0]); for (int i = 1; i < possibilities.Count; i++) { if (possibilities[i].block >= subset[0].block) subset.Add(possibilities[i]); else break; } } int chosenPossibility = random.Next(0, subset.Count); for (int blockOffset = 0; blockOffset < ttData.Courses[courseIndex].NumberOfBlocks; blockOffset++) { individual.SetChromosome(courseIndex, subset[chosenPossibility].day, subset[chosenPossibility].block + blockOffset, subset[chosenPossibility].room, ttData.Courses[courseIndex].Group.Index, GetLecturerIndices(courseIndex)); } } return true; }