Considere las matrices Toeplitz de 30 por 30, todas cuyas entradas son 0 o 1. Este desafío es un simple desafío de optimización para encontrar la matriz con el mayor determinante posible.
Entrada Ninguno
Salida de una matriz de Toeplitz de 30 por 30, todas cuyas entradas son 0 o 1 junto con su determinante.
Puntuación El determinante de la matriz que genera. Si dos personas obtienen el mismo puntaje, gana la primera respuesta.
Entradas principales hasta ahora
- 65,455,857,159,975 en Matlab por Nick Alger (aproximadamente (10 ^ 13.8)
- 65,455,857,159,975 en Python por isaacg (aproximadamente 10 ^ 13.8)
- 39,994,961,721,988 en Mathematica para 2012 Arcampion (aproximadamente 10 ^ 13.6)
- 39,788,537,400,052 en R por Flounderer (aproximadamente 10 ^ 13.6)
- 8.363.855.075.832 en Python por Vioz- (aproximadamente 10 ^ 12.9)
- 6,984,314,690,903 en Julia de Alex A. (aproximadamente 10 ^ 12.8)
Restricciones adicionales molestas 16 de julio de 2015
Si es posible, utilice una aritmética arbitraria o de alta precisión para calcular el determinante de salida final para que podamos estar seguros de lo que realmente es (siempre debe ser un número entero). En python esto debería ser útil.
fuente
Respuestas:
Matlab, 65,455,857,159,975 (10 ^ 13.8159)
El método es ascenso en gradiente en el interior del cubo [0,1] ^ 59, con muchas conjeturas iniciales aleatorias, y redondeando al final para hacer que todo sea ceros y unos.
Matriz:
Código:
Las matemáticas detrás de calcular el gradiente:
En el producto interno por elementos (es decir, producto interno de Hilbert-Schmidt), el gradiente del determinante tiene un representante de Riesz G dado por
G = det (A) A ^ (- *).
El mapa, J, desde las variables de optimización (valores diagonales) hasta las matrices de toeplitz es lineal, por lo que el gradiente general g es la composición de estos dos mapas lineales,
g = (vec (G) * J) ',
donde vec () es el operador de vectorización que toma una matriz y la despliega en un vector.
Ascenso de gradiente interior:
Después de esto, todo lo que tiene que hacer es elegir un vector inicial de valores diagonales w_0, y para algunos pasos pequeños, alfa iterar:
w_proposed = w_k + alpha * g_k
para obtener w_ (k + 1), tome w_proposed y trunque valores fuera de [0,1] a 0 o 1
repite hasta que estés satisfecho, luego redondea todo a 0 o 1.
Mi resultado logró este determinante después de hacer aproximadamente 80,000 ensayos con conjeturas iniciales aleatorias uniformes.
fuente
Python 2 con Numpy, 65,455,857,159,975 ~ = 10 ^ 13.8
Esta es la escalada, tan simple como puede ser. Cálculo determinante final realizado utilizando SymPy para obtener un resultado exacto. Todas las matrices encontradas con este determinante son circulantes.
Matrices encontradas con este determinante, dado como valor de diagonal desde la parte inferior izquierda a la superior derecha:
El primero, como matriz:
Código:
fuente
R, 39 788 537 400 052
Aquí está mi intento de hacer un algoritmo genético pero solo con reproducción asexual. Espero haber entendido el desafío correctamente. Editar: aceleré un poco, probé una semilla aleatoria diferente y restringí a 100 generaciones.
Salida:
fuente
Julia, 6,984,314,690,902.998
Esto solo construye 1,000,000 matrices de Toeplitz aleatorias y verifica sus determinantes, registrando el máximo encontrado. Esperemos que alguien presente una solución analítica elegante, pero mientras tanto ...
Puede ver la salida aquí .
fuente
Mathematica, 39,994,961,721,988 (10 ^ 13.60)
Un método de optimización de recocido simulado simple; Sin optimización ni ajuste todavía.
Salida de muestra:
fuente
Pitón 2, 8 363 855 075 832
Esto implica una estrategia muy básica, casi inexistente.
Aquí está la mejor matriz que encontró después de ~ 5,580,000 intentos:
Sigue corriendo...
fuente