Предлагаю в этой ветке писать о вопросах и достижениях сообщества в указанной области, делиться кодами.
У меня есть вопрос к специалистам. Кто-нибудь реализовал алгоритм дифференциальной эволюции для МТ(в виде универсальной функции)? Алгоритм предназначен для численного поиска минимума или максимума функции, когда сделать аналитически это трудно или нельзя. Алгоритм известен с 90х годов, довольно полезный и не сложный. В кодобазе он мне не встречался. Кто-то может поделиться? Если нет, то выложу свой вариант, когда напишу, но как скоро это будет - не знаю. Интересны и другие реализованные ГА, осуществляющие эту задачу (желательно попроще, без наворотов, чтобы каждый мог разобраться и под себя изменть). Также интересен опыт, насколько хорошо такие алгоритмы справляются с указанной задачей для много-экстремальных функций.
Посоветуйте, какие книги прочитать и в какой последовательности?
Не читайте книги о ГА, мой Вам добрый совет - воды много, а сути мало, будете только пудрить себе мозги и всё. Я ни одну из книг о ГА не дочитал и до середины по этой причине.
Прошу прощения, за нескромность (скромность не будет причиной моей смерти это точно), прочитайте лучше мою статью о ГА. Разберите код по косточкам - толку будет намного больше. А может быть даже найдете какие нибудь ещё ошибки/баги, как недавно очень помог мне 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 constantsconstint HQRNDMax = 2147483563;
constint HQRNDM1 = 2147483563;
constint HQRNDM2 = 2147483399;
constint 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)
{
returnrand()%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 |//+------------------------------------------------------------------+voidOnStart()
{
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 значений генератора равномерно распределенных целых положительных чисел
}
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 Третья задача не по зубам "дифференциальной эволюции (дву-мерный вариант)", а возможно и первая тоже.
Скажите пожалуйста, на сколько глубокие знания в математике нужно иметь, перед тем как приступать к изучению ГА?
Спасибо!
4-6 классы школы.
Эт помним :)
Посоветуйте, какие книги прочитать и в какой последовательности?
Предлагаю в этой ветке писать о вопросах и достижениях сообщества в указанной области, делиться кодами.
У меня есть вопрос к специалистам. Кто-нибудь реализовал алгоритм дифференциальной эволюции для МТ(в виде универсальной функции)? Алгоритм предназначен для численного поиска минимума или максимума функции, когда сделать аналитически это трудно или нельзя. Алгоритм известен с 90х годов, довольно полезный и не сложный. В кодобазе он мне не встречался. Кто-то может поделиться? Если нет, то выложу свой вариант, когда напишу, но как скоро это будет - не знаю. Интересны и другие реализованные ГА, осуществляющие эту задачу (желательно попроще, без наворотов, чтобы каждый мог разобраться и под себя изменть). Также интересен опыт, насколько хорошо такие алгоритмы справляются с указанной задачей для много-экстремальных функций.
Так вот же: http://www.icsi.berkeley.edu/~storn/code.html
Можно длл скомпилировать, можно переписать на MQL почти один в один : есть код и для С, и для С++.
Эт помним :)
Посоветуйте, какие книги прочитать и в какой последовательности?
Не читайте книги о ГА, мой Вам добрый совет - воды много, а сути мало, будете только пудрить себе мозги и всё. Я ни одну из книг о ГА не дочитал и до середины по этой причине.
Прошу прощения, за нескромность (скромность не будет причиной моей смерти это точно), прочитайте лучше мою статью о ГА. Разберите код по косточкам - толку будет намного больше. А может быть даже найдете какие нибудь ещё ошибки/баги, как недавно очень помог мне Serj_Che, за что ему большое спасибо. Скоро обновлю библиотеку в статье и сдесь в кодабазе.
PS Просто удивительно, сколько людей качают из кодабазы но не смотрят в код. Иначе давно уже последняя из найденных ошибок была обнаружена, хотя, вполне возможно, человеков часто ломает написать автору об найденной ошибке.
Мой вклад - качественный генератор равномерно распределенных псевдо-случайных чисел из библиотеки сайта ALGLIB Project. Обращаю ваше внимание, что при продаже этого кода сторонним лицам, а не себе - необходимо связаться с автором проекта и получить лицензию. Код на MT5, 4-ку я не знаю, энтузиасты могут переписать.
Мой вклад - качественный генератор равномерно распределенных псевдо-случайных чисел из библиотеки сайта ALGLIB Project.
Еще вариант.
Гаусс, значит - неравномерное распределение? Тоже пригодится. Спасибо.
Гаусс, значит - неравномерное распределение? Тоже пригодится. Спасибо.
Нормальное распределение.
Простой генератор равномерного - MathRand().
Почему только двумерный?
1) Для алгоритмов оптимизации бессмысленно сравнивать время их работы, так как основное время уходит на вычисление ФФ.
Поэтому важнейшим показателем является количество запусков ФФ. Вторым показателем, связанным с первым, является сходимость алгоритма. Поэтому лучше говорить так: в среднем, при 1000 запусках ФФ в каждом испытании, при 100 испытаниях, нахождение точного значения экстремума составило 95%. Другими словами, вероятность нахождения точного значения экстремума составляет 95% и для этого понадобится 1000 запусков ФФ.
2) Размер популяции и их количество не корректно выставлять одинаковыми у сравниваемых алгоритмов, так как поисковые свойства алгоритмов зависят от свойств генетических операторов, реализованных в них, по большей части, а не от размера популяции. То есть, какой то алгоритм при меньшем размере популяции может сходится лучше и при меньшем количестве запусков ФФ чем другой.
3) В виду первых двух пунктов нет смысла сравнивать железо, так как оно никак не влияет на поисковые качества алгоритмов.
Подытоживая, можно использовать два варианта тестовых условий для алгоритма:
1) При каком наименьшем количестве запусков в среднем алгоритм сходится в 100% случаях?
2) Задать заведомо "жесткое" небольшое количество запусков ФФ, например 500, и сравнивать среднеквадратичную ошибку у алгоритмов. (алгоритм должен при не более 500 запусках показывать наименьшую ошибку)
Вот два четких критерия оценки, при которых получится полноценная и справедливая битва алгоритмов оптимизации.
Для тестовых испытаний предлагаю три функции.
1) Гладкая, непрерывная, с не дифференцируемыми экстремумами. Пример: Trapfall
2) Гладкая, непрерывная с дифференцируемыми экстремумами. Пример: Skin
3) Дискретная, непрерывная с не дифференцируемыми экстремумами. Пример: "Найти точки ZZ на на ценовом чарте, на заданном количестве баров с наибольшим суммарным количеством пунктов между точками"
PS Третья задача не по зубам "дифференциальной эволюции (дву-мерный вариант)", а возможно и первая тоже.