Генетические алгоритмы. Вопросы экспертам. - страница 2

 
Elliotttrader:

Скажите пожалуйста, на сколько глубокие знания в математике нужно иметь, перед тем как приступать к изучению ГА?

Спасибо!

4-6 классы школы.
 
joo:
4-6 классы школы.

Эт помним :)

Посоветуйте, какие книги прочитать и в какой последовательности?

 
-Aleksey-:

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

У меня есть вопрос к специалистам. Кто-нибудь реализовал алгоритм дифференциальной эволюции для МТ(в виде универсальной функции)? Алгоритм предназначен для численного поиска минимума или максимума функции, когда сделать аналитически это трудно или нельзя. Алгоритм известен с 90х годов, довольно полезный и не сложный. В кодобазе он мне не встречался. Кто-то может поделиться? Если нет, то выложу свой вариант, когда напишу, но как скоро это будет - не знаю. Интересны и другие реализованные ГА, осуществляющие эту задачу (желательно попроще, без наворотов, чтобы каждый мог разобраться и под себя изменть). Также интересен опыт, насколько хорошо такие алгоритмы справляются с указанной задачей для много-экстремальных функций.

Так вот же: http://www.icsi.berkeley.edu/~storn/code.html

Можно длл скомпилировать, можно переписать на MQL почти один в один : есть код и для С, и для С++.

 
Elliotttrader:

Эт помним :)

Посоветуйте, какие книги прочитать и в какой последовательности?

Не читайте книги о ГА, мой Вам добрый совет - воды много, а сути мало, будете только пудрить себе мозги и всё. Я ни одну из книг о ГА не дочитал и до середины по этой причине.

Прошу прощения, за нескромность (скромность не будет причиной моей смерти это точно), прочитайте лучше мою статью о ГА. Разберите код по косточкам - толку будет намного больше. А может быть даже найдете какие нибудь ещё ошибки/баги, как недавно очень помог мне Serj_Che, за что ему большое спасибо. Скоро обновлю библиотеку в статье и сдесь в кодабазе.

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

 

Мой вклад - качественный генератор равномерно распределенных псевдо-случайных чисел из библиотеки сайта ALGLIB Project. Обращаю ваше внимание, что при продаже этого кода сторонним лицам, а не себе - необходимо связаться с автором проекта и получить лицензию. Код на MT5, 4-ку я не знаю, энтузиасты могут переписать.

//Company ALGLIB Project
//
//Proprietor Bochkanov Sergey Anatolyevich
//
//E-mail sergey.bochkanov at alglib.net
//
//Site http://www.alglib.net/
//
//Licencing can't be used in commercial applications with free lisence
//
//'Pierre L'Ecuyer's Hihg-Quality Random Uniform Generator
//
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'Data types
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'Portable high quality random number generator state.
//'Initialized with HQRNDRandomize() or HQRNDSeed().
//'
//'Fields:
//'    S1, S2      -   seed values
//'    V           -   precomputed value
//'    MagicV      -   'magic' value used to determine whether State structure
//'                    was correctly initialized.
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
struct HQRNDState
   {
      int S1;
      int S2;
      double V;
      int MagicV;
   };
//Global constants
const int HQRNDMax = 2147483563;
const int HQRNDM1 = 2147483563;
const int HQRNDM2 = 2147483399;
const int HQRNDMagic = 1634357784;
//'Routines
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'HQRNDState  initialization  with  random  values  which come from standard
//'RNG.
//'
//'  -- ALGLIB --
//'     Copyright 02.12.2009 by Bochkanov Sergey
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
void HQRNDRandomize(HQRNDState &State)
   {
      HQRNDSeed(RandomInteger(HQRNDM1), RandomInteger(HQRNDM2), State);
   }
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'HQRNDState initialization with seed values
//'
//'  -- ALGLIB --
//'     Copyright 02.12.2009 by Bochkanov Sergey
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
void HQRNDSeed(int S1, int S2, HQRNDState &State)
   {
      State.S1=S1%(HQRNDM1-1)+1;
      State.S2=S2%(HQRNDM2-1)+1;
      State.V=(double)1/(double)HQRNDMax;
      State.MagicV=HQRNDMagic;
   }
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'This function generates random integer number in (0, (standart RND(0,1)*x)) 
//'
//'  -- ALGLIB --
//'     Copyright 02.12.2009 by Bochkanov Sergey
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
int RandomInteger(int X)
   {
      return rand()%X;
   }
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'This function generates random real number in (0,1),
//'not including interval boundaries
//'
//'State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
//'
//'  -- ALGLIB --
//'     Copyright 02.12.2009 by Bochkanov Sergey
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
double HQRNDUniformR(HQRNDState &State)
   {
      double Result;
      Result = State.V*HQRNDIntegerBase(State);
      return Result;
   }
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'This function generates random integer number in [0, N)
//'
//'1. N must be less than HQRNDMax-1.
//'2. State structure must be initialized with HQRNDRandomize() or HQRNDSeed()
//'
//'  -- ALGLIB --
//'     Copyright 02.12.2009 by Bochkanov Sergey
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
int HQRNDUniformI(int N, HQRNDState &State)
{
    int mx;
    int result;
    /*
     * Correct handling of N's close to RNDBaseMax
     * (avoiding skewed distributions for RNDBaseMax<>K*N)
     */
    mx=HQRNDMax-1-(HQRNDMax-1)%N;
    do
    {
        result=HQRNDIntegerBase(State)-1;
    }
    while(result>=mx);
    result=result%N;
    return result;
}
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//'
//'L'Ecuyer, Efficient and portable combined random number generators
//'
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
int HQRNDIntegerBase(HQRNDState &State)
   {
      int k;
      int result;
      k = State.S1/53668;
      State.S1=40014*(State.S1-k*53668)-k*12211;
      if (State.S1<0)
      {
         State.S1=State.S1+2147483563;
      }
      k=State.S2/52774;
      State.S2=40692*(State.S2-k*52774)-k*3791;
      if (State.S2<0)
      {
         State.S2=State.S2+2147483399;
      }
      /*
      * Result
      */
      result = State.S1-State.S2;
      if( result<1 )
      {
         result=result+2147483562;
      }
      return result;
   }
   
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
      HQRNDState state; // объявление переменной, необходимой для инициализации генератора
      HQRNDRandomize(state); // инициализация генератора
      for (int i=1; i<=100; i+=1) printf("i="+string(i)+"; Uniform_Distributed_Real_Random_Value(0, 1)="+string(HQRNDUniformR(state))); // печать 100 значений генератора равномерно распределенных вещественных чисел
      for (int i=1; i<=100; i+=1) printf("i="+string(i)+"; Uniform_Distributed_Integer_Random_Value[0, N)="+string(HQRNDUniformI(11 ,state))); // печать 100 значений генератора равномерно распределенных целых положительных чисел
   }
 
-Aleksey-:

Мой вклад - качественный генератор равномерно распределенных псевдо-случайных чисел из библиотеки сайта ALGLIB Project.

Еще вариант.
 
hrenfx:
Еще вариант.

Гаусс, значит - неравномерное распределение? Тоже пригодится. Спасибо.
 
-Aleksey-:

Гаусс, значит - неравномерное распределение? Тоже пригодится. Спасибо.

Нормальное распределение.

Простой генератор равномерного - MathRand().

 
joo, я написал в черновом варианте дифференциальную эволюцию(дву-мерный вариант). Давайте прогоним какую-нибудь тяжелую функцию(двумерную), и сравним время и точность. Исходные параметры надо задать одинаковые: размер популяции, количество популяций. Еще, какие компьютеры, у меня по тестеру, без оптимизации, на одном ядре PR100-PR110, Процессор AMD Athlon(tm) II X2 245 Processor, 2893 МГц, ядер: 2, логических процессоров: 2.

 

Почему только двумерный?


1) Для алгоритмов оптимизации бессмысленно сравнивать время их работы, так как основное время уходит на вычисление ФФ.

Поэтому важнейшим показателем является количество запусков ФФ. Вторым показателем, связанным с первым, является сходимость алгоритма. Поэтому лучше говорить так: в среднем, при 1000 запусках ФФ в каждом испытании, при 100 испытаниях, нахождение точного значения экстремума составило 95%. Другими словами, вероятность нахождения точного значения экстремума составляет 95% и для этого понадобится 1000 запусков ФФ.

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

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


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

1) При каком наименьшем количестве запусков в среднем алгоритм сходится в 100% случаях?

2) Задать заведомо "жесткое" небольшое количество запусков ФФ, например 500, и сравнивать среднеквадратичную ошибку у алгоритмов. (алгоритм должен при не более 500 запусках показывать наименьшую ошибку)

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


Для тестовых испытаний предлагаю три функции.

1) Гладкая, непрерывная, с не дифференцируемыми экстремумами. Пример: Trapfall

2) Гладкая, непрерывная с дифференцируемыми экстремумами. Пример: Skin

3) Дискретная, непрерывная с не дифференцируемыми экстремумами. Пример: "Найти точки ZZ на на ценовом чарте, на заданном количестве баров с наибольшим суммарным количеством пунктов между точками"


PS Третья задача не по зубам "дифференциальной эволюции (дву-мерный вариант)", а возможно и первая тоже.

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