Lassen Sie mich sehen, ob ich es richtig verstanden habe, die rot markierten Blöcke waren blau und der Algorithmus hat eine T-Form gefunden und sie rot markiert. Ist das richtig? Ihr Ziel ist es, so viele T-Formen wie möglich mit gleichfarbigen Blöcken zu finden, wie ich hoffe, bis jetzt richtig. Derzeit markieren Sie sie, sobald Sie sie gefunden haben, und dies verringert die Nützlichkeit des Algorithmus (da Ihnen möglicherweise die optimale Lösung fehlt). Sie planen, nach allen Formen zu suchen und dann auszuwählen, welche verwendet werden sollen und welche nicht. Bin ich soweit richtig? Denn Sie möchten die Anzahl der Blöcke maximieren, die in den T-Formen enthalten sind, wenn der Algorithmus fertig ist.
Wenn ich richtig liege, ist das Folgende meiner Meinung nach die optimale Lösung für Ihre Situation.
Wir werden Integer Linear Programming verwenden.
Ich glaube, ich habe diesen in der Vergangenheit benutzt:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Sie können es mit vielen Sprachen zum Laufen bringen, ich habe es mit PHP, Java und C verwendet)
Wir registrieren jede mögliche T-Form auf der Platine und verwenden dann ILP, um die Anzahl der abgedeckten Blöcke zu maximieren. ILP ist exponentiell komplex. Angesichts der Größe Ihres Boards ist dies kein Problem. Ich habe mit ILP viel kompliziertere Min / Max-Fragen zu Diagrammen gestellt und es dauerte nur einen Bruchteil einer Sekunde, bis sie abgeschlossen waren, und bis zu 30-90 Sekunden mit Hunderten von Eckpunkten (in Ihrem Fall fällt sie in den Bruchteil einer Sekunde).
Was ich empfehlen würde:
- Finde alle möglichen Linienformen
- Suchen Sie alle Schnittpunkte zwischen Linienformen derselben Farbe
- Finde alle möglichen T-Formen und suche alle Schnittpunkte.
- Definieren Sie eine boolesche Variable im linearen Problem für jede T-Form (
0 <= Bi <= 1
) Da die Werte Ganzzahlen sind, bleibt 0 oder 1 übrig.
- Legen Sie die Bedingungen für jedes Paar von T-Formen fest, die sich schneiden (
Bi + Bj <= 1
)
- Die Zielfunktion ist (Summe der Blöcke in "T" -Form (i) * Bi)
- Führen Sie den Solver aus und verdunkeln Sie die T-Formen dort, wo die entsprechenden Booleschen Werte des Solvers 1 in der optimalen Lösung sind.
Das ist wertvolles Wissen, ich habe oft lineare Löser für Arbeitsprojekte verwendet.
ILP ist im Grunde eine Möglichkeit, Auswahlprobleme zu lösen, bei denen Sie für eine lineare Funktion ein Maximum oder ein Minimum erreichen möchten.
Weitere Informationen finden Sie hier. Die Verwendung der linearen Ganzzahlprogrammierung und der linearen Programmierung ist für den Programmierer gleich, nur dass die Ganzzahl für den Computer weitaus komplexer ist, was zu langen Laufzeiten führen kann. Nicht in Ihrem Fall, es ist sehr einfach und sollte im schlimmsten Fall nur weniger als Millisekunden dauern.
Ich denke, Sie könnten hier mehr lesen:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Das erklärt es gut:
http://fisher.osu.edu/~croxton_4/tutorial/
Es ist im Grunde ein Entscheidungsproblemlöser, wie man Entscheidungen trifft, die das gewünschte Ergebnis maximieren. Dies setzt voraus, dass die Funktion, die das Ergebnis beurteilt, linear ist, wie es in Ihrem speziellen aktuellen Fall der Fall ist. Die Funktion, die in diesem Fall das Ergebnis beurteilt, fasst die Blöcke für alle T-Formen zusammen, die Sie abdunkeln möchten.
Mathematisch, wie man die Variablen setzt: In unserem aktuellen Fall Boolesche Werte (Habe ich die T-Form mit dem Index i abgedunkelt oder nicht) auf die optimalen Werte, um das gewünschte Ergebnis zu maximieren: Verdunkeln Sie so viele Blöcke wie möglich, ohne sich überschneidende T-Formen abzudunkeln. Solange das gewünschte Ergebnis mit einer linearen Funktion berechnet werden kann, wenn Sie alle Variablen festgelegt haben, wird es gelöst. In unserem Fall prüfen wir, welche T-Formen wir abgedunkelt haben, und addieren die Blöcke, die sie abdecken.
Ich weiß, dass dies nicht trivial ist. Wenn Sie sich also für den Sprung entscheiden, können Sie dies gerne kommentieren, und ich werde darauf näher eingehen.