Algorithmus zum Kombinieren von Bereichen eines Segments - Hilfe zum Erstellen

 

Bitte helfen Sie mir, einen Algorithmus zu erstellen, der Teile (Bereiche) eines Segments zu einem Segment zusammenfasst, ohne dass sich die Segmente überschneiden, mit einer möglichen Lücke, die später ausgefüllt werden kann.

Zu Beginn haben wir eine Reihe von Zahlen in einem bestimmten Bereich, Zahlen können wiederholt werden, diese Reihe ist in Segmente durch Grenzen unterteilt. Die Grenzen werden durch verschiedene Algorithmen erzeugt, und in der Regel sind die Grenzen nicht einheitlich, so dass sich herausstellt, dass die Zahlenreihe durch verschiedene Methoden zerlegt wird und jeder Bereich eine andere Größe hat. Anschließend wird jedes dieser Segmente anhand von drei Kriterien bewertet, wobei jedes Kriterium eine eigene Grenze hat, bei deren Nichteinhaltung ein Teil des Bereichs ausscheidet. Als Ergebnis erhalten wir eine Tabelle mit folgendem Inhalt.

i - laufende Nummer des Bereichs;

S - Grenze für den Beginn des Bereichs;

F - Grenze für das Bereichsende;

%R - Kriterium Nr. 1;

%dP - Kriterium Nummer 2;

%K_SCO - Kriterium Nummer 3;

K_Svod - zusammenfassende Bewertung aller Kriterien.

Die folgende Abbildung zeigt, wie Chunks (Segmente) in der Ebene platziert werden können:

Die 3 Farben der Häkchen neben den Spielsteinen sind mögliche Lösungen für das Problem.

Der Algorithmus sollte verschiedene Kombinationen von Lösungen für das Problem liefern, damit die Bedingung erfüllt ist:

1. die Segmente werden ohne sich kreuzende Bereiche (S>=A && F<B) abgeglichen;

2. Es ist unmöglich, ein weiteres Segment aus den vorhandenen hinzuzufügen - d.h. eine gewisse Vollständigkeit und maximale Dichte ausgehend von den gewählten und vorhandenen Varianten;

3. Die Reihenfolge der Segmente ist geordnet, um ähnliche Kombinationen auszuschließen;

4. mindestens einer der besten Balken wird verwendet, aus denbesten 30% nachK_Svod- um die Kombinationen zu reduzieren und die Priorität des besten Ergebnisses zu behalten.

Im Idealfall sollte die Qualitätsschätzung die Summe aller Segmente gemäß K_Svod maximieren , aber möglicherweise muss sie ein wenig korrigiert werden, um den Füllraum/die Füllräume zu schätzen.

Vielleicht habe ich die falsche Terminologie verwendet und mein Problem wurde schon vor langer Zeit gelöst - urteilen Sie nicht - klären Sie mich auf.

 
Aleksey Vyazmikin:


1) K_Svod - zusammenfassende Bewertung aller Kriterien.

2) Die folgende Abbildung zeigt, wie Teile (Segmente) in der Ebene platziert werden können:

3) Die Segmente werden ohne Bereichsüberschneidungen abgeglichen (S>=A && F<B);

1) Was ist das? Warum Xs?

2) besser mit einem Bild zeigen, was richtig ist und was falsch ist

3) Was ist "A" und was ist "B"?

4) Erstellen Sie auch ein "Mock-up" der Datentabelle und zeigen Sie, was Sie als zufriedenstellende Lösung sehen möchten.
 
Möglicherweise mit Hilfe der Graphentheorie gelöst. Die Scheitelpunkte eines Graphen sind Segmente, die Pfeile des Graphen verbinden jeden Scheitelpunkt mit allen möglichen nachfolgenden Scheitelpunkten (den nächstmöglichen Segmenten). Jeder Knotenpunkt und jeder Pfeil wird mit einem Gewicht versehen, und es wird eine Regel definiert, nach der das Gewicht jedes Pfades gezählt wird. Es wird ein Algorithmus angewandt, um einen optimalen Pfad im Graphen zu finden. Ich bin nicht bereit, diese Frage näher zu untersuchen)
 
mytarmailS:

1) Was ist es? Warum X?

2) besser mit einem Bild zeigen, was richtig und was falsch ist?

3) Was ist "A" und was ist "B"?

4) Erstellen Sie auch ein "Mock-up" der Datentabelle und zeigen Sie, was Sie als zufriedenstellende Lösung sehen möchten.

1. es ist eine Ableitung aus allen 3 Bewertungen, X ist von der Tatsache, dass ich mich noch nicht für Gewichte entschieden habe, es ist nicht wesentlich.

2. Die richtige Lösung besteht darin, den Raum mit Segmenten zu füllen (eine Linie mit wahrscheinlich nicht gefülltem Raum zwischen den Segmenten) - in der Abbildung oben habe ich die Farben für jede der 3 möglichen Lösungen angekreuzt. Es ist möglich, über zusätzliche Heuristiken nachzudenken, z.B. dass die Summe der zugewiesenen Bereiche aller Segmente so groß wie möglich ist, aber neben der Summe ist auch der K_Svod-Wert wichtig.

3) Es handelt sich um einen Zahlenwert innerhalb des Segments, es wäre besser, A1>=S1 && A1<F1 && F1<S2 zu schreiben.

4. Die Lösung wäre ein Array mit Indizes. Oder ich habe die Frage nicht verstanden. Algorithmus, wie man es besser machen kann, weiß ich nicht.

 
Aleksey Nikolayev:
Wahrscheinlich mit Hilfe der Graphentheorie gelöst. Die Scheitelpunkte eines Graphen sind Segmente, die Pfeile des Graphen verbinden jeden Scheitelpunkt mit allen möglichen nachfolgenden (den nächstgelegenen zulässigen Segmenten). Jeder Knotenpunkt und jeder Pfeil wird mit einem Gewicht versehen, und es wird eine Regel definiert, nach der das Gewicht jedes Pfades gezählt wird. Es wird ein Algorithmus angewandt, um einen optimalen Pfad im Graphen zu finden. Ich bin nicht bereit, diese Frage näher zu untersuchen)

Danke für die Idee, ich denke, es ist möglich, die Sequenz vom Anfang jedes Indexes i zu konstruieren und dann die resultierenden Kombinationen auszuwerten. Alles, was wir brauchen, ist ein Auswahlkriterium oder mehrere Kriterien, um verschiedene Kombinationen zu erhalten. Oder Kriterien randomisieren.... ist noch nicht klar.

 
Aleksey Vyazmikin:

1. Es ist eine Ableitung aus allen 3 Bewertungen, das X kommt daher, dass ich mich noch nicht für die Gewichte entschieden habe - es ist nicht wesentlich.

2. Die richtige Lösung besteht darin, den Raum mit Segmenten zu füllen (eine Linie mit wahrscheinlich nicht gefülltem Raum zwischen den Segmenten) - in der Abbildung oben habe ich die Farben für jede der 3 möglichen Lösungen angekreuzt. Es ist möglich, über zusätzliche Heuristiken nachzudenken, z.B. dass die Summe der zugewiesenen Bereiche aller Segmente so groß wie möglich ist, aber neben der Summe ist auch der K_Svod-Wert wichtig.

3) Es handelt sich um einen Zahlenwert innerhalb des Segments, es wäre besser, A1>=S1 && A1<F1 && F1<S2 zu schreiben.

4. Die Lösung wäre ein Array mit Indizes. Oder ich habe die Frage nicht verstanden. Der Algorithmus, wie man es besser machen kann, ich weiß es nicht.

Ich verstehe es immer noch nicht.

 
Aleksey Vyazmikin:

Danke für die Idee, ich denke, es ist möglich, die Sequenz vom Anfang jedes Indexes i zu konstruieren und dann die resultierenden Kombinationen auszuwerten. Alles, was wir brauchen, ist ein Auswahlkriterium oder mehrere Kriterien, um verschiedene Kombinationen zu erhalten. Oder Kriterien randomisieren.... ist noch nicht klar.

Und wo sind die Zecken, gibt es eine Art Kriterium, dass das Segment zu dieser Zecke gehört?
Im Grunde bekommen Sie drei Ticks. Blau, rot, grün.
In diesem Beispiel sind es also drei Identifikatoren.
Wenn Sie diese Bezeichner auf irgendeine Weise zuordnen, können Sie sie zu drei Hauptfeldern verketten.
Mit Hilfe des Bezeichners erhalten wir die Größe des resultierenden Segments,
verwenden den Bezeichner, um das Hauptempfangsfeld zu definieren undseine Kapazität um diese Größezu erhöhen,
verwenden den Bezeichner, um das Segment am Ende des Feldes einzufügen.
Wir müssen also irgendwie ein Kriterium definieren, dass das Segment zu diesem Kontrollkästchen (Bezeichner) gehört.

 
mytarmailS:

Ich verstehe es immer noch nicht.

Bitte klären Sie, was Sie nicht verstehen - ich werde versuchen, es mit anderen Worten zu erklären.

 
Roman:

Aber wo sind die Zecken, gibt es eine Art Kriterium, dass das Segment zu dieser Zecke gehört?
Im Grunde haben Sie drei Ticks. Blau, rot, grün.
In diesem Beispiel sind es also drei Identifikatoren.
Wenn Sie diese Bezeichner auf irgendeine Weise zuordnen, können Sie sie zu drei Hauptfeldern verketten.
Mit dem Bezeichner erhalten wir die Größe des resultierenden Segments,
mit dem Bezeichner definieren wir ein Basis-Empfangs-Array underhöhen dessen Kapazität um diese Größe,
mit dem Bezeichner fügen wir das Segment am Ende des Arrays ein.
Wir müssen also ein Kriterium definieren, dass das Segment zu diesem Kontrollkästchen (Bezeichner) gehört.

Ich habe die Segmente gezeichnet und dann gedacht, ich zeige die Möglichkeit, sie zu kombinieren - ich habe mir die Kombinationen angesehen, die sich nicht überschneiden und zusammen eine große Fläche einnehmen. Beachten Sie, dass einige der Segmente zwei Häkchen haben, was bedeutet, dass es möglich ist, das Segment in mehr als einer Kombination zu haben.

Das heißt, dass es vor Beginn der Datenverarbeitung keine Kennung gibt.
 
Aleksey Vyazmikin:

Ich habe die Segmente gezeichnet, und dann dachte ich, ich zeige die Möglichkeit, sie zu kombinieren - ich habe mir die Kombinationen angesehen, die sich nicht überschneiden und zusammen eine größere Fläche einnehmen. Beachten Sie, dass einige der Segmente zwei Häkchen haben, was bedeutet, dass es möglich ist, das Segment in mehr als einer Kombination zu haben.

D.h. es gibt keine Kennung, bevor die Datenverarbeitung beginnt.

Vielleicht kann auf der Grundlage Ihres Algorithmus jedes Segment anhand eines bestimmten Kriteriums identifiziert und mit einer Kennung versehen werden.
Und die Tatsache, dass ein Segmentin mehr als einer Kombination vorkommen kann, hängt davon ab, ob es dem Hauptfeld erneut hinzugefügt werden muss oder nicht.
Verwenden Sie ternäre oder bedingte Operatoren, um mit der Logik zu spielen.

 
Roman:

Vielleicht kann auf der Grundlage Ihres Algorithmus jedes Segment anhand eines bestimmten Kriteriums identifiziert und mit einer Kennung versehen werden.
Und die Tatsache, dass ein Segmentin mehr als einer Kombination vorkommen kann, hängt davon ab, ob es dem Hauptfeld erneut hinzugefügt werden muss oder nicht.
Verwenden Sie ternäre oder bedingte Operatoren, um mit der Logik zu spielen.

Es gibt also keinen Algorithmus, mit dem man anfangen könnte :) Jedes Segment wird durch eine Ordnungszahl identifiziert und enthält Informationen über Koordinaten (X-Achse) und eine Art von Nutzenschätzung an diesen Koordinaten.

Bislang gibt es nur eine Idee: das nächstgelegene Segment des ursprünglichen Segments wählen. Vielleicht können wir die ersten 3 nächstgelegenen auswählen, und die Anzahl der Kombinationen wird je nach Anzahl der Segmente wachsen.