模拟退火解决TSP问题
- // monituihuo.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #include <iostream>
- #include <fstream>
- #include <Windows.h>
- using namespace std;
- const int MAXN = ; //城市数量
- const double MAX = 27.0; //城市数量
- const double INIT_T = ; //初始温度
- const double RATE = 0.95; //温度衰减率
- const double FINNAL_T = 1E-; //终止温度
- const int IN_LOOP = ; //内循环次数
- const int LIMIT = ; //概率选择上限
- const int FINL_LOOP = ; //外层循环
- double DD=;
- double D_Length[MAXN][MAXN]={};
- struct path
- {//定义路线结构
- int citys[MAXN];
- double length;
- }D_BestPath;
- struct point
- {//定义点结构
- double x;
- double y;
- }D_Point[MAXN];
- //计算点和点之间的距离
- void point_dist()
- {
- int i, j;
- double x;
- for(i=; i<MAXN; i++)
- {
- for(j=i+; j<MAXN; j++)
- {
- x = (D_Point[i].x-D_Point[j].x)*(D_Point[i].x-D_Point[j].x);
- x += (D_Point[i].y-D_Point[j].y)*(D_Point[i].y-D_Point[j].y);
- D_Length[i][j] = sqrt(x);
- D_Length[j][i] = D_Length[i][j];
- }
- }
- }
- //初始化
- void init()
- {
- int i;
- printf("初始状态路径:");
- D_BestPath.length = ;
- for(i=; i<MAXN; i++)
- {//初始顺序经过路径
- D_BestPath.citys[i] = i;
- printf("%d--", i);
- }
- for(i=; i<MAXN-; i++)
- {//计算路径长度
- D_BestPath.length += D_Length[i][i+];
- }
- printf("\n路径长度为:%.3lf\n\n", D_BestPath.length);
- }
- void Dprintf(path p)
- {//用于显示过程变化情况,打印
- int i;
- printf("路径是:");
- for(i=; i<MAXN; i++)
- {
- printf("%d--", p.citys[i]);
- }
- printf("\n路径长度为:%.3lf\n\n", p.length);
- }
- //输入城市坐标信息
- void input()
- {
- int i,ll = ;
- ifstream f1("C:\\city.txt",ios::in);
- for(i=; i<MAXN; i++){
- if(ll % != )
- f1 >> D_Point[i].x;
- if(ll % == )
- f1 >> D_Point[i].y;
- ll++;
- }
- f1.close();
- }
- path getnext(path p)
- {
- path ret;
- int i, x, y;
- int te;
- ret = p;
- do
- {
- x = (int)(MAX*rand()/(RAND_MAX + 1.0));
- y = (int)(MAX*rand()/(RAND_MAX + 1.0));
- }
- while(x == y);
- te = ret.citys[x];
- ret.citys[x] = ret.citys[y];
- ret.citys[y] = te;
- ret.length = ;
- for(i=; i<MAXN-; i++)
- {//计算路径长度
- ret.length += D_Length[ret.citys[i]][ret.citys[i+]];
- }
- Dprintf(ret);
- DD++;
- return ret;
- }
- void sa()
- {
- int i, P_L=, P_F=;;
- path curPath, newPath;
- double T = INIT_T;
- double p, delta;
- srand((int)time());
- curPath = D_BestPath;
- while(true)
- {
- for(i=; i<IN_LOOP; i++)
- {
- newPath = getnext(curPath);
- delta = newPath.length - curPath.length;
- if(delta < )
- {//更新长度
- curPath = newPath;
- P_L = ;
- P_F = ;
- }
- else
- {
- p = (double)(1.0*rand()/(RAND_MAX+1.0));
- if(exp(delta/T) < && exp(delta/T) > p)
- {
- curPath = newPath;
- }
- P_L ++;
- }
- if(P_L > LIMIT)
- {
- P_F ++;
- break;
- }
- }
- if(curPath.length < newPath.length)
- {
- D_BestPath = curPath;
- }
- if(P_F > FINL_LOOP || T<FINNAL_T)
- break;
- T = T * RATE;
- }
- }
- void main()
- {
- input();
- point_dist();
- init();
- sa();
- Dprintf(D_BestPath);
- printf("\n共测试%.0lf次\n", DD);
- system("pause");
- }
参考:http://blog.csdn.net/oxoxzhu/article/details/8142306
模拟退火解决TSP问题的更多相关文章
- C++实现禁忌搜索解决TSP问题
C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...
- 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 ...
- 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 ...
- 蚁群算法解决TSP问题
代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1 alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...
- 随机法解决TSP问题
TSP问题一直是个头疼的问题,但是解决的方法数不胜数,很多的算法也都能解决.百度资料一大堆,但是我找到了代码比较简练的一种.随机法.下面只是个人的看法而已,如果有任何问题虚心接受. 顾名思义,随机法就 ...
- 遗传算法解决TSP问题实现以及与最小生成树的对比
摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...
- 遗传算法解决TSP问题
1实验环境 实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48 ...
- 分布估计算法解决TSP问题
分布估计算法解决旅行商问题(TSP) TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述 ...
- C/C++贪心算法解决TSP问题
贪心算法解决旅行商问题 TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干 ...
随机推荐
- Day Six(Beta)
站立式会议 站立式会议内容总结 331 今天:完成闹钟功能,远程数据库采用bmob的解决方案,应用初始化bmob 遇到问题:闹钟没有取消提醒 以及多次设置提醒的问题 明天:修改闹钟问题,完成文件下载( ...
- 揭秘PHP匿名函数
揭秘PHP匿名函数 定义:匿名函数就是没有名字的函数. 有2种形式的匿名函数: 形式1:将一个匿名函数"赋值"给一个变量--此时该变量就代表该匿名函数了! 形式2: 是直接将一个匿 ...
- JNI系列——C文件中的方法调用Java中方法
1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...
- SharedPrefernces使用实例讲解
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- Java Native Method
一.什么是java native method? "A native method is a Java method whose implementation is provided by ...
- Ubuntu下基于Nginx实现Tomcat集群负载均衡
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述.这里,我们记录一下Nginx ...
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...
- 【POJ 1279】Art Gallery
http://poj.org/problem?id=1279 裸的半平面交的模板,按极角排序后维护一个双端队列,不要忘了最后要去除冗余,即最后一条边(或者更多的边)一定在双端队列里,但它不一定构成半平 ...
- hdu2089 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Linux的vim三种模式及命令
一般模式:在Linux终端中输入"vim 文件名"就进入了一般模式,但不能输入文字.编辑模式:在一般模式下按i就会进入编辑模式,此时就可以写程式,按Esc可回到一般模式. 命令模式 ...