Optimizasyon Algoritmaları Şampiyonası. - sayfa 53

 
Andrey Dik :

Algoritmanın ilk sürümü için test komut dosyası:

Bu kadar basit bir işlev için arayüzü fazla karmaşık hale getirdiniz. Gereksiz ihracat çok ama tam tersine gerekli şeyler yeterli değil. Kodunuzu ilk defa anlamadım, programlamada bu kadar iyi olmayan insanların nasıl hissettiğini hayal edebiliyorum.

Şimdi basitleştirilmiş bir dışa aktarma ve test komut dosyası işlemi versiyonumu düşüneceğim ve sunacağım.

 

FF denkleminin parametrelerinin değerlerini bulmaya yönelik "evrimsel" yaklaşımın, değerleri arama verimliliğini artırmak için değil, evrim sürecini programlı olarak simüle etmek için yaratılmış olması mümkündür.

Eh, evrimin bilim adamları tarafından temsil edildiği biçimde ...

Acı verici bir şekilde, yaklaşım, tüm evrimsel kanunlarla uyumlu olması bakımından tutarlıdır...

 

teklif:

1. Uygunluk işlevi, double türündeki bir dizi parametreyi kabul eder ve sayı ne kadar büyükse, parametreler o kadar iyi seçilirse sayıyı döndürür. Uygunluk fonksiyonu prototipi aşağıdaki gibidir:

 double FF( double &array[]);

2. Uygunluk işlevi, FitnessParams yapısında belirtilen belirli parametrelere sahiptir. Yapının açıklaması aşağıda verilmiştir:

 //+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int       limit_runs;           // Максимально допустимое количество вызовов FF
   int       count_params;         // Количество параметров, которое необходимо оптимизировать
   int       current_runs;         // Текущее количество вызовов функции
   double    current_max_value;   // Текущее найденное максимальное значение
   double    step_value;           // Минимальный шаг изменения параметра. 
   double    max_value;           // Максимальное значение, которое может принимать параметр
   double    min_value;           // Минимальное значение, которое может принимать параметр
   FitnessParams( void );
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams( void ) : limit_runs( 1000 ),
                                   count_params( 2 ),
                                   step_value( 0.1 ),
                                   max_value( 10.0 ),
                                   min_value(- 10.0 ),
                                   current_runs( 0 )
                                   
{
   current_max_value = min_value;
}

3. Uygunluk işlevi ve parametreleri dış etkilerden korunur ve bağımsız bir kitaplıkta bulunur . .\\Scripts\\FF\\FF.ex5 biri tarafından değiştirilebilir.

4. Özel optimizasyon algoritması ve kontrol komut dosyası, uygunluk fonksiyonu parametrelerini öğrenebilir. Export.mqh dosyası neden bu işlevin gerekli prototiplerini ve parametrelerini içeriyor? FF parametrelerini elde etmek için, yine ..\\Scripts\\FF\\FF.ex5 konumunda bulunan parametre dışa aktarma işlevini kullanın:

 void    GetFitnessParams(FitnessParams& params);

5. Özel optimizasyon algoritması ayrı, kapalı bir kullanıcı kitaplığında bulunur ..\\Scripts\\FF\\ UserFindExtremum.ex5 ve kullanıcı tarafında ayrı olarak derlenir. FindExtremum işlevi, kullanıcının kitaplığında dışa aktarılmalıdır . Bu işlev, kontrol komut dosyası tarafından çağrılır. Tam fonksiyon prototipi aşağıdadır:

 //+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum( void );
#import

6. Kontrol komut dosyası, parametreleriyle birlikte uygunluk fonksiyonu ..\\Scripts\\FF\\FF.ex5 kitaplığını adres alanına yükler ve ekstremum araması için üyenin kitaplığı   ..\\Scripts\\FF\\UserFindExtremum.ex5. Daha sonra FindExtremum üye işlevini çağırır.

7. Katılımcı işlevi işlendikten sonra, kontrol komut dosyası, uygunluk işlevinin, katılımcı işlevi tarafından bulunan maksimum değeri ve bu maksimumu bulmak için gereken çağrı sayısını içeren parametrelerini ister. Bu verilere dayanarak, katılımcının sonucuna ilişkin bir tablo şeklinde bir rapor oluşturulur:

 2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      ———————————————————————————————————————————
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Максимальное найденное значение: 3.1
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Досрочное выполнение алгритма: НЕТ
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Вызовов фитнес-функции потребовалось: 1001
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Поиск экстремума выполнен за 0 мсек.

Bir sonraki gönderide gerekli dosyalar ve kullanım örneği eklenecektir.

 

.mqh dosyasını dışa aktar - tüm katılımcılar için kullanılabilir işlevlerin ortak listesi ve parametre yapısı

 //+------------------------------------------------------------------+
//|                                                       Export.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "https://www.mql5.com/ru/users/c-4"
//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int       limit_runs;           // Максимально допустимое количество вызовов FF
   int       count_params;         // Количество параметров, которое необходимо оптимизировать
   int       current_runs;         // Текущее количество вызовов функции
   double    current_max_value;   // Текущее найденное максимальное значение
   double    step_value;           // Шаг значений или дискретность. 
   double    max_value;           // Максимальное значение, которое может принимать ff-функция
   double    min_value;           // Минимальное значение, которое может принимать ff-функция
   FitnessParams( void );
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams( void ) : limit_runs( 1000 ),
                                   count_params( 2 ),
                                   step_value( 0.1 ),
                                   max_value( 10.0 ),
                                   min_value(- 10.0 ),
                                   current_runs( 0 )
                                   
{
   current_max_value = min_value;
}
//+------------------------------------------------------------------+
//| Экспорт библиотеки фитнесс-функций                               |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\FF.ex5"
   double FF( double &array[]);                       // Фитнес-функция, возвращающая значение тем больше, чем лучше подобраны значения в массиве array
   void    GetFitnessParams(FitnessParams& params);   // Возвращает параметры фитнесс-функции в виде структуры FitnessParams
#import
//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum( void );
#import

FF.mq5 dosyası, kitaplık biçimindeki bir uygunluk işlevi örneğidir.

 //+------------------------------------------------------------------+
//|                                                           FF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "https://www.mql5.com/ru/users/c-4"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Параметры фитнесс-функции, с которыми необходимо ознакомится     |
//| алгоритму поиска до начала работы. Получить эти параметры можно  |
//| с помощью функции GetFitnessParams                               |
//+------------------------------------------------------------------+
static FitnessParams FParams;
//+------------------------------------------------------------------+
//| Фитнес-функция, возвращающая значение тем больше, чем лучше      |
//| подобраны значения в массиве array                               |
//+------------------------------------------------------------------+
double FF( double &array[]) export
{ 
   if (FParams.current_runs > FParams.limit_runs)
       return FParams.min_value;
   FParams.current_runs++;
   if ( ArraySize (array) < FParams.count_params)
       return FParams.min_value; 
   double ff_value = (-( pow ( 2.4 + array [ 0 ], 2.0 ) + pow (array [ 1 ] - 2.3 , 2.0 ))+ 3.1415926 );
   if (ff_value > FParams.current_max_value)
      FParams.current_max_value = ff_value;
   return ff_value;
}
//+------------------------------------------------------------------+
//| Возвращает параметры фитнесс-функции                             |
//+------------------------------------------------------------------+
void GetFitnessParams(FitnessParams& params) export
{
   params = FParams;
}
//+------------------------------------------------------------------+

Dosya TestFF.mq5 - bir komut dosyası biçiminde test algoritması

 //+------------------------------------------------------------------+
//|                                                       TestFF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "http://www.mql5.com"
#property version    "1.00"
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   uint begin_tiks = GetTickCount ();
   // Вызываем пользовательскую функцию поиска экстремума фитнес-функции
   FindExtremum();             
   uint end_tiks = GetTickCount ();
   // Получаем результаты поиска в качестве комплексного параметра
   FitnessParams params;      
   GetFitnessParams(params);
   // Подготавливаем отчет
   string yesno_count = params.current_runs >= params.limit_runs ? "НЕТ" : "ДА" ;
   printf ( "Поиск экстремума выполнен за " + ( string )(end_tiks - begin_tiks) + " мсек." );
   printf ( "Вызовов фитнес-функции потребовалось: " + ( string )params.current_runs);
   printf ( "Досрочное выполнение алгритма: " + yesno_count);
   printf ( "Максимальное найденное значение: " + DoubleToString (params.current_max_value, 1 ));
   printf ( "——————————————————————" );
}
//+------------------------------------------------------------------+

UserFindExtremum.mq5 dosyası, kitaplık biçiminde bir ekstremum bulmak için kullanıcı tanımlı bir işlevdir. Örnek olarak rastgele arama kullanılmıştır

 //+------------------------------------------------------------------+
//|                                             UserFindExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link       "http://www.mql5.com"
#property version   "1.00"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Алгоритм поиска экстремума, который будет вызван проверяющим    |
//| скриптом                                                         |
//+------------------------------------------------------------------+
void FindExtremum( void ) export
{
   FitnessParams params ;
   while ( params .current_runs < params .limit_runs)
   {
      GetFitnessParams( params );
       if ( params .current_max_value >= params .max_value)
         break ;
       double values[];
      ArrayResize(values, params .count_params);
       for ( int i = 0 ; i < params .count_params; i++) 
      {
         double random = RandomDouble( params .min_value, params .max_value);
        values[i] = SeInDiSp (random, params .min_value, params .max_value, params .step_value);
      }
      FF(values);
   }
}
//+------------------------------------------------------------------+
//| Выбор в дескретном пространстве                                  |
//+------------------------------------------------------------------+
double SeInDiSp ( double in , double inMin, double inMax, double step) 
{ 
   if ( in <= inMin) 
     return (inMin); 
   if ( in >= inMax) 
     return (inMax); 
   if (step == 0.0 ) 
     return ( in ); 
   else 
     return (inMin + step * ( double )MathRound (( in - inMin) / step));
}

//+------------------------------------------------------------------+
//| ГСЧ в заданном интервале                                         |
//+------------------------------------------------------------------+
double RandomDouble( double min, double max) 
{ 
   if (min == max) 
     return (min); 
   double Min, Max; 
   if (min > max) 
   {
     Min = max; 
     Max = min;
   }
   else 
   {
     Min = min; 
     Max = max;
   }
   return ( double (Min + ((Max - Min) * ( double )MathRand () / 32767.0 )));
}
Dosyalar:
Export.mqh  3 kb
FF.mq5  2 kb
TestFF.mq5  2 kb
 
Vasiliy Sokolov :

Dosya Export.mqh - tüm katılımcılar için mevcut işlevlerin ortak bir listesi ve parametrelerin yapısı

FF.mq5 dosyası, kitaplık biçimindeki bir uygunluk işlevi örneğidir.

Dosya TestFF.mq5 - bir komut dosyası biçiminde test algoritması

UserFindExtremum.mq5 dosyası, kitaplık biçiminde kullanıcı tanımlı bir ekstremum arama işlevidir. Rastgele arama örnek olarak kullanılmıştır

Tüm örneklerde, her şey çok açık ve anlaşılır bir şekilde açıklanmıştır. Yapılan iş için çok teşekkürler. )
 
Vasiliy Sokolov :

Bu kadar basit bir işlev için arayüzü fazla karmaşık hale getirdiniz. Gereksiz ihracat çok ama tam tersine gerekli şeyler yeterli değil. Kodunuzu ilk defa anlamadım, programlamada bu kadar iyi olmayan insanların nasıl hissettiğini hayal edebiliyorum.

Şimdi bunun hakkında düşüneceğim ve kendi basitleştirilmiş dışa aktarma ve test komut dosyası işlemi versiyonumu sunacağım.

Neden gerekli değil?

Hangi olmazsa olmazlar eksik?

Ne de olsa, sadece katılımcılar için hayatı mümkün olduğunca zorlaştırmak için değil, her şeyi yaptım ve ilk gün her şey düşünülmedi, ikincisini bile yapmadım.

 
Andrey Dik :

Neden gerekli değil?

Hangi olmazsa olmazlar eksik?

Ne de olsa, sadece katılımcılar için hayatı mümkün olduğunca zorlaştırmak için değil, her şeyi yaptım ve ilk gün her şey düşünülmedi, ikincisini bile yapmadım.

Andrei, başkalarını bilmiyorum ama şahsen Vasily'nin örneğini daha çok sevdim. Suç yok. Bu sadece benim subjektif algım...

Dürüst olmak gerekirse, bir bağlantı arayüzü (sizin veya Vasily) seçme sorusunu oylamaya sunmayı öneriyorum.

Nasıl düşünüyorsun?

 
Реter Konow :

Andrei, başkalarını bilmiyorum ama şahsen Vasily'nin örneğini daha çok sevdim. Suç yok. Bu sadece benim subjektif algım...

Dürüst olmak gerekirse, bir bağlantı arayüzü (sizin veya Vasily) seçme sorusunu oylamaya sunmayı öneriyorum.

Nasıl düşünüyorsun?

Özellikle neyi daha çok seviyorsunuz?
Ve Vasily'nin tekrarlanan bir bağlantı türü örneği, ama ilki nerede?
 
Andrey Dik :

Neden gerekli değil?

Hangi temeller eksik?

Ne de olsa, sadece katılımcılar için hayatı mümkün olduğunca zorlaştırmak için değil, her şeyi yaptım ve ilk gün her şey düşünülmedi, ikincisini bile yapmadım.

Örneğinizde, arama görevi kısmen kontrol komut dosyasına devredilmiştir. Bu doğru değil. Doğrulama komut dosyası aramayı aramalı ve sonucunu kontrol etmeli ve başka bir şey yapmamalıdır.

Tüm FF seçenekleri mevcut değildir. Örneğin, adım (0.1 değeri), olası maksimum ve minimum parametre nasıl alınır? Her kullanıcının bu forumu okuması ve adımın 0.1, minimum -10.0 ve maksimum +10.0 olduğunu anlaması ve ardından bu sabitleri kodlarına girmesi ve ardından FF işlevinin de aynı şekilde düşüneceğini ummaları kesinlikle harika. . Ama bu iyi bir şekilde yapılmaz.

ServiceFunc1 gibi birçok dışa aktarma işlevi yalnızca belirli arama algoritmalarında kullanılır. Örneğin, rastgele bir aramada bunları kullanmanıza gerek yoktur. O zaman neden kullanıcı kitaplığının bunları dışa aktarması gerekiyor? Tüm bu karmaşık dışa aktarma işlevleri kombinasyonunun gerekli olmadığını anlamak için test görevini doğrudan arama görevinden ayırmak yeterlidir.

Gereksiz eklentiler yapan daha birçok şey var.

 
Andrey Dik :
Özellikle neyi daha çok seviyorsunuz?
Ve Vasily'nin tekrarlanan bir bağlantı türü örneği, ama ilki nerede?
İkinci, üçüncü, 110 bağlantı tipine gerek yoktur. Yalnızca bir, ancak evrensel bir bağlantı türü gereklidir. Gereksiz sözdizimsel yapılar kullanılmadan. ServiceFunc1 işlevinin kutsal anlamını kimse çözmek istemez. Bunun yerine, uygunluk fonksiyonunu ve parametrelerini doldurma kurallarını vermeniz gerekir. Ve daha fazlası değil.