Matlab, 65 455 857 159 975 (10 ^ 13,8159)
Метод - градиентное восхождение во внутренней части куба [0,1] ^ 59, со многими случайными начальными догадками и округлением в конце, чтобы получить все нули и единицы.
Матрица:
0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0
0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1
1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1
1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1
1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0
0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1
1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1
1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1
1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0
0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1
1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0
0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0
0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1
1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0
0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0
0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1
1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0
0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1
1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1
1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0
0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1
1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0
0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0
0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0
0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0
0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1
1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1
1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1
1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0
Код:
% Toeplitz 0-1 determinant optimization
n = 30;
m = n + n-1;
toeplitz_map = @(w) toeplitz(w(n:-1:1), w(n:end));
objective = @(w) det(toeplitz_map(w));
detgrad = @(A) det(A)*inv(A)';
toeplitz_map_matrix = zeros(n^2,m);
for k=1:m
ek = zeros(m,1);
ek(k) = 1;
M = toeplitz_map(ek);
toeplitz_map_matrix(:,k) = M(:);
end
gradient = @(w) (reshape(detgrad(toeplitz_map(w)),1,n^2)*...
toeplitz_map_matrix)';
%check gradient with finite differences
w = randn(m,1);
dw = randn(m,1);
s = 1e-6;
g_diff = (objective(w+s*dw) - objective(w))/s;
g = gradient(w)'*dw;
grad_err = (g - g_diff)/g_diff
warning('off')
disp('multiple gradient ascent:')
w_best = zeros(m,1);
f_best = 0;
for trial=1:100000
w0 = rand(m,1);
w = w0;
alpha0 = 1e-5; %step size
for k=1:20
f = objective(w);
g = gradient(w);
alpha = alpha0;
for hh=1:100
w2 = w + alpha*g;
f2 = objective(w2);
if f2 > f
w = w2;
break;
else
alpha = alpha/2;
end
end
buffer = 1e-4;
for jj=1:m
if (w(jj) > 1)
w(jj) = 1 - buffer;
elseif (w(jj) < 0)
w(jj) = 0 + buffer;
end
end
end
w = round(w);
f = objective(w);
if f > f_best
w_best = w;
f_best = f;
end
disp(trial)
disp(f_best)
disp(f)
end
M = toeplitz_map(w_best);
Математика за вычислением градиента:
В поэлементном внутреннем произведении (т. Е. Внутреннем произведении Гильберта-Шмидта) у градиента определителя есть представитель Рисса 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 испытаний с одинаковыми случайными начальными догадками.