Gibt es eine Strategie für die Brute-Force-Suche?


7

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 .p(x)k

Frage: Existiert so, dass ?i[k]p(i)=0

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 .p(1)p(2)p(3)ip(i)=0i[k]

Absteigende Strategie: Ich könnte überprüfen, ob 0 ist, dann , dann , ..., bis ich ein finde, so dass oder ich versuche es jedes .p(k)p(k1)p(k2)ip(i)=0i[k]

Beliebtheitsstrategie: Ich könnte eine kleine Liste der beliebtesten Lösungen speichern und diese zuerst ausprobieren, bevor ich die Zahlen in versuche .L[k]L

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.)[k][k]

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.


3
Meinen Sie "Brute Force" im engeren Sinne, indem Sie jede mögliche Eingabe versuchen und keine Informationen aus einer Eingabe verwenden, um zukünftige Eingaben auszuwählen ? Diese spezielle Definition von Brute Force ist relevant, da sie trivial parallelisiert ist, aber mit all Ihren vorgeschlagenen Strategien kompatibel ist. OTOH, Juhos Antwort spricht vom "Beschneiden des Suchraums", bei dem mehrere Eingaben aufgrund der Informationen, die aus nur einer Eingabe gewonnen wurden, ausgeschlossen werden.
MSalters

1
Ein Leckerbissen - Ich habe einige Male die optimale Raketenbereitstellung für das Kerbal Space Program mit einer Alpha / Beta / Heuristik-Suche berechnet (im Grunde genommen gerichtete Brute Force, die Suchbäume beschneidet, die nicht die beste Antwort sein können), und manuelles Optimieren der Prioritäten kann dies bewirken Größenordnungen schneller. Insbesondere das gelegentliche Erweitern eines Knotens mit einer guten Heuristik im Gegensatz zum besten Alpha scheint erheblich zu helfen, da es keine kostengünstige, aber gute Möglichkeit gibt, das gefundene Alpha zu berechnen. Die Antwort lautet also Ja zu Frage A.
TLW

1
@ MSalters Sie haben mit Ihrem Kommentar einen guten Punkt gemacht. Ich nannte es Brute-Force-Suche, denn wenn es keine Lösung gibt, würden Sie immer noch jedes Element des Suchraums ausprobieren (wenig bis gar kein Beschneiden). Sie können jedoch die gewonnenen Vorkenntnisse verwenden, um die Reihenfolge, in der Sie im Suchraum aufzählen, auf intelligente Weise zu bestimmen. Wie Sie bereits erwähnt haben, können Sie durch Ändern der Aufzählungsreihenfolge die Parallelisierung erschweren.
Michael Wehar

1
Für Ihr spezielles Beispiel haben Sie die Summe und das Produkt der Wurzeln, die die Suche vereinfachen können.
Mark Hurd

Dieser Beitrag beschreibt die Komplexität der Brute-Force-Suche: cstheory.stackexchange.com/questions/14404/…
Michael Wehar

Antworten:


5

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.


3

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.


@Juho: ok, ich verwerfe B, da das OP um Ausnahmen von der Regel bittet.
Yves Daoust
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.