function [Hi,i] = sa(Hval)
%
% sa(@(i) H(i,m))
%
epsilon = 20;
state = rand('seed');
m = Hval(0);
rand('seed',state);
a = ones(1,m)/m;
% primo stato random
i = randdisc(a);
Hi = Hval(i);
counterperm = 1;
counterstati = 1; % conta gli stati visitati (NON gli stati diversi visitati)
while (counterperm < 20)
  j = randdisc(a);
  counterstati = counterstati+1;
  Hj = Hval(j);
  if (Hj <= Hi)
% trovato uno stato minore    
    if (i == j)
% nessun cambiamento di stato
      counterperm = counterperm+1;
    else  
% cambiamento di stato
      counterperm = 0;
      i = j;
      Hi = Hj;
    end
  else
    p = exp(-(Hj-Hi)/epsilon);
    va = randdisc([p,1-p]);
    if (va == 1)
% cambiamento di stato
      i = j;
      Hi = Hj;
      counterperm = 0;
    else
% nessun cambiamento
      counterperm = counterperm+1;
    end
  end
  plot(1:m,Hval(1:m),[i,i],[-50,Hi],'r')
  title(sprintf('epsilon = %.2e',epsilon))
  axis([0,m,-50,50])
  pause(0.1)
  epsilon = epsilon/1.01;
end
counterstati

