Обсуждение статьи "Генетические алгоритмы - это просто!" - страница 12

 

В бесплатной библиотеке из статьи работа ведётся с генотипом. Работу с фенотипом ведите в ФФ (как в примере 2).

Вышесказанное означает, что библиотека так же эффективно будет работать, если обработка фенотипа будет осуществляться в ФФ, но количество итераций (запусков ФФ) будет существенно больше, чем если бы ГА работал с фенотипом напрямую (так как увеличивается детализация пространства поиска). В пределе поиск (без уточнения фенотипа) стремится к непрерывному пространству поиска.


 

Доброй ночи.

Хотелось  бы поблагодарить вас за отличную статью.

 Для меня слегка сложновато сначала было,  но все же вроде разобрался.

Перед тем как в этой ветке форума что -то писать, хотелось бы прояснить для себя правильно ли я понял вашу статью и ход работы алгоритма UGA:

 1)Настройка входных параметров UGA под конкретную задачу.

 ---UGA

2) Создание первоначальной колонии родителей путем случайного комбинирования генов

2.2)Вычисление результата работы ФФ для каждого из этой колонии

2.3) удаление клонов. 

3) Определение лучшего результата работы ФФ из всех особей в данной колонии

4) Запуск цикла создания колонии потомков от первой колонии. Потомки создаются с помощью инструментов: Кроссинговер,искусственная и естественная мутация, репликация и заимствование генов, где

     Кроссинговер - обмен участками хромосом родителей,

     Иск. Мутация - выбор генов не  из  диапазона (ген родителя 1, ген родителя 2)

     Ест. Мутация -  выбор генов   из  диапазона (Минимум диапазона генов , Максимум диапазона генов)

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

     заимствование генов- создание "сборной особи" от количества родителей равному количеству генов.

 5)Удаление клонов

6 )Вычисление результата работы ФФ для каждого из этой колонии

7)сравнение результатов особей-потомков с эталонным результатом, и  возможное его замещение. при замещении происходит сброс счетчика "Эпох без изменений эталонного значения"

8)Сортировка всех особей от лучшего к худшему

9) -->пункт 4

10)если произошло эпох без изменений Y то завершение работы и  вывод найденного эталонного значения.

 Я заранее прошу прощения.  Возможно здесь ветка обсуждения, а не обучения, но больше мне не где спросить совета. С ГА фактически впервые встретился в вашей статье( До вашей статьи даже толком не понимал что значат слова "Быстрая(генетический алгоритм)" в тестере терминала), поэтому знаний и опыта(занялся программированием на MQL5 месяца 2 назад) маловато.

Если разберусь в вашем алгоритме ГА , то постараюсь его пересадить на ООП. Для чего, собственно и занялся его изучением. Торговые модели, самооптимизирующиеся с прямым перебором я уже реализовал, а с ГА пока нет.( Модели по принципу, описанному в статье https://www.mql5.com/ru/articles/217 )

Заранее благодарен. 

Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • 2010.05.25
  • Andrey Dik
  • www.mql5.com
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
 

mi__x__an:

...хотелось бы прояснить для себя правильно ли я понял вашу статью и ход работы алгоритма UGA

В общих чертах - да, правильно.
 

Добрый  день. 

Спасибо за оперативный ответ. 

Тогда у меня появляются вопросы. 

double Chromosome[];           //Набор оптимизируемых аргументов функции - генов
                               //(например: веса нейронной сети и т.д.)-хромосома
int    GeneCount           =0; //Количество генов в хромосоме
double RangeMinimum        =0.0;//Минимум диапазона поиска
double RangeMaximum        =0.0;//Максимум диапазона поиска
double Precision           =0.0;//Шаг поиска
int    OptimizeMethod      =0; //1-минимум, любое другое - максимум

Здесь массив Chromosome - это что? возможные значения оптимизируемого параметра?

То есть если, к примеру, оптимизируем "минимальный объем лота" в диапазоне от 0.1 до 1( с минимальным шагом лота 0.1),

то массив будет выгдятеть так:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, количество генов в хромосоме 1, минимум 0.1 максимум 1.0, шаг 0.1 ? Так ли?

 И сопутствующий вопрос, как в такой массив, к примеру ввести : Оптимизруемый Стоп-лосс [10..500], Тэйк профит [10..500], Мин. объем лота [0.1...1.0] и флаг Трэйлинг(использовать трэйлинг или нет)[0..1]?

В общем как должны выглядеть входные данные при оптимизации параметров с различными типами, минимумами и максимумами возможных значений?

Заранее благодарен за ответ. 

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
mi__x__an:

Здесь массив Chromosome - это что? возможные значения оптимизируемого параметра?

То есть если, к примеру, оптимизируем "минимальный объем лота" в диапазоне от 0.1 до 1( с минимальным шагом лота 0.1),

то массив будет выгдятеть так:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, количество генов в хромосоме 1, минимум 0.1 максимум 1.0, шаг 0.1 ? Так ли?

 И сопутствующий вопрос, как в такой массив, к примеру ввести : Оптимизруемый Стоп-лосс [10..500], Тэйк профит [10..500], Мин. объем лота [0.1...1.0] и флаг Трэйлинг(использовать трэйлинг или нет)[0..1]?

В общем как должны выглядеть входные данные при оптимизации параметров с различными типами, минимумами и максимумами возможных значений?

Заранее благодарен за ответ. 

Нет,

double Chromosome[];           //Набор оптимизируемых аргументов функции - генов

Chromosome[] именно то, что написано в комментарии.

Первый индекс [0] - значение приспособленности особи. Остальные - оптимизируемые параметры в заданном диапазоне. Это генотип.

С фенотипом (стоп лосы, тейк профиты, объёмы, индикаторы или ещё что то) работайте в ФФ (масштабирование границ оптимизируемых параметров в диапазон генов хромосомы):

Например, гены заданы в диапазоне [-1;1], тогда

0-й индекс: значение ФФ <---------------------------------------------------------[8;8] //певёрнутые на Пи/2 восьмёрки.

1-й индекс: Стоп-лосс [10..500] <------------------------------------------------ [-1;1]

2-й индекс: Тэйк профит [10..500] <--------------------------------------------- [-1;1]

3-й индекс: Мин. объем лота [0.1...1.0] <--------------------------------------- [-1;1]

4-й индекс: флаг Трэйлинг(использовать трэйлинг или нет)[0..1] <------ [-1;1]

И того, массив Chromosome[] имеет 5 ячеек. Например, хромосома может выглядеть так {0.2, 0.3, -0.8, 0.1, 0.9;}

 
Но в таком случае обработку корректности значений, не вещественных  генов придется делать в ФФ. Т.О. если оптимизируем типы long, double, и bool  UGA  будет генерировать для них всех вещественные значения, в том числе и для bool будет много вариаций генов в диапазоне от  RangeMinimum до RangeMaximum, при реальном возможном использовании всего двух значений 1 и 0. Я правильно понимаю? И уже отбор корректных значений будет производится в ФФ?
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
mi__x__an:
Но в таком случае обработку корректности значений, не вещественных  генов придется делать в ФФ. Т.О. если оптимизируем типы long, double, и bool  UGA  будет генерировать для них всех вещественные значения, в том числе и для bool будет много вариаций генов в диапазоне от  RangeMinimum до RangeMaximum, при реальном возможном использовании всего двух значений 1 и 0. Я правильно понимаю? И уже отбор корректных значений будет производится в ФФ?
Правильно, если это не подходит то следует применять бинарный генетический алгоритм (такой как реализован в тестере). Статья по нему есть на четвёртом форуме.
 

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

-- >генерация потомков -->корректировка значений  генов до реально используемых значений -->удаление клонов --> вызов ФФ. 

Как вы думаете при таком ходе, сильно ли это повлияет на работу UGA? Ведь по идее число запусков ФФ должно сократиться если для оптимизации одного параметра шаг больше чем для другого.

 

 
Urain:
Правильно, если это не подходит то следует применять бинарный генетический алгоритм (такой как реализован в тестере). Статья по нему есть на четвёртом форуме.

Нет, тут дело в другом. Алгоритм можно прекрасно использовать и для таких случаев.

mi__x__an:

Но в таком случае обработку корректности значений, не вещественных  генов придется делать в ФФ. Т.О. если оптимизируем типы long, double, и bool  UGA  будет генерировать для них всех вещественные значения, в том числе и для bool будет много вариаций генов в диапазоне от  RangeMinimum до RangeMaximum, при реальном возможном использовании всего двух значений 1 и 0. Я правильно понимаю? И уже отбор корректных значений будет производится в ФФ?

Все операции с фенотипом нужно производить в ФФ. Это вопрос декодирования из генотипа в фенотип.

Ок, допустим, оптимизируемый параметр типа bool и возможны только два варианта: true и false. Тогда декодирование будет что то типа этого:

if(gene<(RangeMaximum+RangeMinimum )/2.0)

p=false;

else

p=true;

где gene - конкретный ген хромосомы.

Получается, что при всём многообразии возможных вариантов этого гена (генотип) получится только 2 фенотипа. Так же, в прочем, и в живой природе дела обстоят.

Однако, из этого вытекает естественным образом следствие: вариантов хромосом будет генерироваться больше (а значит, больше раз будет вычислятся ФФ), чем необходимо для решения задачи. То есть, оптимизация будет проходить дольше. Я об этом говорил уже. Так же дела будут обстоять и в случае двоичного кодирования хромосом. Декодировать всё равно придется в конкретный для задачи фенотип.

НО. И при двоичном кодировании и при представлении генов вещественными числами можно очень просто избежать излишних вычислений ФФ (уменьшить количество возможных вариантов хромосом) - ЗАДАВАТЬ ГРАНИЦЫ И ШАГ ПОИСКА ДЛЯ КАЖДОГО ОПТИМИЗИРУЕМОГО ПАРАМЕТРА. Т.е. заранее отсечь ненужные варианты хромосом (так уже сделано в штатном оптимизаторе с двоичным кодированием). Это можно сделать и для ГА из статьи, нужно просто добавить в него соответствующий функционал - возможность задания границ и шага для каждого гена, то есть позволить ГА работать с фенотипом напрямую.

 

но необходимость задания границ и шага для каждого гена в библиотеке уменьшит ее гибкость.

Во какой, возможно не самый лучший или  даже самый худший способ я использовал в оптимизаторе торговых моделей:

1 - класс оптимизируемого параметра - наследник CObject

class COptimizatedParam: public CObject
{
public:
 string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
 string type; //тип оптимизируемого параметра, требуется для см. выше
 string on;   //с какого значения начать выполнение -минимум
 string step; //шаг
 string end;  //максимум
 string value; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации  и value -текущее значение оптимизируемого параметра
 void   Init(string Name,string Type,string On,string Step,string End)
             {name=Name;type=Type;on=On;step=Step;end=End;}
};

 2 виртуальная функция основной общей модели :

  virtual CList     *OptimizatedParams()

  она позволяет каждой конкретной модели создать свой список оптимизируемых параметров.

3. оптимизирующая функция - она рекурсивно перебирает все необходимые значения.

Т.О. Любые перечислимые типы в принципе она может обработать.

 Теперь вопрос: Рационально было бы так же входными данными сделать CList  в котором через этот класс Оптимизируемого параметра передается информация о нем, а Библиотека UGA уже сама создает сколько нужно границ и шагов для каждого гена. Это придало бы ей больше гибкости и уменьшило бы количество лишних запусков ФФ для создания не генетических а фенотипических клонов. 

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
Причина обращения: