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

 
MigVRN:

P.S. : а оправдывает себя использования банка памяти, если переменная состоит из ~150 значений. А в истории 100000 особей.  Может в таком случае быстрее будет посчитать, чем все это проверить (перебрать)?  Не проверяли?

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

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

 
MigVRN:
....

:)

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

for (Ge=1;Ge<=GeneCount;Ge++)
      {
        if (Colony[Ge][position]!=HistoryHromosomes[Ge][Ch1])
          break;
        cnt++;
      }

здесь хоть и сравнивается хромосома с положением Ch1, но на верхнем цикле присваиваться +1, поэтому и вычитаю потом -1.

Согласен, кривовато, можно и красивше заделать.

Вот, собственно, скриптик для проверки:

//+------------------------------------------------------------------+
//|                                                         Check.mq5 |
//|                                      Copyright 2011, JQS aka Joo |
//|                              https://www.mql5.com/ru/users/joo |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, JQS aka Joo"
#property link      "https://www.mql5.com/ru/users/joo"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

double Colony[][5];
double HistoryHromosomes[][3];

int ChrCountInHistory=5;
int GeneCount=5;
int position=0;

void OnStart()
{
  ArrayResize(Colony,GeneCount+1);            ArrayInitialize(Colony,0.0);
  ArrayResize(HistoryHromosomes,GeneCount+1); ArrayInitialize(HistoryHromosomes,0.0);

  Colony[1][0]=7.0;
  Colony[2][0]=8.0;
  Colony[3][0]=9.0;
  Colony[4][0]=3.0;
  Colony[5][0]=2.0;

  HistoryHromosomes[0][0]=8.0;
  //-------------------------
  HistoryHromosomes[1][0]=7.0;
  HistoryHromosomes[2][0]=8.0;
  HistoryHromosomes[3][0]=9.0;
  HistoryHromosomes[4][0]=3.0;
  HistoryHromosomes[5][0]=1.0;//другой ген


  HistoryHromosomes[0][1]=7.0;
  //-------------------------
  HistoryHromosomes[1][1]=7.0;
  HistoryHromosomes[2][1]=8.0;
  HistoryHromosomes[3][1]=6.0;//другой ген
  HistoryHromosomes[4][1]=3.0;
  HistoryHromosomes[5][1]=2.0;

  HistoryHromosomes[0][2]=11.0;
  //-------------------------
  HistoryHromosomes[1][2]=7.0;
  HistoryHromosomes[2][2]=8.0;
  HistoryHromosomes[3][2]=9.0;
  HistoryHromosomes[4][2]=3.0;
  HistoryHromosomes[5][2]=2.0;

  CheckHistoryChromosomes();

  Print(Colony[0][0]);
}
//+------------------------------------------------------------------+

//——————————————————————————————————————————————————————————————————————————————
//Проверка хромосомы по базе хромосом.
void CheckHistoryChromosomes()
{
  //----------------------------------------------------------------------------
  int   Ch1=0;  //Индекс хромосомы из базы
  int   Ge =0;  //Индекс гена
  int   cnt=0;  //Счетчик уникальных генов. Если хоть один ген отличается 
                //- хромосома признается уникальной
  //----------------------------------------------------------------------------
  //Если в базе хранится хоть одна хромосома
  if (ChrCountInHistory>0)
  {
    //Переберем хромосомы в базе, чтобы найти такую же
    for (Ch1=0;Ch1<ChrCountInHistory && cnt<GeneCount;Ch1++)
    {
      cnt=0;
      //Сверяем гены, пока индекс гена меньше кол-ва генов и пока 
      //...попадаются одинаковые гены
      for (Ge=1;Ge<=GeneCount;Ge++)
      {
        if (Colony[Ge][position]!=HistoryHromosomes[Ge][Ch1])
          break;
        cnt++;
      }
    }
    //Если набралось одинаковых генов столько же, можно взять 
    //...готовое решение из базы
    if (cnt==GeneCount)
    {
      Colony[0][position]=HistoryHromosomes[0][Ch1-1];
    }
    //Если нет такой же хромосомы в базе, то рассчитаем для неё FF...
    else
    {
      FitnessFunction();
      //.. и если есть место в базе сохраним
      if (ChrCountInHistory<5)
      {
        for (Ge=0;Ge<=GeneCount;Ge++)
          HistoryHromosomes[Ge][ChrCountInHistory]=Colony[Ge][position];
        ChrCountInHistory++;
      }
    }
  }
  //Если база пустая, рассчитаем для хромосомы FF и сохраним её в базе
  else
  {
    FitnessFunction();
    for (Ge=0;Ge<=GeneCount;Ge++)
      HistoryHromosomes[Ge][ChrCountInHistory]=Colony[Ge][position];
    ChrCountInHistory++;
  }
}
//——————————————————————————————————————————————————————————————————————————————

void FitnessFunction()
{
  Colony[0][position]=20.0;
}
 
joo:

... но на верхнем цикле присваиваться +1, поэтому и вычитаю потом -1 ...

  Вот где собака порылась!!! А я думаю - как же так - статье год уже - а все работает, никто не жалуется... Ещё раз спасибо за статью... и за разъяснения :)

 
@joo Здравствуйте. Нравится Ваш Зиг-Заг, однако он медленно работает на большом количестве свечей. Возможно ли получить ускорение без потери качества?
 
Graff:
@joo Здравствуйте. Нравится Ваш Зиг-Заг, однако он медленно работает на большом количестве свечей. Возможно ли получить ускорение без потери качества?

Извините, но я не автор этого индикатора.

Обратитесь на страницу обсуждения этого индикатора, пожалуйста.

 
joo:

Не буду оспаривать компетентность приведённого источника, однако вынужден не согласится.

Целесообразность применения ГА в задачах оптимизации заключена в снижении необходимого количества запусков ФФ для определения оптимума в сравнении с прямым перебором.

Если следовать рекомендации 

то для задачи с 1000 аргументами потребуется размер популяции в 11000 особей! А это 11000 запусков ФФ только на 1 эпохе! С таким же успехом можно использовать случайное генерирование генов и результат не намного уступит в нахождении оптимума. Приведенный источник делает "ставку" на то, что в большой популяции будет достаточно генетического материала для дальнейшего развития популяции в сторону улучшения на каждой эпохе. Я же стараюсь добиться того же самого, но за счет игры вероятностями генетическими операторами без тотального увеличения запусков ФФ.

Чесслово, не смог себе представить задачу с 1000 аргументов. Использую алгоритм для обучения нервосети, ну, допустим пять слоев, хотя достаточно обычно трёх, так это получается на входе 14 переменных для пятислоя, и 17 для трёхслоя!!! Что туда можно подавать?!
 
Rich:
Чесслово, не смог себе представить задачу с 1000 аргументов. Использую алгоритм для обучения нервосети, ну, допустим пять слоев, хотя достаточно обычно трёх, так это получается на входе 14 переменных для пятислоя, и 17 для трёхслоя!!! Что туда можно подавать?!

Легко.

Вот количество оптимизируемых параметров для 4-х слойной сети с 2-мя скрытыми слоями, например, для такой - 10-40-40-1:

10*40+40+40*40+40+40*1+1=2121 (весов нейронов и их смещений для 40+40+1=81 нейронов).

Как видите, для такой, относительно небольшой сети требуется оптимизировать 2121 параметра.

 

Извините , но немного туплю .

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

 
ivandurak:

...

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

Совершенно верно, если расстояние между генами достаточно большое то и шаг будет больше, при сближении генов, шаг уменьшается автоматически, просто потому что само понятие шаг не используется, а используется точность с которой нужно найти решение. Расстояние между генами всё время делится на период рандома, а он постоянный 32768. Полученное число и будет условным шагом.

Если даже результат не известен, то можно предположить решение какой точности требуется, это проще чем в неизвестном пространстве задавать с каким шагом нужно искать решение.

 
Подскажите ПЛЗ по какому критерию и сколько убивать  потомков . Сколько родителей и потомков должно быть в зависимости от кол-ва оптимизируемых параметров .С какой эпохи можно допустить инцест . В целом не совсем понятно по какому принципу убивать родителей .Просто к сожалению ваш труд не совсем подходит для моих целей , а так огромное спасибо с кисточкой .
Причина обращения: