展会信息港展会大全

[原创]模拟退火算法程序
来源:互联网   发布日期:2011-09-07 13:21:32   浏览:4789次  

导读: 从现在开始,我会陆续公开我在做数学建模时的一些程序,希望对大家有所帮助。这些程序都是我原创的,希望对大家有所帮助!特别提醒:虽然我在这里提供了程序,但是还是希望要使用的人根据我的注释研究一下,这样才能提高自己的水平! 首先给出主程序: 引用 ...

从现在开始,我会陆续公开我在做数学建模时的一些程序,希望对大家有所帮助。这些程序都是我原创的,希望对大家有所帮助!特别提醒:虽然我在这里提供了程序,但是还是希望要使用的人根据我的注释研究一下,这样才能提高自己的水平!

首先给出主程序:

引用

%sa.m
%模拟退火算法
r=[1];%初始解
Tm=1000;%最高温度
T=Tm;%初始温度
Tn=0.0001;%最低温度
E=[];%能量
dE=[];%能量差
k=0;%迭代次数
l=length(r);
L0=10;L1=0.0001;%随机扰动范围随温度变化,最大和最小范围
best=r;zx=mbFunction(r);
while T>=Tn
k=k+1;
h=0;
while h==0
hh=0;
while hh==0
r1=r+randomDisturb(l,Tm,T,Tn,L0,L1);
if isMatch(r1)
hh=1;
end
end%扰动产生一个新可行解
E=mbFunction(r1);
dE=E-mbFunction(r);
if dE<=0
r=r1;
h=1;
else
p=exp(-dE/T);
if p>=rand(1)
r=r1;
h=1;
end
end
if mod(k,10)==0
T=0.9*T;
end
if E<zx
zx=E;best=r;
end
end
end
best
mbFunction(best)
clear E;clear T;clear Tn;clear dE;clear h;clear hh;clear k;clear l;clear p;clear r1;
a=1:5000;
b=zeros(1,100);
a=[sin(0.4*a) b sin(0.4*a) b sin(0.8*a) b sin(0.8*a) b sin(1.2*a) b sin(1.2*a) b sin(0.8*a)];
sound(a)

上面对一些变量进行了说明。注意最后“clear E;clear T;clear Tn;clear dE;clear h;clear hh;clear k;clear l;clear p;clear r1;”这一行之后是一段声音,提醒你结果出来了~

然后给出判断可行域的程序:

引用

%isMatch.m
%判断向量是否在可行域
function f=isMatch(r)
f=1;%目标函数(这里取二次函数为例子)可行域为实数集,因此不必进行判断。
return;

这个程序很简单,再用的时候,需要修改一下,当r在可行域内时,返回1,否则返回0。

然后给出目标函数:

引用

%mbFunction.m
%目标函数
function f=mbFunction(w)
f=w*w;
return;

这个时目标函数f=f(w),w为自变量(向量)

最后给出产生随机扰动的程序:

引用

%randomDisturb.m
%生成随机扰动
%n为向量维数
%m为最大扰动
function f=randomDisturb(n,Tm,T,Tn,L0,L1)
m=((L1-L0)/(Tn-Tm))*T+L0-Tm*((L1-L0)/(Tn-Tm));
a=(rand(1,n)*2-1)*m;
f=a;return;

这里要注意了!为了防止程序最后在可行域的边缘附近取不到可行域内的点,我让随机扰动的范围随着温度的降低而减小。这实际上是一个线性递减的函数,有兴趣的可以吧上面第2行变换一下就知道了。

使用的时候,一般只要改一下目标函数、可行域、初始解的维数就可以了。

博客把前面的缩进什么的都给删掉了,这里给出一个程序的压缩包:

点击下载 模拟退火算法.rar

[最后修改由 指月居士, 于 2009-04-18 13:27:17]

标签:

评论Feed: http://www.zyzen.cn/feed.asp?q=comment&id=92
引用链接:

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港