Optimization 我的模拟退火实现有什么问题?

Optimization 我的模拟退火实现有什么问题?,optimization,octave,simulated-annealing,Optimization,Octave,Simulated Annealing,我写过模拟退火算法的倍频程实现,甚至很难,我试图改变每一个参数,但我无法用这种方法找到全局最小值,这就是该算法的用法。请帮我找到问题所在 clear; clc; T = 10000; L = 10000; r = 100; a = 0.95; function y = f(x1, x2) y = -(x2 + 47).*sin(sqrt(abs(x1./2+(x2+47)))) - x1.*sin(sqrt(abs(x1-(x2+47)))); end x0 = -512+ran

我写过模拟退火算法的倍频程实现,甚至很难,我试图改变每一个参数,但我无法用这种方法找到全局最小值,这就是该算法的用法。请帮我找到问题所在

clear;
clc;

T = 10000; 
L = 10000; 
r = 100; 
a = 0.95;

function y = f(x1, x2)
  y = -(x2 + 47).*sin(sqrt(abs(x1./2+(x2+47)))) - x1.*sin(sqrt(abs(x1-(x2+47))));
end

x0 = -512+rand(1, 2)*1024;

fl = [];
x = [];
y = [];

for i = 0:L
  x1 = [-1000 1000]
  while (x1(1) > 512 || x1(1) < -512) || (x1(2) > 512 || x1(2) < -512) 
    x1 = x0 + r*(2*rand(1,2)-1)*sqrt(T); 
  end
  df = f(x1(1), x1(2)) - f(x0(1), x0(2)); 
  if df < 0
    x0 = x1;
  elseif rand() < exp(-df/T)
    x0 = x1;
  endif
  T = a*T;
  fl = [fl; f(x0(1), x0(2))];
  x = [x; x0(1)];
  y = [y; x0(2)];
endfor

figure;
plot(0:L,fl);

figure;
[X, Y] = meshgrid(-512:.5:512);
Z = -(Y + 47).*sin(sqrt(abs(X./2+(Y+47)))) - X.*sin(sqrt(abs(X-(Y+47))));
contour(X, Y, Z);

hold on;

plot(x, y, 'k', 'LineWidth', 2);

清晰;
clc;
T=10000;
L=10000;
r=100;
a=0.95;
函数y=f(x1,x2)
y=-(x2+47)。*sin(sqrt(abs(x1./2+(x2+47)))-x1.*sin(sqrt(abs(x1-(x2+47)));
结束
x0=-512+rand(1,2)*1024;
fl=[];
x=[];
y=[];
对于i=0:L
x1=[-1000]
而(x1(1)>512 | | x1(1)<-512)| |(x1(2)>512 | | x1(2)<-512)
x1=x0+r*(2*兰德(1,2)-1)*sqrt(T);
结束
df=f(x1(1),x1(2))-f(x0(1),x0(2));
如果df<0
x0=x1;
elseif rand()
您在调试器中逐步完成了算法吗?@CrisLuengo是的,除了最终结果之外,一切似乎都很好。该算法找到的是最小值,而不是全局值。对于50次尝试,它只找到了一次正确的结果,但它被告知每5次尝试至少应该找到4次。您的步长会迅速减小,对于大多数步骤(超过80%),x1和x0之间的差值为0。在上一次迭代后,可以对
r*sqrt(T)
的幅值进行加或减,即
4.0447179919277E-108
。这可能是一个好主意,规范化您的退火,并将第一步大小和最后一步大小作为参数。这使得它很容易保持在相关的范围内。即使你不改变你的数学来获得这两个参数,在第一步和最后一步打印
r*sqrt(t)
。应该从512左右开始。最后一步的合理选择是比预期精度小10到100倍。@Daniel谢谢你的回答。现在效果更好了,但成功率仍在50%左右。