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

 
shurick:

Большое спасибо за разъяснение, на вопрос по удалению дубликатов полностью удовлетворен ответом. Прикладываю код скрипта с демонстрацией оригинальной и оптимизированной функцией, который демонстрирует уменьшение количества прохода в циклах. В текущем моём замечании я НЕ указываю на ошибку функции, а предлагаю её оптимизацию, а также основной целью было выяснить принцип удаления дубликатов, на что я получил исчерпывающий ответ. Ещё раз большое спасибо за библиотеку и за разъяснения по функции.

110 и 160 слишком много для 20-ти хромосом.... Вы не туда, куда надо поставили счетчик.

надо так:

//Выбираем второй из пары...
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG считаем сколько раз проходим циклы Ch и Ch2
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG считаем сколько раз сравниваем хромосомы
          //Обнулим счетчик количества идентичных генов
          cnt=0;
          //Сверяем гены, пока попадаются одинаковые гены
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Если набралось одинаковых генов столько же, сколько всего генов
          //..хромосома признается дубликатом
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

Ок. Теперь попробуйте ту же популяцию, с теми же хромосомами, но в такой последовательности:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

Что наблюдаем?

 

to shurick:

Действительно. Количество проверок на уникальность, при наличии всех разных хромосом, можно посчитать по формуле

(PopulChromosCount^2-PopulChromosCount)/2

В нашем примере, в котором есть 20 хромосом (при условии, что все хромосомы разные), количество проверок составит:

(20*20-20)/2=190

это подтверждается такой проверкой:

int m_init[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

Если будут попадаться дубликаты, проверок будет ещё меньше.

Спасибо за активное участие в проекте!

Соответствующие изменения будут внесены в библиотеку. Хотя изменения никак не повлияют на поисковые возможности алгоритма, но всё же сделают его работу более рациональной.

 
joo:

Что наблюдаем?

Результат 

 Хотя изменения никак не повлияют на поисковые возможности алгоритма

Совершенно верно, качество алгоритма не изменится, хотя изначально я сомневался в этом, но теперь Вы мне это доказали, но на этих сомнениях нашёлся метод оптимизации :)

 
Обновил библиотеку UGA и примеры к статье. Текущая свободная авторская версия 1.2.1.
Файлы:
 
Обновление библиотеки UGA и примеров для этой статьи. Текущая бесплатная версия авторинга 1.2.1.
Файлы:
 

Изучал статью и в коде нашел такое несоответствие, в двух функциях для получения значений диапазона используется одна и та же формула: 

//Репликация
void Replication
...
    //Назначим границы создания нового гена
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

//Искусственная мутация.
void ArtificialMutation
...
    //Назначим границы создания нового гена
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

Т.е. получаются данные за пределами значений двух генов , что свойственно "искусственной мутации". Это баг или есть другое объяснение?

Мне видится, что для метода репликации необходимо поменять знаки:

    Minimum = C1+((C2-C1)*ReplicationOffset);

    Maximum = C2-((C2-C1)*ReplicationOffset);


 

 
Batohov:

Изучал статью и в коде нашел такое несоответствие, в двух функциях для получения значений диапазона используется одна и та же формула: 

Т.е. получаются данные за пределами значений двух генов , что свойственно "искусственной мутации". Это баг или есть другое объяснение?

Мне видится, что для метода репликации необходимо поменять знаки:

    Minimum = C1+((C2-C1)*ReplicationOffset);

    Maximum = C2-((C2-C1)*ReplicationOffset);

Ошибки или несоответсвия нет. И в репликации и в искусственной мутации одинаково определяются границы вероятного появления нового гена (приведённые Вами участки кода).

Но для репликации область вероятности лежит в пределах этих границ, а для искусственной мутации - за этими границами.

Репликация служит для передачи признаков, характерных генам обоих родителей (в пределах границ).

Искусственная мутация служит для генерации новых генов, отличных от генов родителей (за пределами границ).

 
joo:

Ошибки или несоответсвия нет. И в репликации и в искусственной мутации одинаково определяются границы вероятного появления нового гена (приведённые Вами участки кода).

Но для репликации область вероятности лежит в пределах этих границ, а для искусственной мутации - за этими границами.

Репликация служит для передачи признаков, характерных генам обоих родителей (в пределах границ).

Искусственная мутация служит для генерации новых генов, отличных от генов родителей (за пределами границ).

Спасибо за быстрый ответ, я понял ход Вашей мысли.
 
joo:

Кстати, очень приятно являться разрушителем одного из самых известных трейдерских мифов, связанного с ZZ (вторая задача в статье).  :)

Видимо, я не понял формулировки задачи. Мое утверждение:

Точки входа для максимальной прибыли с уловием, что мин. сделка N пунктов, располагаются на вершинах ЗигЗага с условием мин. колена N + Spread пунктов.

 
joo:

В ветке на MQL4 форума "Тестовая многопеременная многоэкстремальная функция"   я выкладывал некоторые интересные тестовые функции, одна из них представлена в статье.

Если есть желание, можете попробовать найти экстремумы предлагаемых функций другими алгоритмами оптимизации отличными от GA и выложить результаты здесь. Милости прошу. Всем будет интересно и мне в первую очередь. 

Понимаю, что очень важно оценить достоверность подгонки. Одним из методов видится добавление шума к исходным данным.

Исходные коды альтернативных методов оптимизации можно найти здесь (http://alglib.sources.ru/optimization/) и здесь (http://ool.sourceforge.net/).

Очевидно, каждый оптимизационный алгоритм показывает лучшие результаты на своих классах целевых функций.

Какие целевые функции вы используете на практике?