Considere 30 a 30 matrizes de Toeplitz, cujas entradas são 0 ou 1. Esse desafio é um desafio simples de otimização para encontrar a matriz com o maior determinante possível.
Entrada Nenhuma
Saída Uma matriz Toeplitz de 30 por 30, cujas entradas são 0 ou 1, juntamente com seu determinante.
Pontuação O determinante da matriz que você produz. Se duas pessoas obtiverem a mesma pontuação, a primeira resposta vence.
Entradas principais até agora
- 65.455.857.159.975 em Matlab por Nick Alger (aproximadamente (10 ^ 13,8))
- 65,455,857,159,975 em Python por isaacg (aproximadamente 10 ^ 13,8)
- 39.994.961.721.988 no Mathematica até 2012rcampion (aproximadamente 10 ^ 13,6)
- 39.788.537.400.052 em R por Solha (aproximadamente 10 ^ 13,6)
- 8.363.855.075.832 em Python por Vioz- (aproximadamente 10 ^ 12.9)
- 6.984.314.690.903 em Julia por Alex A. (aproximadamente 10 ^ 12,8)
Restrições adicionais irritantes 16 de julho de 2015
Se possível, use aritmética arbitrária ou de alta precisão para calcular o determinante final da saída, para que possamos ter certeza do que realmente é (deve sempre ser um número inteiro). Em python, isso deve ser útil.
code-challenge
math
optimization
Comunidade
fonte
fonte
Respostas:
Matlab, 65.455.857.159.975 (10 ^ 13,8159)
O método consiste em subida gradiente no interior do cubo [0,1] ^ 59, com muitas suposições iniciais aleatórias e arredondamento no final para transformar tudo em zero e um.
Matriz:
Código:
A matemática por trás da computação do gradiente:
No produto interno elementar (isto é, produto interno Hilbert-Schmidt), o gradiente do determinante tem o representante G de Riesz dado por
G = det (A) A ^ (- *).
O mapa, J, das variáveis de otimização (valores diagonais) às matrizes de toeplitz é linear, de modo que o gradiente geral g é a composição desses dois mapas lineares,
g = (vec (G) * J) »,
onde vec () é o operador de vetorização que pega uma matriz e a desdobra em um vetor.
Subida gradiente interior:
Depois disso, tudo o que você precisa fazer é escolher um vetor inicial dos valores da diagonal w_0 e, para alguns tamanhos de etapas pequenos, a iteração alfa:
w_proposed = w_k + alfa * g_k
para obter w_ (k + 1), use w_proposed e trunque valores fora de [0,1] para 0 ou 1
repita até ficar satisfeito e arredonde tudo para 0 ou 1.
Meu resultado alcançou esse determinante depois de realizar aproximadamente 80.000 tentativas com suposições iniciais aleatórias uniformes.
fonte
Python 2 com Numpy, 65.455.857.159.975 ~ = 10 ^ 13,8
É uma escalada, o mais direto possível. Cálculo determinante final realizado usando o SymPy para fornecer um resultado exato. Todas as matrizes encontradas com esse determinante são circulantes.
Matrizes encontradas com esse determinante, dadas como valor da diagonal do canto inferior esquerdo para o canto superior direito:
O primeiro, como uma matriz:
Código:
fonte
R, 39 788 537 400 052
Aqui está minha tentativa de criar um algoritmo genético, mas apenas com a reprodução assexuada. Espero ter entendido o desafio corretamente. Edit: acelerou um pouco, tentou uma semente aleatória diferente e restringiu-se a 100 gerações.
Resultado:
fonte
Julia, 6.984.314.690.902.998
Isso apenas constrói 1.000.000 de matrizes Toeplitz aleatórias e verifica seus determinantes, registrando o máximo encontrado. Espero que alguém encontre uma solução analítica elegante, mas enquanto isso ...
Você pode ver a saída aqui .
fonte
Mathematica, 39.994.961.721.988 (10 ^ 13,60)
Um método simples de otimização de recozimento simulado; nenhuma otimização ou ajuste ainda.
Saída de amostra:
fonte
Python 2, 8 363 855 075 832
Isso tem uma estratégia muito básica, quase inexistente.
Aqui está a melhor matriz encontrada após ~ 5.580.000 tentativas:
Ainda correndo...
fonte