网站大量收购闲置独家精品文档,联系QQ:2885784924

模拟退火求解TSP问题报告.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
模拟退火求解TSP问题实验报告 实验要求: 旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离,i,j=1,2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。 实验思路: 1)指标函数:访问所有城市的路径的长度 2)新解的产生: 选择两个城市间的位置交换方式得到一个可能解的邻域,在随机选择一个解 3)新解的接受准则:exp(-(fj-fi)/t) 4)初始温度的确定:产生一组解,使其平均接受概率为0.9 5)内循环次数:n 6)温度的衰减系数:0.95 7)算法的停止准则:温度低于.01获没有新解产生 实验代码: /* 指标函数:访问所有城市的路径的长度 新解的产生: 选择两个城市间的位置交换方式得到一个可能解的邻域,在随机选择一个解 新解的接受准则:exp(-(fj-fi)/t) 初始温度的确定:产生一组解,使其平均接受概率为.9 内循环次数:n 温度的衰减系数:.95 算法的停止准则:温度低于.01获没有新解产生 */ #includestdlib.h #includestdio.h #includemath.h #includetime.h const long MAX=100; struct double x,y; } city[MAX]; //函数:读入数据--返回城市数目 long initial() { long i,n; //读入城市的数目、x坐标、y坐标 scanf(%d,n); for(i=0;in;i++) scanf(%lf%lf,city[i].x,city[i].y); return n; } //函数:计算指标函数f(i)的值 double cal_f(long *path,long n) { long pre,i; double len; len=0.0; pre=path[0]; for(i=1;in;i++){ len+=sqrt((city[path[i]].x-city[pre].x)*(city[path[i]].x-city[pre].x) +(city[path[i]].y-city[pre].y)*(city[path[i]].y-city[pre].y)); pre=path[i]; } len+=sqrt((city[path[0]].x-city[pre].x)*(city[path[0]].x-city[pre].x) +(city[path[0]].y-city[pre].y)*(city[path[0]].y-city[pre].y)); return len; } void generate_path(long *path,long n); //函数:计算初始温度 double cal_temperature(long num) { long j,n; double t,sum,fi,fj; long path[MAX]; t=1.0; n=20*num; while(1){ sum=0.0; generate_path(path,num); fi=cal_f(path,num); for(j=0;jn;j++){ generate_path(path,num); fj=cal_f(path,num); sum+=fi-fj; fi=fj; } if(exp(-(sum/n)/t)=0.9) break; t*=1.05; }; return t; } //函数:生成一个序列作为解 void generate_path(long *path,long n) { long i,cnt,temp; long mark[MAX]; for(i=0;in;i++) mark[i]=0; cnt=0; //srand(time(NULL)); //pay attention to随机数的生成?? while(cntn){ temp=rand()%n; if(mark[temp]==0){ mark[temp]=1; path[cnt]=temp; cnt++; } } } long main() { freopen(10.txt,r,stdin); clock_t start,finish; struct Neighbour{ long path[MAX]; bool flag;//true--未选择;false--已选择 } nei

文档评论(0)

wangxing1张 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档