一、简介
1 模拟退火算法的应用背景
模拟退火算法提出于1982年。Kirkpatrick等人首先意识到固体退火过程与优化问题之间存在着类似性;Metropolis等人对固体在恒定温度下达到热平衡过程的模拟也给他们以启迪。通过把Metropolis 算法引入到优化过程中,最终得到一种对 Metropolis 算法进行迭代的优化算法,这种算法类似固体退火过程,称之为“模拟退火算法”。
模拟退火算法是一种适合求解大规模组合优化问题的随机搜索算法。目前,模拟退火算法在求解 TSP,VLSI 电路设计等组合优化问题上取得了令人满意的结果。将模拟退火算法同其它的计算智能方法相结合,应用到各类复杂系统的建模和优化问题中也得到了越来越多的重视,已经逐渐成为一种重要的发展方向。
2 模拟退火算法介绍
3 模拟退火算法的参数
模拟退火是一种优化算法,它本身是不能独立存在的,需要有一个应用场合,其中温度就是模拟退火需要优化的参数,如果它应用到了聚类分析中,那么就是说聚类分析中有某个或者某几个参数需要优化,而这个参数,或者参数集就是温度所代表的。它可以是某项指标,某项关联度,某个距离等等。
二、源代码
clear
clc
filename='input.txt';
[bestRoute,bestL]=SAGA_TSP(filename);
toc
%输入input: 文本文件[序号,x坐标,y坐标]
%输出bestRoute: 全局最优路线
%输出bestL: 全局最优路线对应的路径长度
function [bestRoute,bestL]=SAGA_TSP(filename)
%% 输入数据
input=importdata(filename);
n=size(input,1); %n-城市数目
vertexs=input(:,2:3); %城市xy坐标
x=vertexs(:,1); %x坐标
y=vertexs(:,2); %y坐标
h=pdist(vertexs);
dist=squareform(h); %距离矩阵
%% 遗传算法参数设置
NIND=50; %种群大小
MAXGEN=10; %迭代次数
GGAP=0.9; %代沟
Pc=0.8; %交叉概率
Pm=0.2; %变异概率
pSwap=0.2; %选择交换结构的概率
pReversion=0.5; %选择逆转结构的概率
pInsertion=1-pSwap-pReversion; %选择插入结构的概率
N=n; %染色体长度=城市数目
%% 模拟退火算法参数
MaxOutIter=300; %外层循环最大迭代次数
MaxInIter=15; %里层循环最大迭代次数
T0=0.025; %初始温度
alpha=0.99; %冷却因子
%% 种群初始化
Chrom=InitPop(NIND,N);
%% 优化
gen=1; %计数器
bestChrom=Chrom(1,:); %初始全局最优个体
bestL=RouteLength(bestChrom,dist); %初始全局最优个体的总距离
BestChrom=zeros(MAXGEN,N); %记录每次迭代过程中全局最优个体
BestL=zeros(MAXGEN,1); %记录每次迭代过程中全局最优个体的总距离
while gen<=MAXGEN
%% 计算目标函数值
ObjV=ObjFunction(Chrom,dist);
%% 二元锦标赛选择
SelCh=BinaryTourment_Select(Chrom,GGAP,ObjV);
%% OX交叉
SelCh=Recombin(SelCh,Pc);
%% 变异
SelCh=Mutate(SelCh,Pm,pSwap,pReversion,pInsertion);
%% 对种群中前30%的个体都进行模拟退火操作
SelCh=SA_Chrom(SelCh,dist,MaxOutIter,MaxInIter,T0,alpha,pSwap,pReversion,pInsertion);
%% 重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%% 计算当前代所有个体总距离
Obj=ObjFunction(Chrom,dist);
%% 找出当前代中最优个体
[minObj,minIndex]=min(Obj);
%% 将当前代中最优个体与全局最优个体进行比较,如果当前代最优个体更好,则将全局最优个体进行替换
if minObj<=bestL
bestChrom=Chrom(minIndex,:);
bestL=minObj;
end
%% 记录每一代全局最优个体,及其总距离
BestChrom(gen,:)=bestChrom;
BestL(gen,:)=bestL;
%% 显示外层循环每次迭代的信全局最优路线的总距离
disp(['第' num2str(gen) '次迭代:全局最优路线总距离 = ' num2str(bestL)]);
%% 画出每次迭代的全局最优路线图
figure(1);
PlotRoute(bestChrom,x,y)
pause(0.01);
%% 计数器加1
gen=gen+1;
end
三、运行结果
四、备注
版本:2014a