模拟退火解决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世纪初提出.问题描述如下: 有若干 ...
随机推荐
- rar 命令
1 wger http://www.rarlab.com/rar/rarlinux-3.9.2.tar.gz 下载文件包 会下载在当前目录 2 cp xxx.xxx ../ 复制xxx.xxx到上个目 ...
- 50-ln 简明笔记
为文件建立链接 ln [options] existing-file [new-link] ln [options] existing-file-list directory ln可以为一个或多个文件 ...
- 0921MySQL 报错 ERROR 1290 (HY000): running with the --secure-file-priv
http://blog.itpub.net/26506993/viewspace-2121850/ mysql> show variables like '%secure%';+-------- ...
- ClassLoader 详解及用途
ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. 1.1 几个相关概念Class ...
- mysql查询时间戳和日期的转换
mysql提供了两个函数: from_unixtime(time_stamp) -> 将时间戳转换为日期 unix_timestamp(date) -> 将指定的日期或者日期字符串转换为时 ...
- Android中图像变换Matrix的原理、代码验证和应用(二)
第二部分 代码验证 在第一部分中讲到的各种图像变换的验证代码如下,一共列出了10种情况.如果要验证其中的某一种情况,只需将相应的代码反注释即可.试验中用到的图片: 其尺寸为162 x 251. 每种变 ...
- 10 函数的复写-override
1.函数的复写:override 2.使用super调用父类的成员函数 class Person { String name; int age; void introduce() { System.o ...
- NPOI简介
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. (一)传统操作Excel遇到的问题: 1.如果是.NET,需要在服务器端 ...
- 【poj1061】 青蛙的约会
http://poj.org/problem?id=1061 (题目链接) 题意 两只青蛙在周长为L的球上沿一条直线向一个方向跳,每只每次分别跳m,n米,它们一开始分别在X,Y处,问跳几次两青蛙可以在 ...
- 【poj3122】 Pie
http://poj.org/problem?id=3122 (题目链接) 题意 给出N个pie的半径和F个friend,每个friend得到的pie必须一样,求每个人能得到的pie的最大大小. so ...