Ich muss einen Zyklus mit fester Länge , der genau Ecken innerhalb des Rechtecks x .
Zum Beispiel:
Ich habe bereits herausgefunden, dass ich mindestens Ecken benötige und die Anzahl der Ecken und die Anzahl der Nicht-Ecken-Elemente gerade sein muss.
Dann schreibe ich einen rekursiven Algorithmus, der in exponentieller Zeitkomplexität läuft, aber ich habe das starke Gefühl, dass dies viel schneller geht.
Das Problem ist, dass ich nicht weiß, welches Quadrat definitiv im Zyklus sein wird, also ich meinen Algorithmus auf den ersten Feldern aus, um alle Chancen abzudecken, aber ich bin mir bewusst, dass ich einige Zweige durchsuche.
Ich habe auch festgestellt, dass der Zyklus, wenn er existiert, mit einer Ecke in (0, 0) oder einer Ecke in (0, 1) beginnt.
Hat jemand eine Idee, wie man das Ding beschleunigt?
Einen schönen Tag noch!
Antworten:
Ihr Problem erscheint mir von Natur aus exponentiell, um alle Lösungen zu finden. Eine grobe Skizze zeigt, dass eine große Anzahl ähnlich aussehender Objekte erstellt werden soll. Die Objekte sind unter Translation und Rotation gleich. Sie können (anscheinend?) auch skaliert werden. Im groben Sinne gibt es also keine Möglichkeit, es zu "beschleunigen", wenn Sie bereits einen exponentiellen Zeitalgorithmus haben. Sie fragen nach einem besseren Algorithmus, aber auch nach allgemeinen Ideen. Hier sind einige Ideen / Vorschläge.
Sie haben das Problem abstrahiert, aber es könnte hilfreich sein, einen Schritt zurückzutreten und den Hintergrund zu beschreiben, der es inspiriert hat. kommt es aus einem bestimmten Bereich? Es besteht die Möglichkeit, dass es Artikel gibt, die den allgemeinen Bereich untersuchen.
Es sieht aus wie in NP, weil es leicht zu überprüfende Lösungen ist. Denken Sie daran, es in Bezug auf NP zu lösen. Ein kanonisches Problem in diesem Bereich ist das Erfüllbarkeitsproblem . Viele Probleme wurden darauf umgestellt und SAT-Löser sind "Stand der Technik" zur Lösung von NP-Problemen. SAT-Löser können die intrinsischen Symmetrien des Problems nicht technisch "effizient" (im Sinne einer garantierten P-Zeit), sondern auf die "effizienteste bekannte Art und Weise", basierend auf Heuristiken, "Best Practices" und jahrzehntelanger Optimierungsforschung, entdecken und handhaben. Theorie. Überlegen Sie sich also, es in SAT zu übersetzen und auf diese Weise zu studieren.
Wenn Sie eine allgemeine Vorstellung vom Verhalten des Algorithmus erhalten möchten, können Sie es in verschiedenen Maßstäben ausführen und die Anzahl der Lösungen grafisch darstellen, um grundlegende Skalierungseigenschaften zu ermitteln.
Wenn Sie nur eine Lösung wünschen , können Sie einen probabilistischen Ansatz ausprobieren, bei dem Sie eine einfache Startform festlegen, z. B. Quadrat / Rechteck, und diese dann zufällig ändern, bis sie Ihren Anforderungen näher kommt. siehe zB Heuristik . Auch dafür sind genetische Algorithmen gut. Sie können die Form in Bezug auf die genetische Codierung codieren.
Stellen Sie sich eine dreieckige Form vor, die zwei gerade Seiten im rechten Winkel und dann eine dritte Seite hat, die diagonal ist und eine beliebige Anzahl von Ecken aufweist. Es ist keine "effiziente" Raumnutzung, da es eine große offene Fläche hat, aber Ihren Kriterien entspricht und in jeder Größenordnung mit einer beliebigen Anzahl von Ecken erstellt werden kann. Sie haben keine Kriterien für die Minimierung oder Maximierung des Platzes innerhalb oder außerhalb angegeben. Vielleicht ist dies, wie angegeben, etwas unterfordert.
Ich denke tatsächlich, dass dies möglicherweise besser beschrieben werden muss. Berühren Sie Quadrate nur an den Randquadraten und die Quadrate, die diese Randquadrate berühren? Was meinst du mit "Ecken"? Ecken auf Ihrem Objekt? Eckquadrate auf dem Rechteck? Sie geben nur ein Beispiel an, denken also, Ihre Beschreibung ist etwas mehrdeutig oder kann bei näherer Betrachtung falsch interpretiert werden.
quelle