function [Hi,i] = sa(m)
Hval = @(i) H(m,i);
epsilon = 1;
%Q = randstocsym(m);
Q = ones(m)/m;
a = ones(1,m)/m;
% primo stato random
i = randdisc(a);
Hi = Hval(i);
counterstati = 1;
counterperm = 1;
while (counterperm < 20)
  j = randdisc(Q(i,:));
  Hj = Hval(j);
  counterstati = counterstati+1;
  if (Hj <= Hi)
% trovato uno stato minore    
    if (j == i)
% nessun cambiamento di stato
      counterperm = counterperm+1;
    else  
% cambiamento di stato
      counterperm = 1;
    end
    i = j;
    Hi = Hj;
  else
    p = exp(-(Hj-Hi)/epsilon);
    va = randdisc([p,1-p]);
    if (va == 1)
% cambiamento di stato
      i = j;
      Hi = Hj;
      counterperm = 1;
    else
% nessun cambiamento
      counterperm = counterperm+1;
    end
  end
  epsilon = epsilon/1.01;
end
counterstati

