模拟退火算法说明 - 范文中心

模拟退火算法说明

03/23

1.内容:

在Visual C++ 编译环境下,模拟退火算法程序,并利用它们求解了48个城市的TSP问题。

2.程序说明

由于篇幅有限,且程序中还包括界面实现和计算线程处理等一些与算法无关的代码。为方便阅读,程序清单只介绍实现算法的流程控制函数和一些功能函数,具体的代码可参见源程序。

模拟退火算法的源程序在[TspSA]目录中,与算法相关的代码主要在如下三个文件中:

1)sacode.h 算法中所需结构体的定义,包括SYCoordinate、SYCity、SYCityDistance、SYRouter。

2) sacode.cpp 算法中所有功能函数的实现,主要包括InitialSA、CountCityDistance、CreateCityRouter2opt、CountTotalDistance、CountDownTemperature等等。后面将分别介绍这些功能函数的作用。

3)MainFrm.cpp流程控制函数的实现,该函数是SACompution。后面将详细介绍该函数的流程。

流程控制函数和功能函数的介绍

流程控制函数SACompution控制循环的迭代和结束,其主要代码如下:

UINT SACompution(LPVOID pParam)

{

while(1) { double deltatotaldis = 0.0; while(1) {

SYRouter SelRouter( ResultRouter.m_CityRouter, NowTemperature, NowExternalIterNumber, NowInnerIterNumber ); //从某路径的邻域中随机选择一个新的路径,邻域映射为2-opt

deltatotaldis = SelRouter.m_fTotalDistance-ResultRouter.m_fTotalDistance; //计算新路径与当前路径的路程长度差值 if( deltatotaldis random ) ResultRouter = SelRouter; //如果新路径长于当前路径,但exp(-Δf/t) > random(0,1),则仍然替换当//如果新路径的路程短,则用它替换当前路径 前路径 } if( JudgeOverInnerLoop(0) ) break; //判断内循环是否结束,结束则跳出当前温度的内循环

else NowInnerIterNumber++; //判断内循环是否结束,不结束则继续内循环 } if( JudgeOverExternalLoop(0) ) break; //判断外循环是否结束,结束则结束模拟退火计算 else { } NowTemperature = CountDownTemperature( NowTemperature, 0 ); NowExternalIterNumber++; NowInnerIterNumber = 0; //判断外循环是否结束,不结束则计算出下降后的温度,并继续循环

}

}

SACompution有两个while循环,分别对应模拟退火算法中的某一温度下的内循环和温度下降的外循环。为阅读方便,各步骤代码说明已用注释方式写在相应的位置,下同。

下面是一些重要的功能函数的说明:

InitialSA() 模拟退火算法的初始化,包括两部分工作,一是根据直角坐标生成城市距离矩阵;二是计算初始温度。

CountCityDistance() 计算城市之间的距离。

CountInitialTemperatureMaxMin() 计算起始温度,计算方法请参见《现代优化计算方法》(邢文训等编著) p117。

CreateCityRouter2opt() 从某路径的邻域中随机选择一个新的路径,邻域映射为2-opt。 CountTotalDistance() 根据给定路径计算该路径对应的总路程。

CountDownTemperature() 计算外层循环的下降后的温度,温度下降方式为 T(k+1) = K*T(k),K=0.95。

JudgeOverInnerLoop() 判断是否结束某一温度下的内层循环,某一温度下的循环次数是固定的,即城市个数的三次方。

JudgeOverExternalLoop() 判断是否结束模拟退火算法,使用“零度法”的判断方式,T(k)

程序使用方法

程序处理的TSP问题可按用户的具体要求,只需用户依照格式要求提供城市坐标文件即可,坐标文件的格式如下

1 6734 1453

2 2233 10

3 5530 1424

„„„„„

文件的每一行表示一个城市的信息,即,城市名称+空格+X坐标+空格+Y坐标。

点击菜单栏的[文件]-[打开„],可打开指定的城市坐标文件。

指点城市文件打开后,程序会读入文件里的各城市坐标信息,并初始化城市距离矩阵。 点击菜单栏的[文件]-[开始计算],即可进行计算。

城市计算结束后,会在C盘的根目录生成两个文件,一是sacitysfile.txt,它记录了计算得到的最优路径信息;二是saitersfile.txt,它记录了计算过程中的迭代信息。

可利用作者提供的Matlab的M文件satspsta.m读取以上两个文件,画出路径优化过程图和求解路径图。

程序算例

程序对48个城市的TSP问题(城市坐标文件对应于48.txt)进行计算,求解路径和最优路径图如下。

48个城市结果,大的红*表示路径开始城市,途经城市依次用蓝色方块和红色*标示。

求得最短路径为

3.源码获取

上面两个算法的程序源码都可到http://www.huisoft.com.cn/下载。

4.更新记录

2005年6月6日 加入读取距离矩阵文件的功能:

加入读取距离矩阵文件的功能,为了区别城市坐标文件和距离矩阵文件,在读入文件的第一行标示出文件的类型,如果是城市坐标文件,则文件的第一行以“coordinate”标识;如果是距离矩阵文件,则文件的第一行以“distancematrix”标识。具体可参见数据文件范例。


相关内容

  • 遗传算法概述
    遗传算法概述 摘要:遗传算法(genetic algorithms, GA)是人工智能的重要新分支,是基于达尔文进化论,在微型计算机上,模拟生命进化机制而发展起来的一门学科.它根据适者生存.优胜劣汰等自然进化规则来进行搜索计算机和问题求解. ...
  • 十大经典数学模型
    十大经典数学模型 1.蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,是比赛时必用的方法) 2.数据拟合.参数估计.插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而 ...
  • 微生物分子生态学常用软件使用方法
    实验七 微生物分子生态学常用软件使用方法 微生物生态学研究中测序已经成为一项常规的必不可少的分析手段,实验后常常会得到大量的核酸序列,有的是细菌基因组上随机的序列片断,有的是16S rRNA基因的克隆文库,有的是功能基因序列等等,如此海量的 ...
  • [人工智能导论]教学大纲
    <人工智能导论>教学大纲 大纲说明 课程代码:3235042 总学时:32学时(讲课32学时) 总学分:2学分 课程类别:限制性选修 适用专业:计算机科学与技术,以及有关专业 预修要求:C程序设计语言,数据结构 课程的性质.目的 ...
  • 分子模拟的方法及其应用
    第40卷第5期 当 代 化 工 Vol.40,No.5 2011年5月 Contemporary Chemical Industry May,2011 分子模拟的方法及其应用 李春艳,刘 华,刘波涛 (中北大学物理系,山西 太原030001 ...
  • 粒子群优化算法及其应用
    2006年第1期信息技术 InformationTechnology 中图分类号:TP391.9 文献标识码:A 文章编号:1009-2552(2006)01-0053-04 粒子群优化算法及其应用 范 娜,云庆夏 (西安建筑科技大学管理科 ...
  • 基于遗传算法的网格资源调度算法
    第41卷第12期2004年12月 计算机研究与发展 JOURNAL OF COM PUTER RESEARCH AND DEVELOPM EN T V ol . 41, No . 12Dec . 2004 基于遗传算法的网格资源调度算法 林 ...
  • [测试系统原理与设计](孙传友编著)--习题答案(个人整理)
    <测试系统原理与设计>(孙传友编著)--习题答案(个人整理) (答案仅供参考,部分答案没有,由个人总结整理,若有错误或不当之处请见谅) 第一章 绪论 1. 为什么说仪器技术是信息的源头技术? 仪器是一种信息的工具,起着不可或缺的 ...
  • [通信网络安全与保密]课程综述
    <通信网络安全与保密> 综述报告 专业及班级 13通信(1)班 姓名 学号 授课老师胡国华 完成时间 2016年4月10日 <通信网络安全与保密>综述报告 一. 课程简介 1. 课程专业地位 <通信网络安全与保 ...
  • 操作系统 磁盘管理 实验报告
    实 验 报 告 课程名称:院 系:专业班级:姓 名:指导老师: 操作系统 信息与控制工程学院 计算机0801 2010年 12月 31日 目录 一.实验目的 ......................................... ...