模拟退火入门(求最值,解规划问题)

您所在的位置:网站首页 二次函数y的最大值怎么求b 模拟退火入门(求最值,解规划问题)

模拟退火入门(求最值,解规划问题)

2024-07-10 21:29| 来源: 网络整理| 查看: 265

目录 求混合三角函数最值求多元函数最值书店买书问题模拟退火需要注意的点

参考学习资料:

数学建模清风第二次直播:模拟退火算法

求混合三角函数最值

求解函数 y = 11 ∗ s i n ( x ) + 7 ∗ c o s ( 5 ∗ x ) y = 11*sin(x) + 7*cos(5*x) y=11∗sin(x)+7∗cos(5∗x)在 [ − 3 , 3 ] [-3,3] [−3,3]内的最大值

思路:

给出函数表达式绘制函数的图形参数初始化随机生成一个初始解定义一些保存中间过程的量,方便输出结果和画图模拟退火过程画出每次迭代后找到的最大y的图形

技巧:

randn:产生均值为0,方差 σ 2 σ^2 σ2 = 1,标准差 σ σ σ = 1的正态分布的随机数或矩阵的函数

scatter是绘制二维散点图的函数,设置其返回值为 h h h 可以得到图形的句柄,方便未来我们对其位置进行更新

代码:

Obj_fun1.m

function y = Obj_fun1(x) y = 11*sin(x) + 7*cos(5*x); end

main.m

tic clear; clc x = -3:0.1:3; y = 11*sin(x) + 7*cos(5*x); figure plot(x,y,'b-') hold on narvs = 1; % 变量个数 T0 = 100; % 初始温度 T = T0; % 迭代中温度会发生改变,第一次迭代时温度就是T0 maxgen = 200; % 最大迭代次数 Lk = 100; % 每个温度下的迭代次数 alfa = 0.95; % 温度衰减系数 x_lb = -3; % x的下界 x_ub = 3; % x的上界 x0 = zeros(1,narvs); for i = 1: narvs x0(i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(1); end y0 = Obj_fun1(x0); h = scatter(x0,y0,'*r'); max_y = y0; % 初始化最优解 MAXY = zeros(maxgen,1); % 记录每一次外层循环结束后找到的max for iter = 1 : maxgen for i = 1 : Lk y = randn(1,narvs); z = y / sqrt(sum(y.^2)); % !!根据新解的产生规则计算z x_new = x0 + z*T; % 根据新解的产生规则计算x_new的值 % !!如果这个新解的位置超出了定义域,就对其进行调整 for j = 1: narvs if x_new(j) x_ub(j) r = rand(1); x_new(j) = r*x_ub(j)+(1-r)*x0(j); end end x1 = x_new; y1 = Obj_fun1(x1); if y1 > y0 x0 = x1; % 更新当前解为新解 y0 = y1; else p = exp(-(y0 - y1)/T); % 根据Metropolis准则计算一个概率 if rand(1) max_y max_y = y0; best_x = x0; end end MAXY(iter) = max_y; % 保存本轮外循环结束后找到的最大的y T = alfa*T; % 温度下降 pause(0.1) % 暂停一段时间(单位:秒)后再接着画图 h.XData = x0; % 更新散点图句柄的x轴的数据(此时解的位置在图上发生了变化) h.YData = Obj_fun1(x0); % 更新散点图句柄的y轴的数据(此时解的位置在图上发生了变化) end disp('最佳的位置是:'); disp(best_x) disp('此时最优值是:'); disp(max_y) pause(0.05) h.XData = []; h.YData = []; % 将原来的散点删除 scatter(best_x,max_y,'*r'); % 在最大值处重新标上散点 title(['模拟退火找到的最大值为', num2str(max_y)]) % 加上图的标题 figure plot(1:maxgen,MAXY,'b-'); xlabel('迭代次数'); ylabel('y的值'); toc

在这里插入图片描述 在这里插入图片描述

最佳的位置是: 1.2747 此时最优值是: 17.4928 历时 6.819488 秒。 求多元函数最值

求解函数 y = x 1 2 + x 2 2 − x 1 ∗ x 2 − 10 ∗ x 1 − 4 ∗ x 2 + 60 y = x_{1}^2+x_{2}^2-x_{1}*x_{2}-10*x_{1}-4*x_{2}+60 y=x12​+x22​−x1​∗x2​−10∗x1​−4∗x2​+60在 [ − 15 , 15 ] [-15,15] [−15,15]内的最小值

技巧:

meshgrid可以生成二维网格,用法为:[x y]=meshgrid(a b); 其中 a 和 b 是一维数组,如a=[1 2]; b= [2 3 4]; 则生成的 X 和 Y 都是为 2X3 维的矩阵

mesh可以画网格图片,将一个矩阵绘制成三维图像,实际上就是给出一对坐标(x,y),来画矩阵z(x,y)的值

代码:

tic clear; clc figure x1 = -15:1:15; x2 = -15:1:15; [x1,x2] = meshgrid(x1,x2); y = x1.^2 + x2.^2 - x1.*x2 - 10*x1 - 4*x2 + 60; mesh(x1,x2,y) xlabel('x1'); ylabel('x2'); zlabel('y'); % 加上坐标轴的标签 axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示 hold on % 不关闭图形,继续在上面画图 narvs = 2; T0 = 100; T = T0; maxgen = 200; Lk = 100; alfa = 0.95; x_lb = [-15 -15]; x_ub = [15 15]; x0 = zeros(1,narvs); for i = 1: narvs x0(i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(1); end y0 = Obj_fun2(x0); h = scatter3(x0(1),x0(2),y0,'*r'); min_y = y0; MINY = zeros(maxgen,1); for iter = 1 : maxgen for i = 1 : Lk y = randn(1,narvs); z = y / sqrt(sum(y.^2)); % 根据新解的产生规则计算z x_new = x0 + z*T; % 根据新解的产生规则计算x_new的值 % 如果这个新解的位置超出了定义域,就对其进行调整 for j = 1: narvs if x_new(j) x_ub(j) r = rand(1); x_new(j) = r*x_ub(j)+(1-r)*x0(j); end end x1 = x_new; y1 = Obj_fun2(x1); if y1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3