你好,这个程序已经可以运行了,不过为啥输出结果全是0 啊。您帮我看看。
clc;
clear;
close all;
Lk=1000; %马克链长1000
t=10; %初始温度10
tf=0.001; %最低温度0.001
a=0.9; %温度系数0.9
k=1;
a1=[8 9 10 15 15 17 15 18];
b1=[14 13 16 17 18 11 11 12]; %初始点(a1,b1)
while t>tf
for m=1:Lk
f(1)=vfunc([],[],[],a1,b1); %f(1)为初始点的函数值
a2=a1.*(1-0.9^t);
b2=b1.*(1-0.9^t); %产生新解(a2,b2)
f(2)=vfunc([],[],[],a2,b2); %f(2)为新解的函数值
if f(2)-f(1)<0 %如果新解函数值比初始解函数值小
a1=a2;
b1=b2; %用新解取代旧解
elseif exp((f(1)-f(2))/t)>rand %准则接受
a1=a2;
end
temp{m,1}=a1; %将a(1)赋值到temp的m行1列
temp{m,2}=b1; %将b(1)赋值到temp的m行2列
temp{m,3}=vfunc([],[],[],a1,b1); %将最小函数值赋值到temp的m行3列
end
[fmin,i]=min(cell2mat(temp(:,3))); %找出函数值的最小值且找到最小值所在的行数
a1=temp{i,1}; %找出最小值对应的a
b1=temp{i,2}; %找出最小值对应的b
ret1{k}=a1; %把a赋值给rek1变量
ret2{k}=b1; %把b赋值给rek2变量
se(k)=fmin; %把函数值赋值给se变量
k=k+1;
t=t*a; %降温
end
[fmin I]=min(se); %找出函数值的最小值
I %找出函数值最小值所在的行
a1=ret1(I); %将对应最小值的a找出
b1=ret2(I); %将对应最小值的b找出
a1 %输出a
b1 %输出b
fmin%输出最小函数值
tt=1:k-1;
plot(tt,se)
title('模拟退火算法求解二维Rosenbrock函数最优值');
xlabel('迭代次数');
ylabel('各代历史最优解');
函数为
function [s]=vfunc(V,Q,R,a,b)
t1=zeros(size(Q));
t2=zeros(size(R));
for i=1:8
t1=t1+a(i)*Q.^(0.2*(i-1));
t2=t2+b(i)*R.^(-0.1*(i-1));
end
v=Q.^0.3.*R.^(-0.1).*t1.*t2;
s=sum((V-v).^2);
Q=[3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2];
R=[22 24.2 29.8 21.9 24.1 29.7 21.7 23.9 29.5 21.5 23.7 29.4 21 24 30 21 23 29 21];
V=[0.86646319 0.804096194 0.682383301 1.561431619 0.778830951 0.711086254 1.419960105 0.984476313 0.864576596 1.745105103 1.343163002 1.296263098 2.02640873 1.380744198 1.18635545 2.97598251 1.768937362 1.722728725 1.302980787];
输出结果全为0