// 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问题的更多相关文章

  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. 内网穿透神器ngrok——将本地项目驾到外网

    相信做Web开发的同学们,经常会遇到需要将本地部署的Web应用能够让公网环境直接访问到的情况,例如微信应用调试.支付宝接口调试等.这个时候,一个叫ngrok的神器可能会帮到你,它提供了一个能够在公网安 ...

  2. 安装win10

    1.百度win10,看到的大都是雨林木风,ghost等江湖杂牌非原版系统.百度”msdn,我告诉你“进入微软MSDN下载中心(原来还有这么个好地方,以后就从这里下了),下载链接是ed2k格式的链接(e ...

  3. 最棒的10款MySQL GUI工具

    绝大多数的关系数据库都明显不同于MS Access,它们都有两个截然不同的部分:后端作为数据仓库,前端作为用于数据组件通信的用户界面.这种设计非常巧妙,它并行处理两层编程模型,将数据 层从用户界面中分 ...

  4. hibernate查询返回一个list ,Date类型追加数据

    public Pagination getLookPage(BeanPatrolScheduling beanPatrolScheduling, int pageNo, int pageSize) { ...

  5. 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率

    2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1638  Solved: 433[Submit][Statu ...

  6. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  7. Bzoj3510首都

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. C# winform窗体设计-通过条件查询数据

    在winform 数据库设计中,有时候需要通过条件查询对应的数据,并且将数据显示在文本框(or 富文本框)中,下面,小编将讲述通过一个条件: 首先,我们需要对数据库建立连接,并且执行数据库命令,在此之 ...

  9. USACO 3.4 Electric Fence 皮克定理

    题意:在方格纸上画出一个三角形,求三角形里面包含的格点的数目 因为其中一条边就是X轴,一开始想的是算出两条边对应的数学函数,然后枚举x坐标值求解.但其实不用那么麻烦. 皮克定理:给定顶点坐标均是整点( ...

  10. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...