function [ff,xx]=simulated_annealing(x0,fun,maxit);
%  function [ff,xx]=simulated_annealing(x0,fun);
% 	Eingabe:	x0 - Startwert
%			fun - Funktionsname als String
%			maxit - maximale Anzahl Iterationen
%	Rueckgabe:	xx - L"osung
%			ff - Funktionswert fun(xx)
%

rate = 0.5; % kann veraendert werden

xk = x0;
fk = feval(fun, xk);		% Funktionsaufruf

II=0;
while(II<maxit) 
 II=II+1;
% hier kommt der Algorithmus rein. Fuer Test- und Demonstrationszwecke
% ist schon ein einfacher Suchalgorithmus implementiert. Dieser ist noch
% zu ergaenzen!


 xn = mutate(xk, rate);		% Mutation
 fn = feval(fun, xn);		% Funktionsaufruf

 % ausgabe? fprintf(' %e %e %e\n', xn(1),xn(2),fn)  ;

 if (fn<fk) % es werden nur bessere akzeptiert
  xk = xn;
  fk = fn;
 end  




end


% Rueckgabe
ff=fk;
xx=xk;




function xneu=mutate(xalt, rate);
%	Eingabe:	xalt - gegebener Punkt
%			rate - Mutationsrate
%	Rueckgabe:	xneu - neuer Punkt :)
%
%	Eine zufaellig gewaehlte Komponente von xakt wird wie folgt mutiert:
%		xneu(i) = xalt(i) + Z,
%	dabei ist Z eine im Intervall [-rate,+rate] gleichverteilte Zufallszahl.

N = length(xalt);
i = floor( N * rand) + 1; % die ite komponente von xalt wird mutiert

xneu = xalt;
xneu(i) = xalt(i) + (2*rand-1) * rate;



