1. // monituihuo.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <time.h>
  10. #include <iostream>
  11. #include <fstream>
  12. #include <Windows.h>
  13. using namespace std;
  14.  
  15. const int MAXN = ; //城市数量
  16. const double MAX = 27.0; //城市数量
  17. const double INIT_T = ; //初始温度
  18. const double RATE = 0.95; //温度衰减率
  19. const double FINNAL_T = 1E-; //终止温度
  20. const int IN_LOOP = ; //内循环次数
  21. const int LIMIT = ; //概率选择上限
  22. const int FINL_LOOP = ; //外层循环
  23. double DD=;
  24. double D_Length[MAXN][MAXN]={};
  25.  
  26. struct path
  27. {//定义路线结构
  28. int citys[MAXN];
  29. double length;
  30. }D_BestPath;
  31.  
  32. struct point
  33. {//定义点结构
  34. double x;
  35. double y;
  36. }D_Point[MAXN];
  37.  
  38. //计算点和点之间的距离
  39. void point_dist()
  40. {
  41. int i, j;
  42. double x;
  43. for(i=; i<MAXN; i++)
  44. {
  45. for(j=i+; j<MAXN; j++)
  46. {
  47. x = (D_Point[i].x-D_Point[j].x)*(D_Point[i].x-D_Point[j].x);
  48. x += (D_Point[i].y-D_Point[j].y)*(D_Point[i].y-D_Point[j].y);
  49. D_Length[i][j] = sqrt(x);
  50. D_Length[j][i] = D_Length[i][j];
  51. }
  52. }
  53. }
  54. //初始化
  55. void init()
  56. {
  57. int i;
  58. printf("初始状态路径:");
  59. D_BestPath.length = ;
  60. for(i=; i<MAXN; i++)
  61. {//初始顺序经过路径
  62. D_BestPath.citys[i] = i;
  63. printf("%d--", i);
  64. }
  65. for(i=; i<MAXN-; i++)
  66. {//计算路径长度
  67. D_BestPath.length += D_Length[i][i+];
  68. }
  69. printf("\n路径长度为:%.3lf\n\n", D_BestPath.length);
  70.  
  71. }
  72. void Dprintf(path p)
  73. {//用于显示过程变化情况,打印
  74. int i;
  75. printf("路径是:");
  76. for(i=; i<MAXN; i++)
  77. {
  78. printf("%d--", p.citys[i]);
  79. }
  80. printf("\n路径长度为:%.3lf\n\n", p.length);
  81. }
  82.  
  83. //输入城市坐标信息
  84. void input()
  85. {
  86. int i,ll = ;
  87. ifstream f1("C:\\city.txt",ios::in);
  88. for(i=; i<MAXN; i++){
  89. if(ll % != )
  90. f1 >> D_Point[i].x;
  91. if(ll % == )
  92. f1 >> D_Point[i].y;
  93. ll++;
  94. }
  95. f1.close();
  96. }
  97.  
  98. path getnext(path p)
  99. {
  100. path ret;
  101. int i, x, y;
  102. int te;
  103. ret = p;
  104. do
  105. {
  106. x = (int)(MAX*rand()/(RAND_MAX + 1.0));
  107. y = (int)(MAX*rand()/(RAND_MAX + 1.0));
  108. }
  109. while(x == y);
  110. te = ret.citys[x];
  111. ret.citys[x] = ret.citys[y];
  112. ret.citys[y] = te;
  113. ret.length = ;
  114. for(i=; i<MAXN-; i++)
  115. {//计算路径长度
  116. ret.length += D_Length[ret.citys[i]][ret.citys[i+]];
  117. }
  118. Dprintf(ret);
  119. DD++;
  120. return ret;
  121. }
  122.  
  123. void sa()
  124. {
  125. int i, P_L=, P_F=;;
  126. path curPath, newPath;
  127. double T = INIT_T;
  128. double p, delta;
  129. srand((int)time());
  130. curPath = D_BestPath;
  131. while(true)
  132. {
  133. for(i=; i<IN_LOOP; i++)
  134. {
  135. newPath = getnext(curPath);
  136. delta = newPath.length - curPath.length;
  137. if(delta < )
  138. {//更新长度
  139. curPath = newPath;
  140. P_L = ;
  141. P_F = ;
  142. }
  143. else
  144. {
  145. p = (double)(1.0*rand()/(RAND_MAX+1.0));
  146. if(exp(delta/T) < && exp(delta/T) > p)
  147. {
  148. curPath = newPath;
  149. }
  150. P_L ++;
  151. }
  152. if(P_L > LIMIT)
  153. {
  154. P_F ++;
  155. break;
  156. }
  157. }
  158. if(curPath.length < newPath.length)
  159. {
  160. D_BestPath = curPath;
  161. }
  162. if(P_F > FINL_LOOP || T<FINNAL_T)
  163. break;
  164. T = T * RATE;
  165. }
  166.  
  167. }
  168.  
  169. void main()
  170. {
  171. input();
  172. point_dist();
  173. init();
  174. sa();
  175. Dprintf(D_BestPath);
  176. printf("\n共测试%.0lf次\n", DD);
  177. system("pause");
  178. }

参考:http://blog.csdn.net/oxoxzhu/article/details/8142306

模拟退火解决TSP问题的更多相关文章

  1. C++实现禁忌搜索解决TSP问题

    C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...

  2. SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu

    %SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu X = [16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 2 ...

  3. ACA:利用ACA解决TSP优化最佳路径问题——Jason niu

    load citys_data.mat n = size(citys,1); D = zeros(n,n); for i = 1:n for j = 1:n if i ~= j D(i,j) = sq ...

  4. 蚁群算法解决TSP问题

    代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1  alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...

  5. 随机法解决TSP问题

    TSP问题一直是个头疼的问题,但是解决的方法数不胜数,很多的算法也都能解决.百度资料一大堆,但是我找到了代码比较简练的一种.随机法.下面只是个人的看法而已,如果有任何问题虚心接受. 顾名思义,随机法就 ...

  6. 遗传算法解决TSP问题实现以及与最小生成树的对比

    摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...

  7. 遗传算法解决TSP问题

    1实验环境 实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48 ...

  8. 分布估计算法解决TSP问题

    分布估计算法解决旅行商问题(TSP) TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述 ...

  9. C/C++贪心算法解决TSP问题

    贪心算法解决旅行商问题 TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干 ...

随机推荐

  1. Day Six(Beta)

    站立式会议 站立式会议内容总结 331 今天:完成闹钟功能,远程数据库采用bmob的解决方案,应用初始化bmob 遇到问题:闹钟没有取消提醒 以及多次设置提醒的问题 明天:修改闹钟问题,完成文件下载( ...

  2. 揭秘PHP匿名函数

    揭秘PHP匿名函数 定义:匿名函数就是没有名字的函数. 有2种形式的匿名函数: 形式1:将一个匿名函数"赋值"给一个变量--此时该变量就代表该匿名函数了! 形式2: 是直接将一个匿 ...

  3. JNI系列——C文件中的方法调用Java中方法

    1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...

  4. SharedPrefernces使用实例讲解

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. Java Native Method

    一.什么是java native method? "A native method is a Java method whose implementation is provided by ...

  6. Ubuntu下基于Nginx实现Tomcat集群负载均衡

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述.这里,我们记录一下Nginx ...

  7. C# 多线程join的用法,等待多个子线程结束后再执行主线程

    等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...

  8. 【POJ 1279】Art Gallery

    http://poj.org/problem?id=1279 裸的半平面交的模板,按极角排序后维护一个双端队列,不要忘了最后要去除冗余,即最后一条边(或者更多的边)一定在双端队列里,但它不一定构成半平 ...

  9. hdu2089 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. Linux的vim三种模式及命令

    一般模式:在Linux终端中输入"vim 文件名"就进入了一般模式,但不能输入文字.编辑模式:在一般模式下按i就会进入编辑模式,此时就可以写程式,按Esc可回到一般模式. 命令模式 ...