Erster Beitrag zu Math Stackexchange. Kürzlich wurde ich mit einer mathematisch intensiven Herausforderung in der Computerprogrammierung konfrontiert, bei der ich völlig ratlos bin, sie zu lösen. Um Ihnen einige Informationen zu meinem mathematischen Hintergrund zu geben, ich bin Physik-Hauptfach und Informatik-Nebenfach an der Universität und habe kürzlich einen Kurs in linearer Algebra abgeschlossen, zusätzlich zu Calc 1, 2, Multivariate Calc und Diff Eq. Ich habe einige kleine Erfahrungen mit diskreter Mathematik und Zahlentheorie aus einem Einführungskurs in die Informatik. Ich habe Kurse zu linearer Algebra, diskreter Mathematik und algebraischer Codierung durchgeführt, die in den nächsten 6 Monaten geplant sind, bin mir aber nicht sicher, ob ich das Material zur Beantwortung meines Problems behandeln werde. Ich würde warten, bis ich die Kurse besucht habe, um zu sehen, ob ich etwas Neues darauf anwenden kann, aber dieses Problem hat mich verrückt gemacht.
Ich suche nicht unbedingt nach einer Lösung, sondern nach einigen Bereichen, die ich untersuchen kann, die mir bei der Lösung helfen können. Wenn weitere Informationen oder Erklärungen benötigt werden, lassen Sie es mich bitte wissen. Das Problem ist wie folgt:
Aus den Scans des Nebels haben Sie herausgefunden, dass er sehr flach und in einzelne Flecken verteilt ist, sodass Sie ihn als 2D-Gitter modellieren können. Sie stellen fest, dass das aktuelle Vorhandensein von Gas in einer Zelle des Gitters genau durch die 4 benachbarten Zellen bestimmt wird, insbesondere (1) diese Zelle, (2) die Zelle darunter, (3) die Zelle rechts davon, und (4) die Zelle darunter und rechts davon. Wenn im aktuellen Zustand genau 1 dieser 4 Zellen im 2x2-Block Gas hat, dann wird sie auch im nächsten Zustand Gas haben. Andernfalls ist die Zelle im nächsten Zustand leer.
Nehmen wir zum Beispiel an, der vorherige Zustand des Gitters (p) war:
.O.. ..O. ...O O...
Um zu sehen, wie sich dieses Gitter im nächsten Zeitschritt zum aktuellen Gitter (c) ändert, betrachten Sie die 2x2-Zellenblöcke um jede Zelle herum. Von dem 2x2-Block von [p[0][0], p[0][1], p[1][0], p[1][1]] hat nur p[0][1] Gas drin it, was bedeutet, dass dieser 2x2-Block im nächsten Zeitschritt zur Zelle c[0][0] mit Gas werden würde:
.O -> O ..
Ebenso im nächsten 2x2-Block rechts, bestehend aus [p[0][1], p[0][2], p[1][1], p[1][2]], zwei der enthaltenden Zellen haben Gas, also wird c[0][1] im nächsten Zustand des Gitters KEIN Gas haben:
O. -> . .O
Wenn man diesem Muster bis zu seinem Abschluss folgt, wird der aktuelle Zustand des Gitters c aus dem vorherigen Zustand p sein:
O.O .O. O.O
Beachten Sie, dass die resultierende Ausgabe 1 Zeile und Spalte weniger hat, da die unterste und ganz rechte Zelle keine Zelle darunter bzw. rechts davon hat.
Schreiben Sie eine Funktion
answer(g)
, wobeig
ein Array von booleschen Werten ist, die angeben, ob in jeder Zelle Gas vorhanden ist (der aktuelle Scan des Nebels), und geben Sie ein int mit der Anzahl möglicher vorheriger Zustände zurück, die nach 1 Zeitschritt zu diesem Gitter geführt haben könnten . Wenn der Funktion beispielsweise derc
obige aktuelle Zustand gegeben würde, würde sie ableiten, dass die möglichen vorherigen Zuständep
(oben angegeben) sowie ihre horizontalen und vertikalen Reflexionen waren, und würde 4 zurückgeben. Die Breite des Gitters liegt zwischen 3 und 50 einschließlich, und die Höhe des Rasters liegt zwischen 3 und 9 einschließlich. Die Antwort wird immer weniger als eine Milliarde (10^9) sein.Inputs: (boolean) g = [ [true, false, true], [false, true, false], [true, false, true] ] Output: (int) 4 Inputs: (boolean) g = [ [true, false, true, false, false, true, true, true], [true, false, true, false, false, false, true, false], [true, true, true, false, false, false, true, false], [true, false, true, false, false, false, true, false], [true, false, true, false, false, true, true, true] ] Output: (int) 254 Inputs: (boolean) g = [ [true, true, false, true, false, true, false, true, true, false], [true, true, false, false, false, false, true, true, true, false], [true, true, false, false, false, false, false, false, false, true], [false, true, false, false, false, false, true, true, false, false] ] Output: (int) 11567
Ich habe mich mit der Codierungstheorie befasst, glaube aber nicht, dass dies in eine dieser Kategorien fällt. Ich habe Optionen in der Bildverarbeitung mit Bitmaskierung und zellularen Automaten untersucht. Am nächsten bin ich einer Lösung gekommen, als ich die zellularen 2D-Automaten in der Margolus-Nachbarschaft erforscht habe. Da dies per Definition nicht reversibel ist, habe ich keine Lösung oder gar allgemeine Methode gefunden, um eine Lösung zu finden. Ich bin nur neugierig, wo ich suchen soll. Ich weiß, dass dies eine Antwort aus einem Bereich der Mathematik sein muss, aber es ähnelt nichts, was ich derzeit weiß.
dies ist eindeutig eine Frage eines zellularen Automaten (CA). Es handelt sich um die Berechnung der Anzahl von Urbildern einer bestimmten CA-Regel der Größe 2x2 innerhalb eines endlichen rechteckigen Arrays. Überlegen Sie, wie Sie versuchen würden, solche Vorbilder zu konstruieren. Die Eingabe (aktuelle Konfiguration) ist ein Array der Größe NxM mit den Werten 0 und 1 (true und false, wenn Sie es vorziehen). Also haben die Urbilder (dh Konfigurationen einen Zeitschritt in der Vergangenheit) die Größe (N+1)x(M+1) auch mit den Werten 0 und 1. Was ist nun die lokale Evolutionsregel von einer Konfiguration zur nächsten? Es hat damit zu tun, dass die Werte von vier benachbarten Zellen den neuen Wert einer Zelle bestimmen. Versuchen Sie, ein kleines Beispiel von Hand zu machen, z. B. angesichts der 3x3-Eingabe g aus Ihrem Beitrag. Können Sie Schritt für Schritt alle vier Urbildkonfigurationen finden? Überlegen Sie, was es bedeutet, einige der Zellen im Preimage anzugeben (z
Im Allgemeinen ist das Auffinden von Urbildern von CAs (oder sogar das Bestimmen ihrer Anzahl) ein schwieriges Problem, aber im Fall von endlichen Konfigurationen und dieser spezifischen Evolutionsregel kann ein Computer damit umgehen. Es gibt einen Brute-Force-Algorithmus, der für die angegebenen Eingabegrößen gut funktionieren sollte, aber es gibt auch einen clevereren/aufwändigeren Algorithmus, um viel Zeit zu sparen, insbesondere wenn Ihre Eingabe ein ziemlich langes, aber schmales Rechteck ist.
Ich hoffe, diese Kommentare geben Ihnen einige Ideen, wie Sie das Problem angehen können. Wenn Sie weitere Details benötigen, lassen Sie es mich wissen.
Postmorte
Kyle
Wirbel