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

 
joo:

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

Конечно можно.

Извините за глупый вопрос, я не программист. Если возможно - поделитесь кодом, где используется Ваша библиотека для подбора сразу нескольких параметров к одному индикатору(например Ишимоку, МАКД) для наглядности ее работы.
 
Graff:
Извините за глупый вопрос, я не программист. Если возможно - поделитесь кодом, где используется Ваша библиотека для подбора сразу нескольких параметров к одному индикатору(например Ишимоку, МАКД) для наглядности ее работы.

Вопрос вовсе не глупый.

Воспользуйтесь вторым примером в статье. Вместо индикатора ZZ подставьте любой другой. В место чтения вершин ZZ нужно прописать свои условия (MACD, например, получится тот же альтернативный зигзаг, но по правилам Вами заданными). Ничего сложного нет. Пробуйте, пишите код. Не получится, задавайте вопросы, демонстрируя проблемные места в коде. Кому интересно, тот увидит способы решения своих задач, польза будет и Вам, и.. и всем. Если нет желания изучать язык, обращайтесь, пожалуйста, в "Работа".

 

2joo:

Подскажите пожалуйста суть работы функции RemovalDuplicates()? Вопрос собственно такой: Если у нас имеется две одинаковые хромосомы, то они обе должны быть помечены как дубликат, или одна должна остаться НЕпомеченной как дубликат для дальнейшего использования?

Также для ускорения этой функции предлагаю цикл Ch2 начать со значения Ch+1, т.к. нет смысла Ch2 начинать с нуля:

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

 и если на мой вопрос ответ будет, что обе хромосомы помечаем как дубликат, то вместо:

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

сделать:

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

 А если ответ будет, что одну хромосому надо оставить НЕпомеченной как дубликат, то цикл Ch2 по-любому надо начинать со значения Ch+1. 

 
shurick:

2joo:

Подскажите пожалуйста суть работы функции RemovalDuplicates()? Вопрос собственно такой: Если у нас имеется две одинаковые хромосомы, то они обе должны быть помечены как дубликат, или одна должна остаться НЕпомеченной как дубликат для дальнейшего использования?

Алгоритм этой функции  такой:

Помечаем все хромосомы признаком уникальности "1". Думаем, что все хромосомы уникальны.

Проверяем, есть ли одинаковые хромосомы. Для этого виртуально дублируем популяцию и сравниваем все хромосомы друг с другом, при этом пропуская пары с одинаковым порядковым номером. Найденные дубликаты помечаются признаком дубликата "0".

Далее, копируем все оставшиеся хромосомы, не помеченные как "0", во временный массив. Получаем заполненный временный массив без пропусков, при этом, мы уже знаем, сколько уникальных хромосом осталось в популяции.

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


ЗЫ Для проверки этой функции напишите скрипт, пробуйте подсовывать вручную составленные хитрые комбинации заполненных массивов. Будет видно, насколько эффективно/неэффективно  работает функция. Посчитайте, сколько возможно наименьшее количество проверок столбцов в массиве и сравните с тем, сколько раз проверяет столбцы функция RemovalDuplicates().

 
joo:

ЗЫ Для проверки этой функции напишите скрипт, пробуйте подсовывать вручную составленные хитрые комбинации заполненных массивов. Будет видно, насколько эффективно/неэффективно  работает функция. Посчитайте, сколько возможно наименьшее количество проверок столбцов в массиве и сравните с тем, сколько раз проверяет столбцы функция RemovalDuplicates().

При начале цикла "for (Ch2=Ch+1" количество необходимых и достаточных итераций уменьшится в 2 с хвостиком раза и одна из хромосом дубликатов не будет помечена как дубликат. Вот меня интересовал вопрос, на сколько будет правильней одну хромосому из дубликатов оставить уникальной?! Т.е. задача функции удалить одинаковые хромосомы, но один экземпляр из дублирующихся хромосом мне кажется лучше вернуть в популяцию, потому что наличие её дубликатов не доказывает её жизненепригодность. К примеру: если есть массив хромосом {1,3,4,7,7,6,7,8,8}, то оптимальным удалением дубликатов думаю будет такой результат: {1,3,4,7,6,8}. Т.о. хромосомы 7 и 8 будут рассмотрены в дальнейшем.
 
shurick:
При начале цикла "for (Ch2=Ch+1" количество необходимых и достаточных итераций уменьшится в 2 с хвостиком раза и одна из хромосом дубликатов не будет помечена как дубликат. Вот меня интересовал вопрос, на сколько будет правильней одну хромосому из дубликатов оставить уникальной?! Т.е. задача функции удалить одинаковые хромосомы, но один экземпляр из дублирующихся хромосом мне кажется лучше вернуть в популяцию, потому что наличие её дубликатов не доказывает её жизненепригодность. К примеру: если есть массив хромосом {1,3,4,7,7,6,7,8,8}, то оптимальным удалением дубликатов думаю будет такой результат: {1,3,4,7,6,8}. Т.о. хромосомы 7 и 8 будут рассмотрены в дальнейшем.

Предыдущее Ваше замечание про cnt++ было справедливым. Но на этот раз ошибаетесь. Предлагаю не заниматься рассуждениями на тему "А что будет, если..?", а написать скрипт, проверить функцию, и продемонстрировать результат.

Одна единственная уникальная хромосома остается, остальные точные её копии будут признаны дубликатами и "удалены".

Эта, пожалуй, одна из самых москвыносящих функций из всего алгоритма UGA. На неё у меня ушло больше всего времени. Но в ней ошибок нет.


PS Главное, что бы не было повторных проверок одних и тех же хромосом - это выполняется.

Количество проверок на уникальность минимально необходимое. Если же Вы говорите о количестве заходов в операторе for(), то их можно сократить (при том, что количество проверок на уникальность останется прежним - минимально возможным) введя дополнительную переменную, каждый раз увеличивающуюся на единицу во вложенном. Это приведет к замедлению работы функции.

PPS Если же делаете акцент на:

shurick:

.... 

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

Задача функции - удаление дубликатов. Она так и называется. А не в удалении одинаковых хромосом. Чувствуете разницу? В этой функции не различаются хромосомы по их жизнеспособности. В итоге остаются только уникальные хромосомы в единственном экземпляре без дубликатов(копий)

PPPS Сделаю, на всякий случай ещё одно пояснение.

Допустим, у нас есть популяция, состоящая из 20 хромосом (для простоты и наглядности с одним целочисленным геном), задача максимизации:

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

То есть, в популяции хромосом, содержащие ген

2 - 4 штуки

3 - 4 штуки

4 - 2 штуки

5 - 3 штуки

6 - 2 штуки

7 - 3 штуки

9 - 1 штука

10 - 1 штука

Итого - 20 штук хромосом.

После удаления дубликатов, популяция будет выглядеть так, осталось 8 хромосом:

|7|2|3|9|4|5|6|10|

То есть, осталось по одной уникальной хромосоме, остальные - их дубликаты и будут "удалены"

после вызова функции

PopulationRanking();

в конце функции

RemovalDuplicates()

Популяция будет выглядеть так:

|10|9|7|6|5|4|3|2|

 
joo:

PPPS Сделаю, на всякий случай ещё одно пояснение.

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

Результат скрипта проверки оптимизации функции 

Файлы:
 
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:

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

Результат 

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

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

Причина обращения: