Algorithmus zum Kombinieren von Bereichen eines Segments - Hilfe zum Erstellen - Seite 3

 
Dmitry Fedoseev:

1. wo liegt der Koeffizient?

2. und S.1?

3. nein, es ist einfacher als das. Okay, ich werde versuchen, es morgen zu beschleunigen.

1. Koeffizient (Composite-Index) in jedem Segment wird auf seine Eigenschaften - experimentell dann bestimme ich die Formel, aber konventionell können wir davon ausgehen, dass er ist.

2. so ist es pro Segment getrennt, nur ein Indikator (der drei, auf denen es berechnet wird) kann man auf alle verteilen, und die anderen beiden können nicht.

3. Danke, ich werde warten.

 

Hier. Aber wenn es 1.000 Abschnitte gibt, nützt das nichts. Es gibt zu viele Varianten, Sie haben vielleicht nicht einmal genug Speicherplatz.

Sie können auch einen anderen Weg gehen - an das Ende jedes Segments ein Array mit Indizes binden, die auf das nächste Segment zeigen. Auf diese Weise können Sie alle Optionen durchgehen, ohne dass der Speicher voll wird. Aber es werden immer noch zu viele Optionen sein... Die Suche wird viel Zeit in Anspruch nehmen. Sie können auch darüber nachdenken, wie Sie den Zugang zu den Varianten über ihre Nummern ermöglichen können, falls Sie dies benötigen (zum Spaß).

Aber ist es das wirklich wert, wenn es so viele Varianten gibt? Wie wäre es, die Aufgabe zu spezifizieren, um sie realistischer zu machen?

Dateien:
3.mq5  14 kb
 
Dmitry Fedoseev:

Hier. Aber wenn es 1.000 Abschnitte gibt, nützt das nichts. Es gibt zu viele Varianten, Sie haben vielleicht nicht einmal genug Speicherplatz.

Sie können auch einen anderen Weg gehen - an das Ende jedes Segments ein Array mit Indizes binden, die auf das nächste Segment zeigen. Auf diese Weise können Sie alle Optionen durchgehen, ohne dass der Speicher voll wird. Aber es werden immer noch zu viele Optionen sein... Die Suche wird viel Zeit in Anspruch nehmen. Sie können auch darüber nachdenken, wie Sie den Zugang zu den Varianten über ihre Nummern ermöglichen können, falls Sie dies benötigen (zum Spaß).

Aber ist es das wirklich wert, wenn es so viele Varianten gibt? Wie wäre es, die Aufgabe zu spezifizieren, um sie realistischer zu machen?

Es könnte viele Ziele da draußen geben. Die kleinsten Misses, von den längsten Segmenten, von den kürzesten, von den identischsten) selbst in Zielgraphen sind die kürzeste Zeit und der minimale Weg logistisch unterschiedlich gelöst)
 
Valeriy Yastremskiy:
Dort kann es eine Menge Ziele geben. Die kleinsten Misses, aus den längsten Segmenten, aus den kürzesten, aus den identischsten) auch in Zielgraphen weniger Zeit und minimaler Weg logistisch unterschiedlich gelöst sind)

Worum geht es hier?

Arrays mit Zeigern auf ein benachbartes Segment sind im Vergleich zu einem Array, das alle fertigen Kombinationen enthält, eine verschwindend geringe Speichermenge.

 
Dmitry Fedoseev:

Hier. Aber wenn es 1.000 Abschnitte gibt, nützt das nichts. Es gibt so viele Möglichkeiten, dass Sie vielleicht nicht einmal genug Speicherplatz haben.

Ich danke Ihnen!

Aber ich bin mir nicht ganz sicher, was der Sinn dieser Aktualisierung ist - wurden Korrekturen am Code vorgenommen? Beim letzten Mal wurden 613 Kombinationen abgerufen, dieses Mal waren es 1507.

Die Geschwindigkeit ist langsamer geworden, aber das liegt wahrscheinlich an der Anzahl der Kombinationen.

Letzte Variante:

2021.04.23 19:56:08.350 Scripts script Q_Podbor_02 (Si-6.21,M1) loaded successfully
2021.04.23 19:56:08.742 Scripts script Q_Podbor_02 (Si-6.21,M1) removed

Aktuelle Variante:

2021.04.23 19:51:56.608 Scripts script Q_Podbor_03 (Si-6.21,M1) loaded successfully
2021.04.23 19:51:58.387 Scripts script Q_Podbor_03 (Si-6.21,M1) removed
Dmitry Fedoseev:

Wir könnten auch einen anderen Weg gehen - am Ende jedes Segments könnten wir ein Array mit Indizes einbinden, die auf das nächste Segment verweisen. Dadurch wird sichergestellt, dass alle Varianten durchlaufen werden, ohne dass der Speicher voll wird. Aber es wird immer noch viele Varianten geben... die Suche wird sehr lange dauern. Sie können auch darüber nachdenken, wie Sie den Zugang zu den Varianten über ihre Nummern ermöglichen können, falls Sie dies benötigen (zum Spaß).

Wenn ich es richtig verstanden habe, geht es darum, die Kombination nachträglich zu berechnen und auszuwerten, dann das Ergebnis zu speichern und zur nächsten Kombination überzugehen. Wenn das neue Ergebnis (oder die Top 10) besser ist als das letzte, wird es in der Array-Variablen ersetzt. Und, ja, wollte nur fragen, wie man die Kette der Indizes der ersten Ebene des Arrays, aus dem die Kombination besteht, erhält?

Dmitry Fedoseev:

Aber ist es sinnvoll, wenn es so viele Varianten gibt? Wie wäre es, das Problem zu spezifizieren, um es realistischer zu machen?

Warum ist die Variante mit einer begrenzten Anzahl von Segmenten ab dem aktuellen Punkt (Kombinationsschritt, wenn n Segmente bereits aufgenommen wurden) nicht geeignet, weil sie die Anzahl der Kombinationen deutlich reduziert?

 
Aleksey Vyazmikin:

Ich danke Ihnen!

Aber ich habe den Sinn der Aktualisierung nicht ganz verstanden - wurden Korrekturen am Code vorgenommen? Letztes Mal gab es 613 Kombinationen, dieses Mal sind es 1507.

Die Geschwindigkeit ist langsamer geworden, aber das liegt wahrscheinlich an der Anzahl der Kombinationen.

Letzte Variante:

Aktuelle Variante:

Wenn ich es richtig verstanden habe, wird vorgeschlagen, eine Kombination nacheinander zu berechnen und sofort auszuwerten, das Ergebnis der Auswertung zu speichern und mit der nächsten Kombination fortzufahren. Wenn das neue Ergebnis (oder die Top 10) besser ist als das vorherige, wird es im Array/Variable ersetzt. Und, ja, wollte nur fragen, wie man eine Kette von Indizes der ersten Ebene des Arrays, aus dem die Kombination besteht, zu erhalten?

Warum ist es nicht gut, eine begrenzte Anzahl von Abschnitten vom aktuellen Punkt aus zu probieren (Kombinationsschritt, wenn man bereits n Abschnitte ausgewählt hat), weil sich dadurch die Anzahl der Kombinationen erheblich reduzieren lässt?

Warum betrachten wir nicht die ursprüngliche Version des Problems?

 
Алексей Тарабанов:

Warum schauen wir uns nicht die ursprüngliche Version des Problems an?

Ohne die Abschnitte.

 
Алексей Тарабанов:

Warum schauen wir uns nicht die ursprüngliche Version des Problems an?

Alexej Tarabanow:

Ohne die Segmente.

Gab es eine solche Variante?

Die ursprüngliche Variante besteht darin, die numerische Reihe als Array idealerweise in Segmente (Bereiche) zu unterteilen. Die Kriterien für das Splitting sind:

1. Mindestens 5% der Zahlen fallen in einen Bereich - %R. 2;

2) Bewerten Sie die Antwort eines Segments auf ein anderes binäres Array der gleichen Größe (wenn es eine Zahl im Bereich - 1, wenn nicht - 0) und die Antwort des Segments sollte vom Durchschnittswert des gesamten binären Arrays um mindestens 5% - dP% abweichen;

3. Berechnen Sie auf 10 identischen Segmenten nach Array-Tiefe den SCO dP%, der nicht mehr als 1,5 - K_SKO betragen sollte.

Nun definieren verschiedene Methoden Bereiche, aber verschiedene Methoden sind in der Lage, verschiedene Bereiche auszuwählen, die die oben genannten Kriterien erfüllen. Daher besteht das Ziel darin, alle Varianten der Segmentierung aus verschiedenen Methoden zu nehmen und die besten zu kombinieren.

 
Aleksey Vyazmikin:

Ich danke Ihnen!

Aber ich habe den Sinn der Aktualisierung nicht ganz verstanden - wurden Korrekturen am Code vorgenommen? Letztes Mal gab es 613 Kombinationen, dieses Mal sind es 1507.

Die Geschwindigkeit ist langsamer geworden, aber das liegt wahrscheinlich an der Anzahl der Kombinationen.

Letzte Variante:

Aktuelle Variante:

Wenn ich es richtig verstanden habe, wird vorgeschlagen, eine Kombination nacheinander zu berechnen und sofort auszuwerten, das Ergebnis der Auswertung zu speichern und mit der nächsten Kombination fortzufahren. Wenn das neue Ergebnis (oder die Top 10) besser ist als das vorherige, wird es im Array/Variable ersetzt. Und, ja, wollte nur fragen, wie man eine Kette von Indizes der ersten Ebene des Arrays, aus dem die Kombination besteht, zu erhalten?

Warum ist es nicht gut, eine begrenzte Anzahl von Abschnitten vom aktuellen Punkt aus zu probieren (Schritt der Kombination, wenn man bereits n Abschnitte ausgewählt hat), da dies die Anzahl der Kombinationen erheblich reduzieren kann?

Und ich weiß nicht, wo und in was Sie nach Kombinationen suchen? Im Allgemeinen wird bei jedem Start ein neuer Satz von Eingabesegmenten erstellt, der immer anders ist.

Eine Kette von Indizes - Sie müssen also Kombinationen nicht aus den Segmenten, sondern aus den Indizes der Segmente erstellen, oder Sie können ein drittes Element in der zweiten Dimension hinzufügen und den Index darin speichern.

Ich weiß nicht, warum eine begrenzte Anzahl nicht geeignet ist, Sie haben über alle Kombinationen geschrieben.

 
Dmitry Fedoseev:

Ich weiß nicht, wo und in welchen Kombinationen Sie suchen?

Oben hat Alexej Tarabanow detailliert geschrieben, wo und in was er geantwortet hat. Aber das ist Theorie - ich habe noch nicht wirklich fertig, was ich brauche.

Dmitry Fedoseev:

Im Allgemeinen wird bei jedem Start eine neue Gruppe von Ausgangssegmenten erstellt, die immer unterschiedlich sind.

Dann sehe ich - ich habe mich nicht damit beschäftigt und lasse einfach zwei Skripte laufen - wenn die Menge unterschiedlich ist, dann kann man nur auswerten, ob die Mengen gleich sind.

Dmitry Fedoseev:

Indexkette - wir sollten also Kombinationen nicht aus Segmenten, sondern aus Indizes von Segmenten erstellen, oder ein drittes Element zur zweiten Dimension hinzufügen und den Index darin speichern.

Ich denke, das dritte Element ist die bequemere Option. Könnten Sie den Code so ändern, dass er mit dieser Implementierung korrekt funktioniert?

Dmitry Fedoseev:

Ich weiß nicht, warum eine Art Aufzählung einer begrenzten Anzahl nicht gut ist, Sie haben über alle Kombinationen geschrieben.

Das ist richtig, ursprünglich habe ich über alle Kombinationen geschrieben, aber im Laufe des Prozesses, dank Ihnen, wird es klar, dass es sehr teuer ist, und wir brauchen eine Option, empirisch in der Lage, nicht schlechter als Brute-Force zu sein. Und da die Auswertung der resultierenden Segment ist von seinen Chunks gebildet, nehme ich an, dass durch die Begrenzung n Kombinationen der besten Chunks und das Hinzufügen von neuen Chunk, wird es möglich sein, die beste Option aller möglichen Kombinationen ohne Limit zu nähern.

Grund der Beschwerde: