⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 computerminf.m

📁 改进模拟退火算法
💻 M
字号:
%使用模拟退火法求函数f(x,y)=5sin(x*y)+x^2+y^2的最小值
format long
XMAX=4; %搜索的最大区间
YMAX=4; %搜索的最大区间
MarkovLength=10000; %马可夫链长度
DecayScale=0.95; %衰减参数0.95
StepFactor=0.02; %步长因子
Temperature=100; %初始温度
Tolerance=1e-8; %容差
AcceptPoints=0.0; %Metropolis过程中总接受点
PreX=-XMAX*rand; %初始的搜索值
PreY=-YMAX*rand; %初始的搜索值
PreBestX=PreX; %上一个最优解
PreBestY=PreY; %上一个最优解
BestX=PreX; %最终解
BestY=PreY; %最终解
while(1)
   Temperature=Temperature*DecayScale; %每迭代一次退火一次(降温),直到满足迭代条件为止
   AcceptPoints=0.0;
   %在当前温度下迭代(即MARKOV链长度)次
   for i=0:1:MarkovLength 
   while(1)
             NextX=PreX+StepFactor*XMAX*(rand-0.5); %在初始点附近随机选下一点
             NextY=PreY+StepFactor*YMAX*(rand-0.5); %在初始点附近随机选下一点
             %判断新产生的点是否在规定的最大搜索区间内,若在,则退出循环,不在,继续循环,直到新产生的点在规定的最大搜索区间内
             if((NextX>=-XMAX && NextX<=XMAX && NextY>=-YMAX && NextY<=YMAX))
                 break %退出循环
                 
             end
   end
   %判断新产生点与原来最优点哪个更优
       if(minfunction(BestX,BestY)>minfunction(NextX,NextY))
          PreBestX=BestX; %保留上一个最优解
          PreBestY=BestY;
          BestX=NextX; %新的最优解
          BestY=NextY;
       end
       %接受新产生的点为下一迭代的开始点
       if(minfunction(PreX,PreY)-minfunction(NextX,NextY)>0)
          PreX=NextX;
          PreY=NextY;
          AcceptPoints=AcceptPoints+1;
       else
          change=-1*(minfunction(NextX,NextY)-minfunction(PreX,PreY))/Temperature;
          %不接受,保存原解
          if(exp(change)>rand)
             PreX=NextX;
             PreY=NextY;
             AcceptPoints=AcceptPoints+1;
          end
       end
   end
   %结束条件为根据上一个最优解与最新的一个最优解的之差小于某个容差
   if(~(abs(minfunction(BestX,BestY)-minfunction(PreBestX,PreBestY))>Tolerance))
   break
       
   end
end
   a=BestX
   b=BestY
   c=minfunction(BestX,BestY)
   %经测试,已成功运行a=1.0767,b=-1.0767,c=-2.2640

   
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -