Betrachten Sie 30 mal 30 Toeplitz- Matrizen, von denen alle Einträge 0 oder 1 sind. Diese Abfrage ist eine einfache Optimierungsabfrage, um die Matrix mit der größtmöglichen Determinante zu finden.
Eingabe Keine
Ausgabe A 30 mal 30 Toeplitz-Matrix, deren Einträge zusammen mit ihrer Determinante 0 oder 1 sind.
Ergebnis Die Determinante der von Ihnen ausgegebenen Matrix. Erhalten zwei Personen die gleiche Punktzahl, gewinnt die erste Antwort.
Bisher führende Einträge
- 65,455,857,159,975 in Matlab von Nick Alger (ungefähr (10 ^ 13.8)
- 65.455.857.159.975 in Python von Isaacg (ungefähr 10 ^ 13.8)
- 39,994,961,721,988 in Mathematica bis 2012rcampion (ungefähr 10 ^ 13,6)
- 39,788,537,400,052 in R von Flounderer (ungefähr 10 ^ 13.6)
- 8.363.855.075.832 in Python von Vioz- (ungefähr 10 ^ 12.9)
- 6,984,314,690,903 in Julia von Alex A. (ungefähr 10 ^ 12,8)
Ärgerliche zusätzliche Einschränkungen 16. Juli 2015
Wenn es überhaupt möglich ist, verwenden Sie bitte eine willkürliche oder hochgenaue Arithmetik, um die endgültige Ausgabedeterminante zu berechnen, damit wir sicher sein können, was es wirklich ist (es sollte immer eine ganze Zahl sein). In Python dies sollte hilfreich sein.
quelle
Antworten:
Matlab, 65.455.857.159.975 (10 ^ 13.8159)
Die Methode ist Steigungsanstieg im Inneren des Würfels [0,1] ^ 59 mit vielen zufälligen Anfangsschätzungen und Abrunden am Ende, um alles zu Nullen und Einsen zu machen.
Matrix:
Code:
Die Mathematik hinter der Berechnung des Gradienten:
Im elementweisen Innenprodukt (Hilbert-Schmidt-Innenprodukt) ist der Gradient der Determinante den Riesz-Repräsentanten G gegeben durch
G = det (A) A ^ (- *).
Die Karte J von den Optimierungsvariablen (Diagonalwerten) bis zu den Toeplitz-Matrizen ist linear, daher ist der Gesamtgradient g die Zusammensetzung dieser beiden linearen Karten.
g = (vec (G) * J) ',
Dabei ist vec () der Vektorisierungsoperator , der eine Matrix aufnimmt und in einen Vektor .
Innensteigung:
Danach müssen Sie nur noch einen Anfangsvektor mit diagonalen Werten w_0 auswählen und für einige kleine Schrittgrößen Alpha iterieren:
w_proposed = w_k + alpha * g_k
Um w_ (k + 1) zu erhalten, nehmen Sie w_proposed und kürzen Sie Werte außerhalb von [0,1] auf 0 oder 1
Wiederholen, bis Sie zufrieden sind. Runden Sie dann alles auf 0 oder 1.
Mein Ergebnis erreichte diese Determinante nach ungefähr 80.000 Versuchen mit einheitlichen zufälligen Anfangsschätzungen.
quelle
Python 2 mit Numpy, 65, 455, 857, 159, 975 ~ = 10 ^ 13,8
Dies ist Bergsteigen, so einfach wie möglich. Die endgültige Determinantenberechnung wurde mit SymPy durchgeführt, um ein genaues Ergebnis zu erhalten. Alle mit dieser Determinante gefundenen Matrizen sind zirkulierend.
Mit dieser Determinante gefundene Matrizen, angegeben als Wert der Diagonale von links unten nach rechts oben:
Der erste als Matrix:
Code:
quelle
R 39 788 537 400 052
Hier ist mein Versuch, einen genetischen Algorithmus zu erstellen, aber nur mit ungeschlechtlicher Fortpflanzung. Ich hoffe, ich habe die Herausforderung richtig verstanden. Bearbeiten: Beschleunigen Sie es ein wenig, probieren Sie einen anderen Zufallsstartwert aus und beschränken Sie sich auf 100 Generationen.
Ausgabe:
quelle
Julia, 6,984,314,690,902,998
Dabei werden nur 1.000.000 zufällige Toeplitz-Matrizen konstruiert und ihre Determinanten überprüft, wobei das maximal angetroffene Maximum aufgezeichnet wird. Hoffentlich hat jemand eine elegante analytische Lösung, aber in der Zwischenzeit ...
Sie können die Ausgabe hier anzeigen .
quelle
Mathematica, 39.994.961.721.988 (10 ^ 13.60)
Eine einfache simulierte Glühoptimierungsmethode; noch keine optimierung oder einstellung.
Beispielausgabe:
quelle
Python 2, 8 363 855 075 832
Dies hat eine sehr grundlegende, fast nicht existierende Strategie zur Folge.
Hier ist die beste Matrix, die nach ~ 5.580.000 Versuchen gefunden wurde:
Funktioniert immer noch...
quelle