最优化理论的经典算法
模拟退火法、神经网络、遗传算法是数学建模中常用的启发式算法,这里整合一下模版,并进行一些拓展,方便直接使用
原文:http://blog.csdn.net/qq_34861102/article/details/77806124
一些拓展:
基于模拟退火的遗传算法:
http://blog.csdn.net/qq_34861102/article/details/77899555
模拟退火法
- 伪代码
/*
* J(y):在状态y时的评价函数值
* Y(i):表示当前状态
* Y(i+1):表示新的状态
* r: 用于控制降温的快慢
* T: 系统的温度,系统初始应该要处于一个高温的状态
* T_min :温度的下限,若温度T达到T_min,则停止搜索
*/
while( T > T_min )
{
dE = J( Y(i+1) ) - J( Y(i) ) ;
if ( dE >=0 ) //表达移动后得到更优解,则总是接受移动
Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
else
{
// 函数exp( dE/T )的取值范围是(0,1) ,dE/T越大,则exp( dE/T )也
if ( exp( dE/T ) > random( 0 , 1 ) )
Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
}
T = r * T ; //降温退火 ,0<r<1 。r越大,降温越慢;r越小,降温越快
/*
* 若r过大,则搜索到全局最优解的可能会较高,但搜索的过程也就较长。若r过小,则搜索的过程会很快,但最终可能会达到一个局部最优值
*/
i ++ ;
}
实际例子
求解下列非线性规划最优解
min f(x) = x(1)^2 + x(2)^2 + 8; s.t. x(1)^2 - x(2) >= 0; -x(1) - x(2)^2 + 2 = 0; x(1),x(2) >=0
实现代码
%生成初始解 x2=1; x1=2-x2^2; tempx1 = x1; bestx1 = x1; tempx2 = x2; bestx2 = x2; tempans = inf; bestans = inf; figure rand('state',sum(clock)); %初始化随机数发生器 t=90; %初始温度 tf=89.9; %结束温度 a = 0.99; %温度下降比例 while t>=tf%(7)结束条件 for r=1:1000 %退火次数 %产生随机扰动(3)新解的产生 x2=x2+rand*0.2; x1=2-x2^2; %检查是否满足约束 if x1^2-x2>=0 && -x1-x2^2+2==0 && x1>=0 &&x2>=0 else x2=rand*2; x1=2-x2^2; continue; end %退火过程 E_new=x1^2+x2^2+8;%(2)目标函数 if E_new<tempans%(5)接受准则 tempans=E_new; tempx1=x1; tempx2=x2; if E_new<bestans %把冷却过程中最好的解保存下来 bestans=E_new; bestx1=x1; bestx2=x2; end