Рассмотрим 30 на 30 матриц Теплица, все записи которых равны 0 или 1. Эта задача представляет собой простую задачу оптимизации, чтобы найти матрицу с наибольшим возможным определителем.
Вход Нет
Выведите матрицу Теплица 30 на 30, все записи которой равны 0 или 1 вместе с определителем.
Оценка Определитель матрицы, которую вы выводите. Если два человека получают одинаковый результат, выигрывает первый ответ.
Ведущие записи пока
- 65 455 857 159 975 в Matlab Ника Алжера (примерно (10 ^ 13,8)
- 65 455 857 159 975 в Python от Исаака (примерно 10 ^ 13,8)
- 39,994,961,721,988 в Mathematica к 2012 году (примерно 10 ^ 13,6)
- 39,788,537,400,052 в R от Flounderer (примерно 10 ^ 13,6)
- 8,363,855,075,832 в Python от Vioz- (примерно 10 ^ 12,9)
- 6 984 314 690 903 в Юлии Алексеем А. (примерно 10 ^ 12,8)
Раздражают дополнительные ограничения 16 июля 2015
Если это вообще возможно, пожалуйста, используйте произвольную арифметику или прецизионную арифметику для вычисления окончательного выходного определителя, чтобы мы могли быть уверены, что это на самом деле (оно всегда должно быть целым числом). В питоне это должно быть полезно.
источник
Ответы:
Matlab, 65 455 857 159 975 (10 ^ 13,8159)
Метод - градиентное восхождение во внутренней части куба [0,1] ^ 59, со многими случайными начальными догадками и округлением в конце, чтобы получить все нули и единицы.
Матрица:
Код:
Математика за вычислением градиента:
В поэлементном внутреннем произведении (т. Е. Внутреннем произведении Гильберта-Шмидта) у градиента определителя есть представитель Рисса G, определяемый как
G = det (A) A ^ (- *).
Карта J от переменных оптимизации (диагональных значений) до матриц Теплица является линейной, поэтому общий градиент g представляет собой композицию этих двух линейных карт,
g = (vec (G) * J) ',
где vec () - оператор векторизации, который берет матрицу и разворачивает ее в вектор.
Внутренний градиент подъема:
После этого все, что вам нужно сделать, это выбрать начальный вектор диагональных значений w_0, и для некоторых маленьких размеров шага альфа-итерация:
w_proposed = w_k + alpha * g_k
чтобы получить w_ (k + 1), возьмите w_proposed и обрежьте значения вне [0,1] до 0 или 1
повторите до тех пор, пока не будете удовлетворены, затем округлите все до 0 или 1.
Мой результат достиг этой детерминанты после примерно 80 000 испытаний с одинаковыми случайными начальными догадками.
источник
Python 2 с Numpy, 65 455 857 159 975 ~ = 10 ^ 13,8
Это восхождение на гору, настолько простое, насколько это возможно. Окончательный расчет определителя выполняется с использованием SymPy, чтобы получить точный результат. Все матрицы, найденные с этим определителем, циркулянтны.
Матрицы, найденные с этим определителем, даны как значение диагонали снизу слева вверху справа:
Первый, как матрица:
Код:
источник
R 39 788 537 400 052
Вот моя попытка сделать генетический алгоритм, но только с бесполым размножением. Надеюсь, я правильно понял задачу. Изменить: немного ускорил, попробовал другое случайное семя, и ограничен до 100 поколений.
Выход:
источник
Юлия, 6,984,314,690,902,998
Это просто создает 1 000 000 случайных тёплицевых матриц и проверяет их детерминанты, записывая максимальное количество обнаруженных. Надеюсь, кто-нибудь придумает элегантное аналитическое решение, а пока ...
Вы можете просмотреть вывод здесь .
источник
Mathematica, 39,994,961,721,988 (10 ^ 13,60)
Простой метод имитации отжига; нет оптимизации или настройки пока.
Пример вывода:
источник
Python 2, 8 363 855 075 832
Это очень простая, почти несуществующая стратегия.
Вот лучшая матрица, найденная после ~ 5 580 000 попыток:
Все еще работает...
источник