Considérons 30 matrices Toeplitz 30 par 30 dont toutes les entrées sont 0 ou 1. Ce défi est un défi d'optimisation simple pour trouver la matrice avec le plus grand déterminant possible.
Entrée Aucune
Sortie d' une matrice Toeplitz 30 x 30 dont toutes les entrées sont 0 ou 1 avec son déterminant.
Score Le déterminant de la matrice que vous produisez. Si deux personnes obtiennent le même score, la première réponse l'emporte.
Principales entrées à ce jour
- 65.455.857.159.975 en Matlab par Nick Alger (environ (10 ^ 13.8)
- 65,455,857,159,975 en Python par isaacg (environ 10 ^ 13,8)
- 39 994 961 721 988 dans Mathematica d' ici 2012 camp (environ 10 ^ 13,6)
- 39,788,537,400,052 dans R par Flounderer (environ 10 ^ 13,6)
- 8,363,855,075,832 en Python par Vioz- (environ 10 ^ 12,9)
- 6,984,314,690,903 dans Julia par Alex A. (environ 10 ^ 12,8)
Contraintes supplémentaires ennuyeuses 16 juillet 2015
Si cela est possible, veuillez utiliser une arithmétique arbitraire ou de haute précision pour calculer le déterminant de sortie final afin que nous puissions être sûrs de ce qu'il est réellement (il devrait toujours être un entier). En python, cela devrait être utile.
la source
Réponses:
Matlab, 65,455,857,159,975 (10 ^ 13.8159)
La méthode est une ascension en gradient à l'intérieur du cube [0,1] ^ 59, avec de nombreuses suppositions initiales aléatoires, et un arrondi à la fin pour tout faire des zéros et des uns.
Matrice:
Code:
Les mathématiques derrière le calcul du gradient:
Dans le produit intérieur élément par élément (c'est-à-dire le produit intérieur de Hilbert-Schmidt), le gradient du déterminant a Riesz représentatif G donné par
G = det (A) A ^ (- *).
La carte, J, des variables d'optimisation (valeurs diagonales) aux matrices toeplitz est linéaire, donc le gradient global g est la composition de ces deux cartes linéaires,
g = (vec (G) * J) »,
où vec () est l' opérateur de vectorisation qui prend une matrice et la déplie en un vecteur.
Montée en dégradé intérieur:
Après cela, tout ce que vous avez à faire est de choisir un vecteur initial de valeurs diagonales w_0, et pour certaines petites étapes, itérer alpha:
w_proposé = w_k + alpha * g_k
pour obtenir w_ (k + 1), prendre w_proposed et tronquer les valeurs en dehors de [0,1] à 0 ou 1
répétez jusqu'à ce que vous soyez satisfait, puis arrondissez le tout à 0 ou 1.
Mon résultat a atteint ce déterminant après avoir fait environ 80 000 essais avec des hypothèses initiales aléatoires uniformes.
la source
Python 2 avec Numpy, 65 455 857 159 975 ~ = 10 ^ 13,8
C'est de l'escalade, aussi simple que possible. Calcul du déterminant final effectué à l'aide de SymPy pour obtenir un résultat exact. Toutes les matrices trouvées avec ce déterminant sont circulantes.
Matrices trouvées avec ce déterminant, données comme valeur de diagonale du bas à gauche au coin supérieur droit:
Le premier, sous forme de matrice:
Code:
la source
R, 39 788 537 400 052
Voici ma tentative de faire un algorithme génétique mais uniquement avec une reproduction asexuée. J'espère avoir bien compris le défi. Edit: accéléré un peu, essayé une graine aléatoire différente et limitée à 100 générations.
Production:
la source
Julia, 6,984,314,690,902,998
Cela construit juste 1 000 000 de matrices Toeplitz aléatoires et vérifie leurs déterminants, enregistrant le maximum rencontré. J'espère que quelqu'un trouvera une solution analytique élégante, mais en attendant ...
Vous pouvez voir la sortie ici .
la source
Mathematica, 39 994 961 721 988 (10 ^ 13,60)
Une méthode d'optimisation de recuit simulé simple; pas encore d'optimisation ou de réglage.
Exemple de sortie:
la source
Python 2, 8 363 855 075 832
Cela implique une stratégie très basique, presque inexistante.
Voici la meilleure matrice trouvée après environ 5 580 000 essais:
Cours toujours...
la source