Algorithmus - Minimierung boolescher Ausdrücke
Ich versuche zu schreiben ein Stück code, das kann reduzieren die LÄNGE eines booleschen Ausdrucks auf ein minimum, so sollte der code reduzieren Sie die Anzahl der Elemente in den Ausdruck ein, um so wenig wie möglich. Jetzt bin ich stecken und ich brauchen etwas Hilfe, = [
Hier ist die Regel: es kann beliebig viele Elemente in einen booleschen Ausdruck, aber es enthält nur und-UND ODER-Operatoren, plus Klammern.
Zum Beispiel, wenn ich pass in einen booleschen Ausdruck: ABC+BCD+DE, die optimale Leistung wäre BC(A+D)+DE, das spart 2-unit-Räume im Vergleich zum original, da die beiden BCs sind kombiniert in einem.
Meine Logik ist, dass ich werde versuchen, die am häufigsten erschien element im Ausdruck und Faktor aus. Dann rufe ich die Funktion rekursiv, das gleiche zu tun, um die einkalkuliert Ausdruck, bis Sie völlig verplant.
Aber wie finde ich das häufigste element im ursprünglichen Ausdruck? Das heißt, im obigen Beispiel, BC? Wie es scheint, ich würde versuchen, alle verschiedenen Kombinationen von Elementen, und findet die Anzahl, wie oft jede Kombination wird in der gesamten Ausdrucks. Aber das klingt sehr naiv.
Zweite
Kann mir jemand einen Tipp geben wie man diese effizient? Sogar einige Stichwörter kann ich die Suche auf Google zu tun.
- Verwenden Sie die Karnaugh Karte, Luke?
- Ya hab ich gedacht, aber das ist nur, wenn Sie mit Stift und Papier richtig? Wie kann ich einen computer-code, der es tut?
- Mit den Klammern, BC - (A+D)+DE-und ABC+BCD+DE sind gleich lang. Ich bin auf das gleiche problem jetzt. Diese link über Sie spricht ein wenig unter die Algebraische Minimierung Abschnitt. Ich denke, es ist einfach zu tun übergibt, gelten die booleschen Identitäten der Formel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry habe ich nicht gelesen, über all die coolen algorithmen noch nicht, aber Sie fragte Sie über die Suche nach dem gemeinsamen Faktor, so dachte ich an folgende:
Liefert die Funktion eine Liste sortiert nach:
B(AC+CD+ACE) + DE
, und diese wiederum können sich inBC(A+D+AE) + DE
. Dann beachten Sie, dass dieA+AE
ist redundant, so dass Sie schließlich habenBC(A+D) + DE
.Was Sie suchen, ist ein Weg zur Minimierung einer booleschen Funktion. Dies ist etwas, das von Interesse ist, insbesondere für das chip-design-community. Eine Technik, die verwendet wird, für Ihre Zwecke ist die Quine-McCluskey-Algorithmus, oder Sie können Karnaugh Karten wie vorgeschlagen von Li-aung Yip in die Kommentare.
Espresso
minimiser, die Schuppen viel besser als Quine-McCluskey.Espresso
ist ein gutes Paket für die Erkundung dieser. Aber im Allgemeinen das, was Sie gerne tun würde, ist sehr schwer berechenbar. Die EDA - (Electronic Design Automation - verantwortlich für alle chip-design-tools) - Industrie gearbeitet hat, in diesen und ähnlichen Bereichen für eine lange Zeit, aber es gibt keine schnelle Lösung und die genauen algorithmen sind exponentiell in der Anzahl der Variablen.Verwenden Sie die Quine-McCluskey Algorithmus zur Minimierung boolescher Ausdrücke. Es ist funktionell äquivalent zu der Karnaugh-Map-Ansatz, aber viel zugänglicher für die Implementierung auf einem computer.
Können Sie auch gern anschauen Espresso-Heuristik-Logik minimizer.
Leider, die meisten der gegebenen Empfehlungen nicht tatsächlich geben @turtlesoup, was er/Sie sucht. @turtlesoup nach einer Möglichkeit gefragt, um minimieren Sie die Anzahl der Zeichen für einen gegebenen booleschen Ausdruck. Die meisten Vereinfachung Methoden nicht Ziel die Anzahl der Zeichen, die als Schwerpunkt für die Vereinfachung. Wenn es um die Minimierung in der Elektronik, die Benutzer wollen in der Regel die geringste Anzahl von gates (oder Teile). Dies bedeutet nicht immer Ergebnis in einer kürzeren Ausdruck in Bezug auf die "Länge" des Ausdrucks -- die meisten Zeiten tut es, aber nicht immer. In der Tat, manchmal kann der Ausdruck größer geworden, in Bezug auf die Länge, obwohl es möglicherweise einfacher, von einem Elektronik-Standpunkt (benötigt weniger Tore zu bauen).
boolengine.com ist die beste Vereinfachung tool, das ich kenne, wenn es um die Boolesche Vereinfachung digitaler schaltungen. Es nicht erlauben, Hunderte von Eingaben, sondern es ermöglicht auch 14, das ist viel mehr als die meisten vereinfachungs-tools.
Beim arbeiten mit Elektronik, Vereinfachung der Programme, die in der Regel zerlegen Sie den Ausdruck in der Summe-von-Produkt-form. So wurde der Ausdruck " (ab)+' - cd zu 'c+'b+'a+d. Die "vereinfachte" Ergebnis erfordert mehr Zeichen als Ausdruck, aber ist einfacher zu bauen, von einem Elektronik-Standpunkt. Es erfordert nur einen einzigen 4-input or gate und 3 Wechselrichtern (4 Teile). In der Erwägung, dass der ursprüngliche Ausdruck erfordern würde, 2 UND-Gatter, 2 Wechselrichter, und ein ODER-Tor (5 Teile).
Nachdem er @turtlesoup dem Beispiel BoolEngine, es zeigt, dass BC(A+D)+DE wird E+D+ABC. Dies ist eine kürzere Ausdruck, und wird in der Regel sein. Aber sicher nicht immer.
Hier ist ein applet Umsetzung Karnaugh maps: http://www-ihs.theoinf.tu-ilmenau.de/~sane/projekte/karnaugh/embed_karnaugh.html
Können Sie Ihren Ausdruck oder ausfüllen einer Wahrheitstabelle.