Algorithmus-Optimierung Meisterschaft. - Seite 53

 
Andrey Dik:

Testskript für die erste Version des Algorithmus:

Für eine so einfache Funktion haben Sie die Schnittstelle zu kompliziert gestaltet. Viele unnötige Exporte, während das Notwendige fehlt. Ich kann Ihren Code nicht auf Anhieb verstehen, ich kann mir nur vorstellen, wie sich Menschen fühlen, die nicht so gut programmieren können.

Jetzt werde ich nachdenken und meine eigene Version eines vereinfachten Export- und Testskriptbetriebs vorschlagen.

 

Vielleicht dient der "evolutionäre" Ansatz bei der Suche nach Werten für die Parameter der FF-Gleichung nicht so sehr dem Zweck, die Effizienz bei der Suche nach Werten zu verbessern, sondern eher der Software, die den Prozess der Evolution modelliert.

Nun, da die Evolution von Wissenschaftlern vertreten wird...

Der Ansatz ist sehr konsequent in seiner Übereinstimmung mit allen evolutionären Kanons...

 

Proposition:

1. Eine Fitnessfunktion nimmt eine Reihe von Parametern des Typs double auf und gibt eine Zahl zurück, die umso größer ist, je besser die Parameter gewählt wurden. Der Prototyp der Fitnessfunktion lautet wie folgt:

double FF(double &array[]);

2. Die Fitnessfunktion hat einige Parameter, die in der Struktur FitnessParams angegeben werden. Eine Beschreibung der Struktur wird im Folgenden gegeben:

//+------------------------------------------------------------------+
//| Параметры фитнес-функции (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. Die Fitnessfunktion und ihre Parameter sind vor äußeren Einflüssen geschützt und werden in einer unabhängigen Bibliothek gespeichert. Die Werte der Parameter der Fitnessfunktion und des Algorithmus selbst werden zum Zeitpunkt der Kompilierung von einem unabhängigen Gutachter festgelegt und können von niemandem mehr geändert werden.

4. Ein benutzerdefinierter Optimierungsalgorithmus und ein Prüfskript können die Parameter einer Fitnessfunktion ermitteln. Zu diesem Zweck enthält die Datei Export.mqh die erforderlichen Prototypen dieser Funktion und ihrer Parameter. Um FF-Parameter zu erhalten, wird die Exportfunktion verwendet, die sich ebenfalls in ...\\\Scripts\\\FF\\FF.ex5 befindet:

void   GetFitnessParams(FitnessParams& params);

5. Der Benutzer-Optimierungsalgorithmus befindet sich in einer separaten, geschlossenen Benutzerbibliothek..\Scripts\\\FF\\UserFindExtremum.ex5 und wird separat auf der Benutzerseite kompiliert. Die Funktion FindExtremum muss in die Benutzerbibliothek exportiert werden. Diese Funktion wird von dem Prüfskript aufgerufen. Der vollständige Prototyp der Funktion ist unten angegeben:

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

6. Das Prüfskript lädt in seinen Adressraum die Bibliothek der Fitnessfunktion ..\\Scripts\\FF\FF.ex5 mit ihren Parametern und die Bibliothek des Elements FindExtremum..\Scripts\\\FF\UserFindExtremum.ex5. Danach ruft es die Elementfunktion FindExtremum auf.

7. Nachdem die Teilnehmerfunktion ausgeführt wurde, fragt das Prüfskript die Parameter der Fitnessfunktion ab, die den von der Teilnehmerfunktion gefundenen Maximalwert und die Anzahl der Aufrufe enthalten, die erforderlich waren, um diesen Maximalwert zu finden. Auf der Grundlage dieser Daten wird ein Bericht über das Ergebnis des Teilnehmers in Form einer Tabelle erstellt:

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

Im folgenden Beitrag finden Sie die erforderlichen Dateien und ein Anwendungsbeispiel

 

Export.mqh-Datei - eine Liste der verfügbaren Funktionen und der Parameterstruktur, die allen Teilnehmern gemeinsam ist

//+------------------------------------------------------------------+
//|                                                       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 Datei - Beispiel für eine Fitnessfunktion als Bibliothek.

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

Datei TestFF.mq5 - Prüfalgorithmus als Skript

//+------------------------------------------------------------------+
//|                                                       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 Datei - benutzerdefinierte Funktion für die Suche nach einem Extremum in Form einer Bibliothek. Als Beispiel wird eine Zufallssuche verwendet

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

Export.mqh-Datei - eine Liste der verfügbaren Funktionen und der Parameterstruktur, die allen Teilnehmern gemeinsam ist

FF.mq5 Datei - Beispiel für eine Fitnessfunktion als Bibliothek.

Datei TestFF.mq5 - Prüfalgorithmus als Skript

UserFindExtremum.mq5 Datei - benutzerdefinierte Funktion für die Suche nach einem Extremum in Form einer Bibliothek. Als Beispiel wird eine Zufallssuche verwendet

Alle Beispiele sind sehr klar und verständlich. Herzlichen Dank für Ihre Arbeit. )
 
Vasiliy Sokolov:

Für eine so einfache Funktion haben Sie die Schnittstelle zu kompliziert gestaltet. Viele unnötige Exporte, während das Notwendige im Gegenteil fehlt. Ich habe Ihren Code nicht auf Anhieb verstanden, und ich kann mir vorstellen, wie sich Leute fühlen, die nicht so gut programmieren können.

Ich werde darüber nachdenken und meine eigene Version eines vereinfachten Export- und Testskripts vorschlagen.

Warum ist das nicht notwendig?

Welche Dinge fehlen?

Immerhin nicht nur, um den Teilnehmern das Leben so schwer wie möglich zu machen, also habe ich alles gemacht, und nicht am ersten Tag habe ich über alles nachgedacht und auch nicht am zweiten.

 
Andrey Dik:

Warum nicht die richtigen?

Welche fehlen noch?

Immerhin, nicht nur, um das Leben so schwierig wie möglich für die Teilnehmer zu machen, so habe ich alles, und nicht den ersten Tag dachte ich über alles, und nicht einmal die zweite.

Andrew, ich weiß nicht, wie es anderen geht, aber mir persönlich hat das Beispiel von Vasily besser gefallen. Nichts für ungut. Dies ist nur meine subjektive Wahrnehmung.

Der Fairness halber schlage ich vor, die Frage nach der Wahl der Verbindungsschnittstelle (Ihre oder die von Vasiliy) zur Abstimmung zu stellen.

Was meinen Sie dazu?

 
Реter Konow:

Andrew, ich weiß nicht, wie es anderen geht, aber mir persönlich hat das Beispiel von Vasily besser gefallen. Nichts für ungut. Das ist nur meine subjektive Wahrnehmung...

Um fair zu sein, schlage ich vor, über die Wahl einer Verbindungsschnittstelle (Ihre oder die von Vasiliy) abzustimmen.

Was meinen Sie dazu?

Was genau gefällt Ihnen besser?
Und Vassily's Beispiel für die zweite Art der Verbindung, und wo auf der ersten?
 
Andrey Dik:

Warum nicht die richtigen?

Welche fehlen noch?

Es geht nicht nur darum, den Teilnehmern das Leben so schwer wie möglich zu machen, so habe ich es gemacht, und es war nicht der erste Tag, an dem ich darüber nachgedacht habe, oder sogar der zweite.

In Ihrem Beispiel wird die Aufgabe der Suche teilweise an das Checker-Skript delegiert. Dies ist falsch. Das Checker-Skript sollte die Suche aufrufen und deren Ergebnis überprüfen und nichts anderes.

Es sind nicht alle FF-Parameter verfügbar. Wie erhält man zum Beispiel den Parameter Schritt (Wert 0,1), den möglichen Höchst- und Mindestwert? Es ist natürlich toll, dass jeder Benutzer dieses Forum liest und versteht, dass der Schritt 0,1, das Minimum -10,0 und das Maximum +10,0 ist, dann diese Konstanten in seinen Code einträgt und hofft, dass die FF-Funktion genauso denkt. Aber das ist nicht der richtige Weg, um das zu tun.

Viele Exportfunktionen wie ServiceFunc1 werden nur in bestimmten Suchalgorithmen verwendet. Sie sollten zum Beispiel nicht für die Zufallssuche verwendet werden. Warum also sollte eine Benutzerbibliothek sie exportieren? Es genügt, die Prüfaufgabe von der Suchaufgabe zu trennen, um zu erkennen, dass all diese komplizierten Kombinationen von Exportfunktionen unnötig sind.

Es gibt noch viele andere Dinge, die Add-ons überflüssig machen.

 
Andrey Dik:
Was genau gefällt Ihnen besser?
Und Basils Beispiel für die zweite Art von Verbindung, und wo bei der ersten?
Die zweite, dritte und 110. Anschlussart brauchen Sie nicht. Sie brauchen nur einen, aber einen universellen Anschlusstyp. Ohne unnötige syntaktische Konstruktionen zu verwenden. Niemand möchte über die abgekürzte Bedeutung der Funktion ServiceFunc1 rätseln. Stattdessen sollte man eine Fitnessfunktion und Regeln für das Ausfüllen ihrer Parameter angeben. Und sonst nichts.