// 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. VMware精简系统Win系列|体积更小更稳定

    此Win系列基于VMware10 给个我自用的超精简VM10.0.3 XP重新制作体积大了一点但更稳定,压缩包166M 制作了Win 2003,压缩包171.4M Win7重新制作体积更小更稳定,压缩 ...

  2. 【前端积累】createElement createTextNode

    <!DOCTYPE html> <html><!--树根--> <head> <meta charset="utf-8"> ...

  3. LVS+MYCAT+读写分离+MYSQL主备同步部署手册

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  4. 1118ALTER TABLE tabname DISCARD TABLESPACE快速导入数据利用表空间

    -- 快速导入数据如果你有.ibd文件的一个干净的备份,你可以按如下操作从被起源的地方恢复它到MySQL安装中:相当快速 1. 发出这个ALTER TABLE语句: 2. ALTER TABLE tb ...

  5. Maven遇到的错误汇总

    使用工具是MyEclipse10: 1.创建Maven项目出错 1.项目名带有Maven Webapp 解决方案: 2.缺少jar could not resolve archetype :   Co ...

  6. Smarty单模板多缓存

    Smarty单模板多缓存 单模板多缓存 在生成缓存.判断缓存是否存在时,增加第二个参数,会根据第二个参数来确定对应的缓存文件 清除缓存

  7. jQuery能做些什么

    来源于: Learning jQuery, 4th Edition What jQuery does: 1. Access elements in a document; $('div.content ...

  8. iOS开发--二维码的生成

    一.需要包含头文件 #import <CoreImage/CoreImage.h> 二.示例代码 -- 以下生成的二维码不够清晰 如图: - (void)touchesBegan:(NSS ...

  9. python 进程间共享数据 (一)

    def worker(num, mystr, arr): num.value *= 2 mystr.value = "ok" for i in range(len(arr)): a ...

  10. bzoj1787

    lca裸题,画画图看看就可以了,找出那个一次公共祖先,求距离 #include<iostream> #include<set> #include<cstring> ...