Библиотека генетических алгоритмов - часть 3

ОГЛАВЛЕНИЕ

Данная статья является продолжением второй части из серии статей о библиотеке генетических алгоритмов.

• Скачать исходный код библиотеки - 279 Кб
• Скачать исходный код демонстрационных приложений - 85.81 Кб
• Скачать демонстрационные приложения - 138.83 Кб
• Скачать документацию библиотеки - 1.03 Мб
• Последние версии библиотеки

Первую часть данной серии статей вы можете найти здесь, а вторую - здесь.

Библиотека генетических алгоритмов

Представления хромосом

Библиотека генетических алгоритмов определяет несколько интерфейсов, позволяющих использовать хромосомы с встроенными операциями кроссовера и мутации.

Хромосомы, поддерживающие случайный переворот или инвертирование значений в своем коде, должны реализовывать интерфейс GaMutableCode. Этот интерфейс определяет два метода: Invert и Flip. Метод Invert должен выбирать определенное число значений кода хромосомы и инвертировать их. Метод Flip должен менять случайно определенное число значений кода хромосомы.

Схема - интерфейс GaMutableCode

Интерфейс GaSwapableCode должен реализовываться хромосомами, умеющими переставлять блок значений кода хромосомы. Этот интерфейс определяет метод Swap.

Схема - интерфейс GaSwapableCode

Интерфейс GaSizableCode должен реализовываться хромосомами, умеющими менять число значений в своем коде. Метод Insert должен вставлять определенное число случайных значений в заданное место в коде хромосомы. Метод Remove должен удалять блок значений в заданном месте из кода хромосомы.

Схема - Интерфейс GaSizableCode

Интерфейс GaMultiValueCode должен реализовываться хромосомами, способными иметь несколько значений в своем коде. Этот интерфейс определяет методы для извлечения значений из кода хромосомы в буферы и инициализации хромосом из буферов значений. Метод MakeBuffer должен создавать объект буфера, могущий хранить заданное число значений и возвращать указатель на объект. FillBuffer должен копировать блок значений в заданном месте в буфер. Метод FromBuffer должен инициализировать код хромосомы значениями, хранящимися в предоставленном буфере.

Схема - Интерфейс GaMultiValueCode

Класс GaCodeValuesBuffer управляет буферами для хранения значений из кодов хромосом. Буфер может использоваться для хранения значений из нескольких хромосом, следовательно, он подходит для объединения хромосом в операциях кроссовера.

Схема - Класс GaCodeValuesBuffer

Интерфейс GaArithmeticalCode должен реализовываться хромосомами, поддерживающими арифметические операции над значениями в своем коде. Этот интерфейс определяет операторы для основных арифметических операций [+, -, *, /] и метод для нахождения срединной точки.

Схема - Интерфейс GaArithmeticalCode

Интерфейс GaCodeValue должен реализовываться классами, обертывающими типы данных значений в коде хромосомы. Этот интерфейс определяет метод FormBuffer, извлекающий единственное значение [в заданном месте] из предоставленного буфера. Метод Initialize при реализации должен случайно инициализировать обернутые данные.

Схема - Интерфейс GaCodeValue

В большинстве ситуаций значения в коде хромосомы имеют ограничения [домен]. Эти ограничения в библиотеке реализованы через наборы значений. Класс GaDomainChromosome использует CCB, хранящий указатель на набор значений, определяющий ограничения значений в коде хромосомы.

Схема – Классы GaDomainChromosome и GaChromosomeDomainBlock

GaValuSet – базовый класс для наборов значений в библиотеке.

Схема – Класс GaValueSet

Метод GenerateRandom случайно выбирает одно значение из набора значений и возвращает его. Метод Inverse возвращает соответствующее значение из группы инвертированных значений. Метод Belongs возвращает true, если заданное значение принадлежит набору значений. ClosestValue возвращает ближайшее значение к заданному значению, принадлежащему набору значений.

Каждый набор значений имеет группу значений [называемых оригиналы] и соответствующую группу противоположных значений [называемых инвертированные значения]. Член _viceVersa определяет обработку инвертированных значений. Если он установлен в true, инвертированные значения рассматриваются как действительные члены набора значений, а значит, инвертированные значения могут использоваться со всеми определенными операциями набора значений так же, как оригинальные значения.

Шаблонный класс GaSingleValueSet является набором значений только с одним оригинальным значением и одним инвертированным значением. Этот набор значений полезен для значений кода хромосомы, имеющих два возможных состояния.

Схема - Класс GaSingleValueSet

Шаблонный класс GaMultiValueSet является набором значений с несколькими значениями. Каждому значению в группе оригиналов соответствует ровно одно инвертированное значение. Дубликаты оригинальных значений запрещены. Инвертированные значения могут дублироваться, только если _viceVersa установлен в false.

Схема – Класс GaMultiValueSet

Шаблонный класс GaIntervalValueSet является набором значений, содержащим продолжающиеся значения в заданном интервале. Границы интервала определены шаблонным классом GaValueIntervalBounds. У типа значений в наборе должны быть определены операторы +, -, >, >=, < и <=. Пользователь должен предоставить генератор случайных значений, реализующий интерфейс GaRandom.

Схема - Класс GaIntervalValueSet

Шаблонный класс GaUnboundValueSet должен использоваться, когда у значений кода хромосомы нет дополнительных ограничений. У типов сохраненных значений должен быть определен унарный оператор -. Пользователь должен предоставить генератор случайных значений, реализующий интерфейс GaRandom. Диапазон значений, генерируемый этим набором значений, определяется исключительно представленным случайным генератором.

Схема - Класс GaUnboundValueSet

GaCombinedValueSet объединяет два и более наборов значений в один набор.

Схема - Класс GaCombinedValueSet

Шаблонный класс GaSingleValueChromosome используется для хромосом, представляющих решение с единственным значением. Это может быть единственное вещественное или целое число или значение любого другого типа. Этот класс реализует только интерфейс GaMutableCode. Поскольку SingleValueChromosome наследует класс GaDomainChromosome, доменом значения управляет набор значений.

Шаблонный класс GaSVAChromosome подходит для хромосом, поддерживающих арифметические операции, потому что он реализует GaArithmeticalCode. У типа данных значений хромосомы должны быть определены операторы +, -, *, / и оператор / с целочисленным операндом с правой стороны. Это позволяет использовать хромосому во встроенных арифметических операциях кроссовера.

Схема - Класс GaSingleValueChromosome

Шаблонный класс GaMultiValueValueChromosome используется для хромосом, требующих несколько значений для представления решения. Этот класс реализует интерфейсы GaMutableCode, GaSwapableCode, GaSizableCode и GaMultiValueCode. Класс GaChromosomeValue применяется для вставки кода в код хромосомы и извлечения значения.

Шаблонный класс GaMVAChromosome расширяет GaMultiValueValueChromosome подобно тому, как GaSVAChromosome расширяет GaSingleValueValueChromosome.

Схема - Класс GaMultiValueChromosome

Шаблонный класс GaBinaryChromosome реализует хромосомы, представляющие решение с помощью двоичного кодирования. Этот класс имеет набор методов, кодирующих встроенные типы в двоичный поток и раскодирующих поток в оригинальные значения. GaBinaryChromosome использует класс GaBinaryChromosomeParams для параметров хромосом. Этот класс определяет состояние набора вероятностей при создании хромосомы.

Класс GaBit применяется для вставки битов в код хромосомы или для их извлечения.

Схема - Класс GaBinaryChromosome

Эти классы расположены в пространствах имен Chromosome::Representation.