智能优化算法——模拟退火法(Python&Matla实现)

#=2.2 Boltzmann Simulated Annealing with bounds==========

from sko.SA import SABoltzmann

sa_boltzmann = SABoltzmann(func=demo_func, x0=[1, 1, 1], T_max=1, T_min=1e-9, q=0.99, L=300, max_stay_counter=150,

lb=-1, ub=[2, 3, 4])

sa_boltzmann.run()

print('Boltzmann Simulated Annealing with bounds: best_x is ', sa_boltzmann.best_x, 'best_y is ', sa_fast.best_y)

#3.1 Cauchy Simulated Annealing

from sko.SA import SACauchy

sa_cauchy = SACauchy(func=demo_func, x0=[1, 1, 1], T_max=1, T_min=1e-9, q=0.99, L=300, max_stay_counter=150)

sa_cauchy.run()

print('Cauchy Simulated Annealing: best_x is ', sa_cauchy.best_x, 'best_y is ', sa_cauchy.best_y)

#3.2 Cauchy Simulated Annealing with bounds

from sko.SA import SACauchy

sa_cauchy = SACauchy(func=demo_func, x0=[1, 1, 1], T_max=1, T_min=1e-9, q=0.99, L=300, max_stay_counter=150,

lb=[-1, 1, -1], ub=[2, 3, 4])

sa_cauchy.run()

print('Cauchy Simulated Annealing with bounds: best_x is ', sa_cauchy.best_x, 'best_y is ', sa_cauchy.best_y)

2 Matlab实现


2.1 模拟退火法

clear

clc

T=1000; %初始化温度值

T_min=1; %设置温度下界

alpha=0.99; %温度的下降率

num=1000; %颗粒总数

n=2; %自变量个数

sub=[-5,-5]; %自变量下限

up=[5,5]; %自变量上限

tu

for i=1:num

for j=1:n

x(i,j)=(up(j)-sub(j))*rand+sub(j);

end

fx(i,1)=fun(x(i,1),x(i,2));

end

%以最小化为例

[bestf,a]=min(fx);

bestx=x(a,:);

trace(1)=bestf;

while(T>T_min)

for i=1:num

for j=1:n

xx(i,j)=(up(j)-sub(j))*rand+sub(j);

end

ff(i,1)=fun(xx(i,1),xx(i,2));

delta=ff(i,1)-fx(i,1);

if delta<0

fx(i,1)=ff(i,1);

x(i,:)=xx(i,:);

else

P=exp(-delta/T);

if P>rand

fx(i,1)=ff(i,1);

x(i,:)=xx(i,:);

end

end

end

if min(fx)<bestf

[bestf,a]=min(fx);

bestx=x(a,:);

end

trace=[trace;bestf];

T=T*alpha;

end

disp(‘最优解为:’)

disp(bestx)

disp(‘最优值为:’)

disp(bestf)

hold on

plot3(bestx(1),bestx(2),bestf,‘ro’,‘LineWidth’,5)

figure

plot(trace)

xlabel(‘迭代次数’)

ylabel(‘函数值’)

title(‘模拟退火算法’)

legend(‘最优值’)

function z=fun(x,y)

z = x.^2 + y.^2 - 10cos(2pix) - 10cos(2piy) + 20;

function tu

[x,y] = meshgrid(-5:0.1:5,-5:0.1:5);

z = x.^2 + y.^2 - 10cos(2pix) - 10cos(2piy) + 20;

figure

mesh(x,y,z)%建一个网格图,该网格图为三维曲面,有实色边颜色,无面颜色

hold on

xlabel(‘x’)

ylabel(‘y’)

zlabel(‘z’)

title(‘z = x^2 + y^2 - 10cos(2pix) - 10cos(2piy) + 20’)

这里有一个待尝试的想法,先用蒙特卡洛/模拟退火迭代几次全局去找最优的区域,再通过其他有向最优逼近过程的算法再进一步寻优,或许会很大程度降低产生局部最优解的概率。

下面是模拟退火和蒙特卡洛对上述函数寻优的程序,迭代次数已设为一致,可以思考下两种程序写法的效率、共同点、缺点。理论研究讲究结果好,实际应用既要保证结果好也要保证程序运算效率。

2.2 蒙特卡诺法

clear

clc

num=689000; %颗粒总数

n=2; %自变量个数

sub=[-5,-5]; %自变量下限

up=[5,5]; %自变量上限

tu

x=zeros(num,n);

fx=zeros(num,1);

for i=1:num

for j=1:n

x(i,j)=(up(j)-sub(j))*rand+sub(j);

end

fx(i,1)=fun(x(i,1),x(i,2));

end

[bestf,a]=min(fx);

bestx=x(a,:);

disp(‘最优解为:’)

disp(bestx)

disp(‘最优值为:’)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

86381401c05e862fe4e9.png)

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值