Nicht für MT-Entwickler! Wodurch soll INIT_PARAMETERS_INCORRECT ersetzt werden?

 

Ich bin auf folgendes Problem gestoßen: Nach der Logik des Programms ist es notwendig, ungültige Funktionsaufrufe auszusieben. Ich verwende INIT_PARAMETERS_INCORRECT für diese Zwecke. Aber die genetische Optimierung hört praktisch sofort auf. Die Entwickler werden durch Fragen zu dieser Situation verärgert. Sie raten zu einer genetischen Analyse und so weiter und so fort.

Aber wozu brauche ich sie? Ich als Nutzer möchte Ergebnisse erzielen, und es ist mir egal, wie es funktioniert.

Hier also ein Beispiel für die drei Funktionen 1, 2 und 3. 0 ist nicht zu verwenden.

In einer Kette dürfen sich die Funktionen nicht wiederholen und es darf keine 0 zwischen den Funktionen stehen (sonst kann es zu Wiederholungen kommen).

Ein Beispiel für zulässige Ketten:

  • 100
  • 120
  • 130
  • 123
  • 132
  • 2..
  • 3..

Beispiel für inakzeptable Ketten:

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
Wie Sie sehen können, gibt es eine Größenordnung mehr ungültige Ketten als gültige Ketten. Wie wird eine Stichprobe durchgeführt? Wie wird INIT_PARAMETERS_INCORRECT ersetzt? Wo soll ich graben?

 
Abbrechen von Berechnungen in Ein-Funktionen, wenn die Parameter linkshändig sind. Die Ausführung ist zwar langsamer als beiINIT_PARAMETERS_INCORRECT, aber nicht wesentlich.
 
Wie war das? Darf ich Ihnen ein kleines Beispiel geben?
 

Könnten Sie die möglichen Gruppen von Eingabeparametern und die unerwünschten Gruppen genauer beschreiben und erläutern, warum es zu viele unerwünschte Gruppen gibt?

Ich stimme mit den Entwicklern völlig überein, dass es nicht zu viele unerwünschte Sets geben sollte. Optimal sind nicht mehr als 10 %.

 
Сергей Таболин:
Wie war das? Darf ich Ihnen ein kleines Beispiel geben?

fxsaber hat Recht.

Wenn ein falscher Parametersatz eingegeben wird, geben Sie alle OnTick()-Funktionen auf einmal zurück. Und onTester - Sie geben das Mindestergebnis zurück.

 
Сергей Таболин:
Wie war das? Darf ich Ihnen ein kleines Beispiel geben?
input int i = 0; 

bool Incorrect;
 
int OnInit()
{
  Incorrect = !i; // нулевое значение считается некорректным (пример)
  
//  return(Incorrect ? INIT_PARAMETERS_INCORRECT : INIT_SUCCEEDED); // Было
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (Incorrect)
    return;
    
  // ...
}
 
Es handelt sich nicht um eine Reihe von Eingabeparametern! Sie sind eine Reihe von Funktionen, die sich nicht wiederholen dürfen! Bei der langsamen Optimierung hilft INIT_PARAMETERS_INCORRECT wirklich, gültige Ketten für den Aufruf dieser Funktionen zu erstellen, aber ich habe 6 davon. Ich habe 117649 Kettenvarianten. Aber diese Ketten sind ohne einige Eingabeparameter nutzlos. Mit ihnen haben wir bereits über 38.000.000 ! Mit langsamer roher Gewalt lässt sich das Problem nicht umgehen.
 
Сергей Таболин:
Es handelt sich nicht um eine Reihe von Eingabeparametern! Es ist eine Reihe von Funktionen, die sich nicht wiederholen dürfen! Bei langsamer Optimierung hilft INIT_PARAMETERS_INCORRECT wirklich, gültige Ketten für den Aufruf dieser Funktionen zu erstellen, aber ich habe 6 davon. Ich habe 117649 Kettenvarianten. Aber diese Ketten sind ohne einige Eingabeparameter nutzlos. Mit ihnen haben wir bereits über 38.000.000 ! Mit langsamer roher Gewalt lässt sich das Problem nicht umgehen.

Die Genetik wird sterben, weil die Optimierungsfläche des Optimierungskriteriums mehr oder weniger kontinuierlich (glatt) sein sollte. In Ihrem Fall erhalten Sie jedoch eine große Anzahl von Ausschlägen (Fehlschlägen).


Sie können das folgende Experiment einstellen. Nehmen Sie den Standard-Expert Advisor und fügen Sie dort einige zusätzliche Parameter zur Optimierung hinzu - gefälschte Parameter. Damit sind 90 % ihrer Sätze FALSCH. GA wird sterben. Es geht aber auch ganz gut ohne falsche Parameter.

 
fxsaber:

Ich hab's. Es ist nur eine Frage der Auswahl der richtigen Funktionen und ihrer Reihenfolge im Optimierer. Und schreiben Sie alle unpassenden Ketten manuell.... Und wie wird der Optimierer sie dann finden?

 
fxsaber:

Die Genetik wird sterben, weil die Optimierungsfläche des Optimierungskriteriums mehr oder weniger kontinuierlich (glatt) sein sollte. In Ihrem Fall erhalten Sie jedoch eine große Anzahl von Ausschlägen (Dips).

Ich verstehe das. Ich verstehe nur nicht, wie man das umgehen kann?

 
Сергей Таболин:

Ich verstehe das. Was ich nicht verstehe, ist, wie man das umgehen kann?

Ein Rezept besteht darin, dass die Entwickler das Ergebnis von INCORRECT-Durchläufen als den nächstgelegenen zuvor berechneten CORRECT-Durchlauf behandeln. Dadurch werden die Löcher in der Optimierungsfläche ausgeglichen.