模拟退火解决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世纪初提出.问题描述如下: 有若干 ...
随机推荐
- jquery slide使用总结
.slideUp([duration][,complete])--目标元素向上滑入隐藏: .slideDown([duration][,complete])--目标元素向下滑出显示: .slideTo ...
- Android:View随手指移动
View的自动移动,我们可以设置动画,如之类提到的 ViewCompat,Animation. 如何是View随着手指的移动而移动呢? 在onTouch事件实现 @Overridepublic boo ...
- iOS开发小技巧--iOS8之后的cell自动计算高度
cell高度自动计算步骤:
- mysql 注释
mysql> SELECT 1+1; # This comment continues to the end of line mysql> SELECT 1+1; -- This comm ...
- ActiveMQ(八)_多集群的负载均衡
图一 图一说明: 1.集群一包含3个队列:A ...
- XML与 HTML
XML是E4X中定义的一个重要的新类型,侧重于如何结构化描述信息,用它来表现XML结构中任何独立的部分,是一种用于标记电子文件使其具有结构性的标记语言. XML语言被设计用来描述数据,它的焦点是数据的 ...
- java 读取数据库中表定义
将数据库中的表信息读取出来 package com.cloud.smartreport.utils; import java.sql.Connection; import java.sql.Datab ...
- xml序列化方式
public static class MySerializeXmlHelper { static MySerializeXmlHelper() { } private static object _ ...
- 浅谈malloc()与free()
malloc()与free() l 函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...
- python调用模块&函数
一般模块是抽象的概念,按照功能划分模块,尽可能保证每个模块互相独立. 一般模块里有多个函数.当然,如果你愿意,也可以把一个几个模块写进一个大函数.对于python 模块,每个模块可以包含多个函数,但一 ...