Campionato di ottimizzazione degli algoritmi. - pagina 53

 
Andrey Dik:

Script di test sulla prima versione dell'algoritmo:

Per una funzione così semplice, avete complicato troppo l'interfaccia. Un sacco di esportazioni inutili, mentre mancano le cose necessarie. Non riesco a capire subito il tuo codice, posso immaginare come si sentono le persone che non sono così brave a programmare.

Ora penserò e proporrò la mia versione di esportazione semplificata e il funzionamento dello script di prova.

 

Forse l'approccio "evolutivo" di trovare i valori dei parametri dell'equazione FF non ha tanto lo scopo di migliorare l'efficienza della ricerca dei valori, ma piuttosto di modellare via software il processo di evoluzione.

Bene, come l'evoluzione è rappresentata dagli scienziati...

L'approccio è molto coerente nella sua conformità a tutti i canoni evolutivi...

 

Proposta:

1. una funzione di fitness prende un array di parametri di tipo doppio e restituisce un numero tanto più grande quanto migliore è la scelta dei parametri. Il prototipo della funzione di fitness è il seguente:

double FF(double &array[]);

2. La funzione di fitness ha alcuni parametri, che sono specificati nella struttura FitnessParams. Una descrizione della struttura è data di seguito:

//+------------------------------------------------------------------+
//| Параметры фитнес-функции (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. La funzione di fitness e i suoi parametri sono protetti da influenze esterne e sono memorizzati in una libreria indipendente..\Scripts\\\FF\FF.ex5. I valori dei parametri della funzione di fitness e il suo algoritmo stesso sono impostati al momento della compilazione da un arbitro indipendente e non possono più essere modificati da nessuno.

4. Un algoritmo di ottimizzazione personalizzato e uno script di controllo possono trovare i parametri di una funzione di fitness. A questo scopo il file Export.mqh contiene i prototipi necessari di questa funzione e i suoi parametri. Per ottenere i parametri FF, si usa la funzione di esportazione, che si trova anche in ...\Scripts\\\FF\FF.ex5:

void   GetFitnessParams(FitnessParams& params);

5. L'algoritmo di ottimizzazione dell'utente si trova in una libreria utente separata e chiusa..\Scripts\\FF\UserFindExtremum.ex5 ed è compilato separatamente, sul lato utente. La funzione FindExtremum deve essere esportata nella libreria utente. Questa funzione sarà chiamata dallo script di controllo. Il prototipo completo della funzione è riportato di seguito:

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

6. Lo script di controllo carica nel suo spazio di indirizzi la libreria della funzione fitness ..\Scripts\\\FF\FFFF.ex5 con i suoi parametri, e la libreria del membro Find Extremum..\Scripts\FF\FF\UserFindExtremum.ex5. Dopo di che chiama la funzione membro FindExtremum.

7. dopo che la funzione partecipante è stata eseguita, lo script di controllo interroga i parametri della funzione fitness, che contengono il valore massimo trovato dalla funzione partecipante e il numero di chiamate che ha impiegato per trovare quel massimo. Sulla base di questi dati, viene generato un rapporto del risultato del partecipante sotto forma di tabella:

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 мсек.

Ilseguente post aggiungerà i file necessari e un esempio di utilizzo

 

File Export.mqh - un elenco di funzioni disponibili e la struttura dei parametri comune a tutti i partecipanti

//+------------------------------------------------------------------+
//|                                                       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

File FF.mq5 - esempio di una funzione di fitness come libreria.

//+------------------------------------------------------------------+
//|                                                           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;
}
//+------------------------------------------------------------------+

File TestFF.mq5 - algoritmo di controllo come script

//+------------------------------------------------------------------+
//|                                                       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("——————————————————————");
}
//+------------------------------------------------------------------+

File UserFindExtremum.mq5 - funzione personalizzata per la ricerca di un estremo sotto forma di libreria. Una ricerca casuale è usata come esempio

//+------------------------------------------------------------------+
//|                                             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)));
}
File:
Export.mqh  3 kb
FF.mq5  2 kb
TestFF.mq5  2 kb
 
Vasiliy Sokolov:

File Export.mqh - un elenco di funzioni disponibili e la struttura dei parametri comune a tutti i partecipanti

File FF.mq5 - esempio di una funzione di fitness come libreria.

File TestFF.mq5 - algoritmo di controllo come script

File UserFindExtremum.mq5 - funzione personalizzata per la ricerca di un estremo sotto forma di libreria. Una ricerca casuale è usata come esempio

Tutti gli esempi sono molto chiari e comprensibili. Grazie mille per il vostro lavoro. )
 
Vasiliy Sokolov:

Per una funzione così semplice, avete complicato troppo l'interfaccia. Un sacco di esportazioni inutili, mentre le cose necessarie al contrario mancano. Non ho capito il tuo codice dalla prima volta, posso immaginare cosa provano le persone che non sono così brave a programmare.

Ci penserò e proporrò la mia versione di esportazione semplificata e lo script di test.

Perché non è necessario?

Che tipo di cose mancano?

Dopo tutto, non solo per rendere la vita il più difficile possibile per i partecipanti così ho fatto tutto, e non il primo giorno ho pensato a tutto, e nemmeno il secondo.

 
Andrey Dik:

Perché non quelli giusti?

Quali sono quelli che mancano?

Dopo tutto, non solo per rendere la vita il più difficile possibile per i partecipanti così ho fatto tutto, e non il primo giorno ho pensato a tutto, e nemmeno il secondo.

Andrew, non so gli altri, ma personalmente, mi è piaciuto di più l'esempio di Vasily. Senza offesa. Questa è solo la mia percezione soggettiva.

Per essere giusti, propongo di mettere ai voti la questione della scelta dell'interfaccia di connessione (la tua o quella di Vasiliy).

Cosa ne pensate?

 
Реter Konow:

Andrew, non so gli altri, ma personalmente ho preferito l'esempio di Vasily. Senza offesa. È solo la mia percezione soggettiva...

Per essere giusti, propongo di mettere ai voti la questione della scelta dell'interfaccia di connessione (la tua o quella di Vasiliy).

Cosa ne pensate?

Cosa ti piace di più esattamente?
E l'esempio di Vassily al secondo tipo di connessione, e dove al primo?
 
Andrey Dik:

Perché non quelli giusti?

Quali sono quelli che mancano?

Non è solo per rendere la vita il più difficile possibile ai partecipanti che ho fatto così, e non è stato il primo giorno che ci ho pensato, e nemmeno il secondo.

Nel tuo esempio, il compito della ricerca è parzialmente delegato allo script di controllo. Questo non è corretto. Lo script di controllo dovrebbe chiamare la ricerca e controllare il suo risultato e nient'altro.

Non tutti i parametri FF sono disponibili. Per esempio, come ottenere il passo del parametro (valore 0,1), possibile massimo e minimo? È fantastico, naturalmente, che ogni utente legga questo forum e capisca che il passo risulta essere 0,1, il minimo -10,0 e il massimo +10,0, poi inserisca queste costanti nel suo codice e speri che la funzione FF pensi allo stesso modo. Ma questo non è il modo di farlo in modo positivo.

Molte funzioni di esportazione come ServiceFunc1 sono usate solo in algoritmi di ricerca specifici. Per esempio, non dovrebbero essere usati nella ricerca casuale. Allora perché una libreria di utenti dovrebbe esportarli? Basta separare il compito di test da quello di ricerca per rendersi conto che tutta questa complicata combinazione di funzioni di esportazione non è necessaria.

Ci sono molte altre cose che rendono inutili gli add-on.

 
Andrey Dik:
Cosa ti piace di più esattamente?
E l'esempio di Basil del secondo tipo di connessione, e dove sul primo?
Non hai bisogno del secondo, terzo, 110 tipo di connessione. Avete bisogno di uno solo, ma di un tipo di connessione universale. Senza usare costruzioni sintattiche inutili. Nessuno vuole perdere tempo sul significato abbreviato della funzione ServiceFunc1. Invece si dovrebbe dare una funzione di fitness e regole di riempimento dei suoi parametri. E nient'altro.