【MATLAB】模拟退火算法使用示例

求解以下函数极大值

z = − x 2 + 2 x − 2 y 2 − y + 10 z = -x^2 + 2x - 2y^2 - y + 10 z=x2+2x2y2y+10

在这里插入图片描述

% 定义目标函数
fun = @(x,y) -x^2 + 2*x - 2*y^2 - y + 10;

% 定义初始温度、终止温度和温度下降率
Tstart = 1000;  % 初始温度
Tend = 1e-8;    % 终止温度
alpha = 0.99;   % 温度下降率

% 定义搜索区间和步长
xmin = -10;
xmax = 10;
ymin = -10;
ymax = 10;
step = 0.1;

% 初始化当前状态和当前能量
x0 = xmin + (xmax - xmin)*rand();   % 随机生成初始状态
y0 = ymin + (ymax - ymin)*rand();
z0 = fun(x0,y0);                    % 计算初始能量
x = x0;
y = y0;
z = z0;

% 初始化最优状态和最优能量
xbest = x;
ybest = y;
zbest = z;

% 进入模拟退火主循环
while Tstart > Tend
    % 在邻域内随机生成新状态
    xnew = x + step*(rand()*2 - 1);
    ynew = y + step*(rand()*2 - 1);
    
    % 计算新状态的能量
    znew = fun(xnew,ynew);
    
    % 判断是否接受新状态
    delta = znew - z;
    if delta > 0
        % 如果新状态能量更优,则直接接受
        x = xnew;
        y = ynew;
        z = znew;
        
        % 如果新状态比当前最优状态更优,则更新最优状态
        if z > zbest
            xbest = x;
            ybest = y;
            zbest = z;
        end
    else
        % 如果新状态能量更差,则以一定概率接受
        p = exp(delta/Tstart);
        if rand() < p
            x = xnew;
            y = ynew;
            z = znew;
        end
    end
    % 降低温度
    Tstart = Tstart*alpha;
end
% 图像可视化
fsurf(fun)
hold on
plot3(xbest,ybest,zbest,'r*')
% 输出结果
fprintf('最优解:x = %f, y = %f, z = %f\n',xbest,ybest,zbest);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值