题目:计算函数f(x)= ∑ i = 1 n x i 2 \sum_{i=1}^{n}x_i^2 ∑i=1nxi2(-20≤ x i x_i xi≤20)的最小值,其中个体x的维数n=10。
解答:优化结束后,根据所得的图可知,优化后的结果为:x=[-0.0282 0.0046 -0.0158 0.0265 0.0345 0.0436 -0.0467 0.0006 0.0179 -0.0282],函数f(x)的最小值为8.156×10^-3。
Matlab代码:
%初始化
clear all; %清除所有变量
close all; %清图
clc; %清屏
D=10; %变量维数
Xs=20; %上限
Xx=-20; %下限
%冷却表参数
L=200; %马尔科夫链长度
K=0.998; %衰减参数
S=0.01; %步长因子
T=100; %初始温度
YZ=1e-8; %容差
P=0; %Metropolis过程中总接受点
%随机选定初值设定
PreX=rand(D,1)*(Xs-Xx)+Xx;
PreBestX=PreX;
PreX=rand(D,1)*(Xs-Xx)+Xx;
BestX=PreX;
%每迭代一次退火一次(降温),直到满足迭代条件为止
deta=abs(func1(BestX)-func1(PreBestX));
while (deta>YZ)&&(T>0.001)
T=K*T;
%在当前温度T下迭代次数
for i=1:L
%在此点附近随机选下一个点
NextX=PreX+S*(rand(D,1)*(Xs-Xx)+Xx);
%边界条件处理
for ii=1:D
if NextX(ii)>Xs|NextX(ii)<Xx
NextX(ii)=PreX(ii)+S*(rand*(Xs-Xx)+Xx);
end
end
%是否全局最优解
if(func1(BestX)>func1(NextX))
%保留上一个最优解
PreBestX=BestX;
%此为新的最优解
BestX=NextX;
end
%Metropolis过程
if(func1(PreX)-func1(NextX)>0)
%接受新解
PreX=NextX;
P=P+1;
else
changer=-1*(func1(NextX)-func1(PreX))/T;
p1=exp(changer);
%接受较差的解
if p1>rand
PreX=NextX;
P=P+1;
end
end
trace(P+1)=func1(BestX);
end
deta=abs(func1(BestX)-func1(PreBestX));
end
disp('最小值在点:');
BestX
disp('最小值为:');
func1(BestX)
figure
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%适应度函数
function result=func1(x);
summ=sum(x.^2);
result=summ;
end