Die Aufgabe besteht darin, Code zu schreiben, der kleine logische Formeln für Bitsummen finden kann.
Die allgemeine Herausforderung besteht darin, dass Ihr Code die kleinstmögliche logische Satzformel findet, um zu überprüfen, ob die Summe der y binären 0/1-Variablen einem Wert x entspricht. Nennen wir die Variablen x1, x2, x3, x4 usw. Ihr Ausdruck sollte der Summe entsprechen. Das heißt, die logische Formel sollte genau dann wahr sein, wenn die Summe gleich x ist.
Hier ist ein naiver Weg, um damit zu beginnen. Sagen Sie y = 15 und x = 5. Wählen Sie alle 3003 verschiedenen Möglichkeiten zur Auswahl von 5 Variablen aus und erstellen Sie für jede eine neue Klausel mit dem UND dieser Variablen UND dem UND der Negation der verbleibenden Variablen. Sie erhalten 3003 Klauseln mit einer Länge von jeweils genau 15 für Gesamtkosten von 45054.
Ihre Antwort sollte ein logischer Ausdruck dieser Art sein, der beispielsweise einfach in Python eingefügt werden kann, damit ich ihn testen kann. Wenn zwei Personen den gleichen Größenausdruck erhalten, gewinnt der Code, der am schnellsten ausgeführt wird.
Sie dürfen neue Variablen in Ihre Lösung einführen. In diesem Fall besteht Ihre logische Formel aus den y-Binärvariablen x und einigen neuen Variablen. Die gesamte Formel wäre nur dann erfüllbar, wenn die Summe der y-Variablen gleich x ist.
Als Anfangsübung möchten einige Leute vielleicht mit y = 5 Variablen beginnen, die zu x = 2 addieren. Die naive Methode kostet dann 50.
Der Code sollte zwei Werte y und x als Eingaben annehmen und die Formel und ihre Größe als Ausgabe ausgeben. Die Kosten einer Lösung sind nur die Rohanzahl der Variablen in ihrer Ausgabe. So (a or b) and (!a or c)
zählt als 4. Die einzigen erlaubt Operatoren sind and
, or
und not
.
Update Es stellt sich heraus, dass es eine clevere Methode gibt, um dieses Problem zu lösen, wenn x = 1 ist, zumindest theoretisch.
z[0] = y[0] and y[1]
, wie soll dies angezeigt werden?
z[0]
dargestellt y[0] or y[1]
wird, muss ich nur eine Klausel einführen, die aussieht (y[0] or y[1]) or not z[0]
(oder eine äquivalente Anweisung unter Verwendung der 3 zulässigen Operatoren).