Matlab, 65,455,857,159,975 (10 ^ 13.8159)
La méthode est une ascension en gradient à l'intérieur du cube [0,1] ^ 59, avec de nombreuses suppositions initiales aléatoires, et un arrondi à la fin pour tout faire des zéros et des uns.
Matrice:
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
Code:
% 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);
Les mathématiques derrière le calcul du gradient:
Dans le produit intérieur élément par élément (c'est-à-dire le produit intérieur de Hilbert-Schmidt), le gradient du déterminant a Riesz représentatif G donné par
G = det (A) A ^ (- *).
La carte, J, des variables d'optimisation (valeurs diagonales) aux matrices toeplitz est linéaire, donc le gradient global g est la composition de ces deux cartes linéaires,
g = (vec (G) * J) »,
où vec () est l' opérateur de vectorisation qui prend une matrice et la déplie en un vecteur.
Montée en dégradé intérieur:
Après cela, tout ce que vous avez à faire est de choisir un vecteur initial de valeurs diagonales w_0, et pour certaines petites étapes, itérer alpha:
w_proposé = w_k + alpha * g_k
pour obtenir w_ (k + 1), prendre w_proposed et tronquer les valeurs en dehors de [0,1] à 0 ou 1
répétez jusqu'à ce que vous soyez satisfait, puis arrondissez le tout à 0 ou 1.
Mon résultat a atteint ce déterminant après avoir fait environ 80 000 essais avec des hypothèses initiales aléatoires uniformes.