Ich weiß nicht, wie ich es elegant ausdrücken soll, aber im Grunde möchte ich einen Brute-Force-Suchalgorithmus implementieren, aber es gibt viele verschiedene Möglichkeiten, die ich durch den Suchraum aufzählen könnte. Das mag für mich naiv sein, aber ich stelle mir vor, dass die Art und Weise, wie ich durch den Suchraum aufzähle, einen großen Einfluss darauf haben kann, ob mein Algorithmus in der Praxis gut funktioniert oder nicht.
Betrachten Sie das folgende Entscheidungsproblem als vereinfachtes Beispiel.
Eingabe: Ein Polynom mit ganzzahligen Koeffizienten und einer natürlichen Zahl .
Frage: Existiert so, dass ?
Nun könnte es viele verschiedene Algorithmen geben, um dieses Problem zu lösen, aber ich entscheide mich für einen Brute-Force-Ansatz. Betrachten Sie die folgenden Strategien zum Aufzählen im Suchraum.
Aufsteigende Strategie: Ich könnte überprüfen, ob 0 ist, dann , dann , ..., bis ich ein finde, so dass oder ich versuche jedes .
Absteigende Strategie: Ich könnte überprüfen, ob 0 ist, dann , dann , ..., bis ich ein finde, so dass oder ich versuche es jedes .
Beliebtheitsstrategie: Ich könnte eine kleine Liste der beliebtesten Lösungen speichern und diese zuerst ausprobieren, bevor ich die Zahlen in versuche .
Siebstrategie: Ich könnte eine Art Siebzählung durchführen. Ich versuche alle Zahlen, die durch 2 in teilbar sind, dann Zahlen, die durch 3 in teilbar sind , dann 5, dann 7, dann 11, dann 13 und so weiter. (Vorausgesetzt, ich habe Zugriff auf eine große vorberechnete Liste von Primzahlen.)
Zufallsstrategie: Vielleicht gibt es eine interessante Aufzählungsstrategie, die eine große Folge von Zufallsbits verwendet.
Grundsätzlich möchte ich die folgenden Fragen zu Brute-Force-Suchalgorithmen beantworten:
Frage A: Gibt es Vorteile bei der Auswahl einer bestimmten Aufzählungsstrategie?
Frage B: Gibt es Beispiele für Suchprobleme, bei denen Sie in der Praxis eine interessante Aufzählungsstrategie wählen würden? Ich habe das Gefühl, dass es einige Suchprobleme geben kann, bei denen in der Praxis eine Variante der Popularitätsstrategie effektiv funktioniert.
quelle
Antworten:
Die Antwort auf Ihre beiden Fragen lautet Ja! Auch wenn Sie im schlimmsten Fall den gesamten Suchraum mit Brute-Force aufzählen müssen (um zu beweisen, dass es keine Lösung gibt), ist es absolut sinnvoll zu überlegen, wie Sie den Suchraum durchqueren. Im Allgemeinen finden Sie viel Literatur und Diskussion zu diesem Thema aus dem Bereich der KI, insbesondere z. B. SAT / CSP-Lösung. Eine schnelle und sanfte Einführung bietet das Buch von Russell und Norving.
Ich benutze gerne das Sudoku-Puzzle als Beispiel. Um zu entscheiden, ob ein teilweise gefülltes Puzzle eine Lösung hat, können Sie alle möglichen Möglichkeiten zur Vervollständigung gründlich prüfen. Der naive Ansatz ist eine blinde Backtracking-Suche. Das ist extrem verschwenderisch. Eine bessere Idee ist folgende: Wählen Sie für die nächste Zelle, die zugewiesen werden soll, immer die Zelle mit den wenigsten rechtlichen Werten aus. Im Allgemeinen handelt es sich um eine "Fail-First-Heuristik", und die Intuition ist, dass diese Auswahl höchstwahrscheinlich bald fehlschlägt und dadurch den Suchbaum aggressiv beschneidet. Es gibt tatsächlich eine bekannte "Weisheit" auf dem Gebiet: "Um erfolgreich zu sein, muss man schnell scheitern". Je früher Sie versagen, desto schneller können Sie sich auf den schwierigen Teil des Problems konzentrieren.
Es scheint, dass das oben Genannte sehr problemspezifisch ist und nur für Sudoku-Rätsel gilt. Zum Glück ist dies nicht der Fall. Es ist sehr hilfreich, Ihr Problem zu modellieren oder zu versuchen, Ihr Problem als z. B. eine SAT / CSP-Instanz zu sehen. Dann können Sie sofort bekannte Tricks anwenden, um Ihre Brute-Force zu beschleunigen, bessere Heuristiken zu entwickeln und so weiter. Natürlich können Sie mehrere Größenordnungen besser machen, wenn Sie einen guten CSP / SAT-Löser anstelle von Brute-Force verwenden. Dies ist auch dann von Vorteil, wenn für Ihr Problem nichts wesentlich Besseres als Brute-Force bekannt ist. Dies liegt an der Tatsache, dass Instanzen dazu neigen, eine Struktur zu haben, die von intelligenten Lösern ausgenutzt werden kann, und es schwierig ist, dieselbe Struktur selbst mit z. B. roher Gewalt zu erkennen.
Eine ältere Antwort von mir gibt etwas mehr Konkretheit. Ich denke, mit jeder Strategie, die Sie erwähnen, wurde experimentiert, insbesondere mit Zufälligkeit. Zufällige Neustartstrategien sind beispielsweise sehr leistungsfähig und werden in modernen Lösern verwendet.
quelle
Brute Forcing kann in der Tat durch Heuristiken etwas verbessert werden, basierend auf einigen Kenntnissen des vorliegenden Problems.
Es gibt keine universelle Strategie, die irgendwo funktionieren kann, insbesondere wenn es sich um eine blinde Strategie handelt (unabhängig von der Vorgeschichte der Ergebnisse für verschiedene Studien). Darüber hinaus gibt es wahrscheinlich Probleme, die für jede Strategie schwer zu lösen sind.
Ein Beispiel für eine heuristische Strategie ist das simulierte Tempern, bei dem Sie davon ausgehen, dass Sie dem Optimum umso näher sind, je bessere Lösungen Sie finden. Eine solche Eigenschaft kann für andere Fragen überhaupt nicht gelten.
Frage A : Nein, es gibt keine allgemeine Strategie, die blind angewendet werden könnte.
quelle