// 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. 富文本KidnEditor在MVC中的应用

    最近看到很多网站后台都用到了富文本,包括自己所在的公司也是.公司用的KindEditor,所以就讲讲KindEditor.之前我也没学过,所以网上搜了一篇博文,直接转载如下(PS:完全以学习为目的哦~ ...

  2. Firefox about

    在firefox的地址栏输入about:about,然后看一下各个链接.有的链接有具体的用途,有的链接疯言疯语,并无软用. about:about集中了火狐浏览器的全部用户界面,平时常见的prefer ...

  3. Simple File System

    This is my operating system class design. scanner.h #include<string> using namespace std; #pra ...

  4. 贪吃蛇C#和JAVA实现

    using System; using System.Windows.Forms; using System.Drawing; class Window : Form { Point[] a = ]; ...

  5. my-Life项目开发流程

    一:新建java web项目  (懂得使用gradle哦!) 1.http://www.cnblogs.com/xylle/p/5234380.html 2.新建项目后,然后新建module, 如果甲 ...

  6. [转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题

    原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对 ...

  7. Placemat:快速生成占位图片器

    快速的生成一张指定大小的图片 最简单的用法就是使用以下三个网址: https://placem.at/peoplehttps://placem.at/placeshttps://placem.at/t ...

  8. Java追加文件内容的三种方法

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  9. 【BZOJ-4523】路由表 Trie树 + 乱搞

    4523: [Cqoi2016]路由表 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 155  Solved: 98[Submit][Status][ ...

  10. android下载简单工具类

    功能是实现下载文件,图片或MP3等,为了简单起见使用单线程,此代码为MarsAndroid教程的复制品,放在此处,留着参考. 首先是一个得到字节流随后保存到内存卡上的工具类: package com. ...