Rozważ 30 na 30 macierzy Toeplitza, których wszystkie wpisy to 0 lub 1. To wyzwanie jest prostym wyzwaniem optymalizacyjnym w celu znalezienia macierzy z największą możliwą determinantą.
Brak danych wejściowych
Wyjście A 30 na 30 Macierz Toeplitza, z których wszystkie są równe 0 lub 1 wraz z wyznacznikiem.
Wynik Wyznacznik macierzy, którą wyprowadzasz. Jeśli dwie osoby otrzymają ten sam wynik, pierwsza odpowiedź wygrywa.
Dotychczasowe wpisy
- 65 455 857,159,975 w Matlabie autorstwa Nicka Algera (z grubsza (10 ^ 13,8)
- 65 455 857,159,975 w Pythonie autor: isaacg (około 10 ^ 13,8)
- 39 994 961 772 988 w Mathematica do 2012 rcampion (około 10 ^ 13,6)
- 39 788,537,400,052 in R autor Flounderer (około 10 ^ 13,6)
- 8 363 855 075 832 w Pythonie autor: Vioz- (około 10 ^ 12,9)
- 6,984,314,690,903 w Julii przez Alexa A. (około 10 ^ 12,8)
Irytujące dodatkowe ograniczenia 16 lipca 2015 r
Jeśli jest to w ogóle możliwe, użyj arytmetyki arbitralnej lub o wysokiej precyzji, aby obliczyć ostateczną determinantę wyjściową, abyśmy mogli być pewni, co to naprawdę jest (zawsze powinna być liczbą całkowitą). W pythonie powinno to być pomocne.
code-challenge
math
optimization
Społeczność
źródło
źródło
Odpowiedzi:
Matlab, 65 455 857,159,975 (10 ^ 13,8159)
Metoda polega na wznoszeniu się gradientu we wnętrzu sześcianu [0,1] ^ 59, z wieloma losowymi początkowymi domysłami i zaokrąglaniu na końcu, aby wszystkie zera i jedynki.
Matryca:
Kod:
Matematyka obliczania gradientu:
W produkcie elementarnym wewnętrznym (Tj., Produkt wewnętrzny Hilberta-Schmidta) gradient wyznacznika ma reprezentatywność Riesz G podaną przez
G = det (A) A ^ (- *).
Mapa J od zmiennych optymalizacyjnych (wartości diagonalnych) do macierzy toeplitz jest liniowa, więc ogólny gradient g jest kompozycją tych dwóch map liniowych,
g = (vec (G) * J) ”,
gdzie vec () jest operatorem wektoryzacji, który pobiera macierz i rozwija ją do wektora.
Wejście wewnętrzne gradientu:
Po tym wszystkim, co musisz zrobić, to wybrać początkowy wektor wartości przekątnych w_0, a dla niektórych małych stopni kroku iteracja alfa:
w_proposed = w_k + alpha * g_k
aby uzyskać w_ (k + 1), weź w_proposed i skróć wartości poza [0,1] do 0 lub 1
powtarzaj, aż będziesz zadowolony, następnie zaokrąglij wszystko do 0 lub 1.
Mój wynik osiągnął ten wyznacznik po przeprowadzeniu około 80 000 prób z jednolitymi losowymi domysłami.
źródło
Python 2 z Numpy, 65 455 857,159,975 ~ = 10 ^ 13,8
To wspinaczka pod górę, tak prosta, jak to tylko możliwe. Ostateczne obliczenie determinanty wykonane przy użyciu SymPy w celu uzyskania dokładnego wyniku. Wszystkie macierze znalezione z tym wyznacznikiem są w obiegu.
Macierze znalezione z tą determinantą, podane jako wartość przekątnej od dolnego lewego do górnego prawego:
Pierwszy, jako macierz:
Kod:
źródło
R, 39 788 537 400 052
Oto moja próba wykonania algorytmu genetycznego, ale tylko z rozmnażaniem bezpłciowym. Mam nadzieję, że poprawnie zrozumiałem wyzwanie. Edycja: przyspieszyłem trochę, wypróbowałem inne losowe ziarno i ograniczono do 100 pokoleń.
Wynik:
źródło
Julia, 6,984,314,690,902,998
To po prostu konstruuje 1 000 000 losowych macierzy Toeplitza i sprawdza ich determinanty, rejestrując maksimum napotkane. Mam nadzieję, że ktoś wymyśli eleganckie rozwiązanie analityczne, ale tymczasem ...
Możesz wyświetlić wyniki tutaj .
źródło
Mathematica, 39 994,961,721,988 (10 ^ 13,60)
Prosta metoda optymalizacji symulowanego wyżarzania; brak optymalizacji lub strojenia jeszcze.
Przykładowe dane wyjściowe:
źródło
Python 2, 8 363 855 075 832
W grę wchodzi bardzo podstawowa, prawie nieistniejąca strategia.
Oto najlepsza macierz, jaką znalazła po ~ 5 580 000 próbach:
Nadal biegnie...
źródło