Реализация генетического алгоритма
Метод GetParent отбирает особь для скрещивания по методу рулетки. Таким образом, двукратный вызов этого метода предоставит двух «родителей» для скрещивания.
Метод Eliminate осуществляет удаление особи из популяции методом, описанным в Главе 2, стр. 18-19.
Классы BinaryPopulation и RealPopulation переопределяют некоторые особенности класса Population.
Вершиной этого небольшого «айсберга» является класс GeneticAlgoryth. Основная переменная этого класса - популяция population (объект класса Population).
Выполнение ГА осуществляет простой метод Run:
public void Run()
{= 0; // номер текущего шага
double ffSum;
{ ffSum = population.FitnessFunctionSum;();++;
}(!Stop(curStep, ffSum));
}
Здесь хорошо видно, что это циклический алгоритм, на каждом шаге которого выполняется основное действие - вызов метода RunStep - один шаг ГА. Наличие такого метода упрощает выполнение клиентского приложения в пошаговом режиме.
Условие завершения (предикат Stop) учитывает 2 аспекта - исчерпание шагов эволюции и достижение требуемой точности.
Метод RunStep является центральным, поэтому приведен здесь полностью:
public void RunStep()
{
//Подготовка и выполнение кроссовера
IChromosome parent1, parent2, child;= population.GetParent();= population.GetParent();= parent1.CrossOver(parent2);(new GACrossoverEventArgs(parent1, parent2, child));
//Выполнение мутации=child.Mutate(pMutation);(new GAMutationEventArgs(child));
//Выполнение инверсии=child.Inversion(pInversion);(new GAInversionEventArgs(child));
//добавление новой и удаление старой особи
population.Add(child);.Eliminate();
}
Заметим, что в класс GeneticAlgoryth включена поддержка механизма событий:
определены события, соответствующие выполнению генетических операций:
public event GACrossoverHandler GACrossoverEvent;event GAMutationHandler GAMutationEvent;event GAInversionHandler GAInversionEvent;
- определены методы для корректного вызова событий:
public void OnGACrossover(GACrossoverEventArgs ea) { . . .}void OnGAMutation(GAMutationEventArgs ea) { . . .}void OnGAInversion(GAInversionEventArgs ea) { . . .}
- в коде метода RunStep видно, как эти события вызываются.
Эти средства сделали удобной реализацию демонстрации хода ГА в клиентском приложении.