MATLAB模拟退火算法模板

原创 2016年08月29日 08:31:40

为了参加国赛,这几天学了模拟退火算法,整理下当做模板方便国赛的时候用。

模拟退火用于处理最优化问题,可以求出当目标函数取得最小值时的决策变量的值。


在编写程序时需要根据具体问题设计算法,算法描述为:

(1)解空间(初始解)

(2)目标函数

(3)新解的产生
① 2 变换法

② 3 变换法

(4)代价函数差

(5)接受准则

(6)降温

(7)结束条件

下面MATLAB程序用于求解非线性规划:

min f(x)=x1^2+x2^2+8

st.

x1^2-x2>=0

-x1-x2^2+2=0

x1,x2>=0

clear
clc

%生成初始解
sol_new2=1;%(1)解空间(初始解)
sol_new1=2-sol_new2^2;
sol_current1 = sol_new1; 
sol_best1 = sol_new1;
sol_current2 = sol_new2; 
sol_best2 = sol_new2;
E_current = inf;
E_best = inf;

rand('state',sum(clock)); %初始化随机数发生器
t=90; %初始温度
tf=89.9; %结束温度
a = 0.99; %温度下降比例

while t>=tf%(7)结束条件
    for r=1:1000 %退火次数
        
        %产生随机扰动(3)新解的产生
        sol_new2=sol_new2+rand*0.2;
        sol_new1=2-sol_new2^2;
        
        %检查是否满足约束
        if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0
        else
            sol_new2=rand*2;
            sol_new1=2-sol_new2^2;
            continue;
        end
        
        %退火过程
        E_new=sol_new1^2+sol_new2^2+8;%(2)目标函数
        if E_new<E_current%(5)接受准则
                E_current=E_new;
                sol_current1=sol_new1;
                sol_current2=sol_new2;
                if E_new<E_best
                    %把冷却过程中最好的解保存下来
                    E_best=E_new;
                    sol_best1=sol_new1;
                    sol_best2=sol_new2;
                end
        else
                if rand<exp(-(E_new-E_current)/t)%(4)代价函数差
                    E_current=E_new;
                    sol_current1=sol_new1;
                    sol_current2=sol_new2;
                else
                    sol_new1=sol_current1;
                    sol_new2=sol_current2;
                end
        end
        plot(r,E_best,'*')
        hold on
    end
    t=t*a;%(6)降温
end

disp('最优解为:')
disp(sol_best1)
disp(sol_best2)
disp('目标表达式的最小值等于:')
disp(E_best)

最优解为:
    1.0038

    0.9981

目标表达式的最小值等于:
   10.0038

司守奎的算法大全给出了利用模拟退火求解TSP问题的MATLAB算法:

clc,clear
load sj.txt %加载敌方100 个目标的数据,数据按照表格中的位置保存在纯文本
文件sj.txt 中
x=sj(:,1:2:8);x=x(:);
y=sj(:,2:2:8);y=y(:);
sj=[x y];
d1=[70,40];
sj=[d1;sj;d1];
sj=sj*pi/180;
%距离矩阵d
d=zeros(102);
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d';
S0=[];Sum=inf;
rand('state',sum(clock));
for j=1:1000
S=[1 1+randperm(100),102];
temp=0;
-276-
for i=1:101
temp=temp+d(S(i),S(i+1));
end
if temp<Sum
S0=S;Sum=temp;
end
end
e=0.1^30;L=20000;at=0.999;T=1;
%退火过程
for k=1:L
%产生新解
c=2+floor(100*rand(1,2));
c=sort(c);
c1=c(1);c2=c(2);
%计算代价函数值
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
if df<0
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
elseif exp(-df/T)>rand(1)
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
end
T=T*at;
if T<e
break;
end
end
% 输出巡航路径及路径长度
S0,Sum


版权声明:本文为博主原创文章,未经博主允许不得转载。

模拟退火算法2(实例分析)--Matlab算法

模拟退火算法2(实例分析)--Matlab算法 此篇文章为我一学长(Hong Yilin)所作,我又进行了一些加工,在此只为学习使用。 此篇为模拟退火算法的实例分析,模拟退...
  • Lee_lg
  • Lee_lg
  • 2015年09月08日 17:56
  • 7282

模拟退火算法(MATLAB实现)

function [xo,fo] = Opt_Simu(f,x0,u,l,kmax,q,TolFun) % 模拟退火算法求函数 f(x)的最小值点, 且 l ...
  • cighao
  • cighao
  • 2015年10月12日 16:47
  • 7225

模拟退火算法例子matlab

  • 2015年03月24日 16:10
  • 20KB
  • 下载

基于MATLAB利用模拟退火算法解决费马点问题

数据来源:安徽各市的坐标。安徽内一点到所有各市的距离最短。 代码实现了各点的连线组成不交叉的普通多边形。实现图形的显示,将各市连接。 代码如下 %费马点问题求解 %给n个点,找出一个点,使这个...
  • baidu_38127162
  • baidu_38127162
  • 2017年07月16日 20:17
  • 212

[AI] 模拟退火算法解决旅行商问题(matlab)

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/6/28 模拟退火算法解决旅行商问题。 根据概率产生新解主要包含两个途径:二交换和三交换 二交换是在TSP回路中选择两个城市直接交...
  • zhangzhengyi03539
  • zhangzhengyi03539
  • 2015年06月28日 19:47
  • 4763

模拟退火算法的matlab程序,简单易懂

  • 2013年12月04日 22:10
  • 490KB
  • 下载

模拟退火算法举例及其matlab实现

已知敌方100个目标的经度、纬度如表1所示。 表1  经度和纬度数据表 经度  纬度  经度  纬度  经度  纬度  经度  纬度 53.7121 15.3046 51.1758 0.0322...
  • Yelbosh
  • Yelbosh
  • 2013年01月30日 23:24
  • 21097

SA(模拟退火)优化算法MATLAB源码详细中文注解

以优化SVM算法的参数c和g为例,对SA(模拟退火)算法MATLAB源码进行了逐行中文注解。...
  • u013337691
  • u013337691
  • 2016年09月30日 16:24
  • 841

Matlab的模拟退火算法工具箱

  • 2009年10月11日 21:13
  • 60KB
  • 下载

模拟退火算法

模拟退火算法是用来求解最优化问题的算法。比如著名的TSP问题,函数最大值最小值问题等等。接下来将以如下几个方面来详细介绍模拟退火算法。 Contents 1. 模拟退火算法认识 ...
  • ACdreamers
  • ACdreamers
  • 2013年08月17日 10:28
  • 69619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MATLAB模拟退火算法模板
举报原因:
原因补充:

(最多只允许输入30个字)