资源简介
最近邻策略(NearestNeighbor)解决TSP问题的算法实现——是基于贪心思想;
最短链路策略(ShortestLinkedHeuristic)解决TSP问题的算法实现——也是基于贪心算法,但与上述实现细节有所不同;
最短插入启发式策略(NearestInsertion)解决TSP问题的算法实现——插入启发式策略基本思想是对由|V|个城市的某m个城市所构成的回路,陆续地选择一个未在回路中的城市,然后插入到该回路,使得引起的权和的改变量最小。重复上述过程,直到所有的城市被插入。根据选择待插入城市的不同,插入启发式策略包括最近点插入、最远点插入以及随机插入法。
代码片段和文件信息
/*
Function:采用最近插入启发式算法计算TSP问题
其思想是:从TSP路径只含一个节点始态出发,每次从剩余节点中找出离TSP路径中
新近加入的节点最近的点(此处我不知理解是否正确),标记此节点vk为已访问;
然后找出将此vk节点加入到某边的两个节点中间时,能够使加入后的代价最小的这样的
边,修改这个边的路径,使其两个节点要能够连接起来的话,需要经过中间节点vk;如此
进行下去,直到所有的节点都在TSP路径中
Date:2012/5/2
Author:黄其华
*/
#include
#include
using namespace std;
#define N 50
typedef struct _edge
{
int weight;
int start;
int end;
}Edges;
/*
int Sets[N]; //顶点集
*/
Edges Result[N*(N-1)/2]; //因为是完全无向图
Edges endEdge; //路径的起始端点
int n=0; //代表顶点数
int NearestInsertion(int v0bool visited[]int dis[][N])
{
int m=0k=0vk=v0vj;
int cost=0;
Result[1].start=v0; //先初始结点
Result[1].end=v0;
Result[1].weight=0;
while(1)
{
int min=10000;
//找离TSP路径中已有点后一个点最近的点
for(int i=1;i<=n;i++)
if(!visited[i]&&min>dis[vk][i])
{
vj=i;
min=dis[vk][i];
//visited[i]=true;
}
vk=vj; //记下最后加入到TSP路径中的顶点
visited[vj]=true;
if(Result[1].weight==0) //如果是TSP路径中只有一个节点的情况
{
Result[1].end=vk;
endEdge.end=vk;
m++;
Result[1].weight=dis[Result[1].start][vk];
cost+=Result[1].weight;
continue;
}
int minW=10000;
int p=1;
for(p;Result[p].weight!=0&&p<=n*n-1;p++)
{
if(minW>dis[Result[p].start][vk]+dis[vk][Result[p].end]-Result[p].weight) //选边
{
k=p;
minW=dis[Result[p].start][vk]+dis[vk][Result[p].end]-Result[p].weight;
//m++;
}
}
//replace Result[i] with new Result[i]and Result[k] with new value
m++;
int tmpStart=Result[k].start;
int tmpEnd=Result[k].end;
Result[k].start=Result[k].start;
Result[k].end=vk;
Result[k].weight=dis[Result[k].start][vk];
Result[p].start=vk;
Result[p].end=tmpEnd;
Result[p].weight=dis[Result[p].end][vk];
cost+=minW;//Result[k].weight;
if(m==n-1) //已有了n个结点
break;
}
return cost;
}
int main()
{
scanf(“%d“&n);
int dis[N][N]; //距离矩阵
memset(dis0N*N*sizeof(int)); //对距离矩阵初始化为0,所以,为防止后面的过程中出现对0编号的干扰,所有顶点从1开始编号
memset(Result0N*(N-1)/2*sizeof(Edges));
/*
for(int i=1;i<=n;i++)
Sets[i]=i; //从1开始编号
*/
//接收输入距离矩阵
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
scanf(“%d“&dis[j][k]);
bool visited[N];
memset(visitedfalseN*sizeof(bool)); //用来标记某个结点是否访问过
int v0=rand()%(n-1+1)+1; //随机生成1到n的数作为初始的TSP路径的起点
endEdge.start=v0;
visited[v0]=true;
int cost=NearestInsertion(v0visiteddis);
for(int i=1;Result[i].weight!=0;i++)
printf(“\nstart:%d end:%d weight:%d\n“Result[i].startResult[i].endResult[i].weight);
endEdge.weight=dis[endEdge.start][endEdge.end];
printf(“cost:%d\n“cost+endEdge.weight);
system(“pause“);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 794 2012-05-02 20:23 实验14\NearestInsertion\Debug\cl.command.1.tlog
文件 8880 2012-05-02 20:23 实验14\NearestInsertion\Debug\CL.read.1.tlog
文件 552 2012-05-02 20:23 实验14\NearestInsertion\Debug\CL.write.1.tlog
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 2 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 1888 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 3128 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 1218 2012-05-02 20:23 实验14\NearestInsertion\Debug\li
文件 33965 2012-05-02 20:23 实验14\NearestInsertion\Debug\main.obj
文件 510 2012-05-02 20:23 实验14\NearestInsertion\Debug\mt.command.1.tlog
文件 566 2012-05-02 20:23 实验14\NearestInsertion\Debug\mt.read.1.tlog
文件 498 2012-05-02 20:23 实验14\NearestInsertion\Debug\mt.write.1.tlog
文件 3116 2012-05-02 20:08 实验14\NearestInsertion\Debug\NearestInsertion.Build.CppClean.log
文件 406 2012-05-02 20:08 实验14\NearestInsertion\Debug\NearestInsertion.exe.em
文件 472 2012-05-02 20:08 实验14\NearestInsertion\Debug\NearestInsertion.exe.em
文件 381 2012-05-02 20:23 实验14\NearestInsertion\Debug\NearestInsertion.exe.intermediate.manifest
文件 95 2012-05-02 20:23 实验14\NearestInsertion\Debug\NearestInsertion.lastbuildstate
文件 3270 2012-05-02 20:23 实验14\NearestInsertion\Debug\NearestInsertion.log
文件 222 2012-05-02 20:08 实验14\NearestInsertion\Debug\NearestInsertion_manifest.rc
文件 762 2012-05-02 20:08 实验14\NearestInsertion\Debug\rc.command.1.tlog
文件 470 2012-05-02 20:08 实验14\NearestInsertion\Debug\rc.read.1.tlog
文件 478 2012-05-02 20:08 实验14\NearestInsertion\Debug\rc.write.1.tlog
文件 207872 2012-05-02 20:23 实验14\NearestInsertion\Debug\vc100.idb
文件 233472 2012-05-02 20:23 实验14\NearestInsertion\Debug\vc100.pdb
文件 3015 2012-05-02 20:22 实验14\NearestInsertion\main.cpp
文件 3926 2012-05-02 13:12 实验14\NearestInsertion\NearestInsertion.vcxproj
............此处省略76个文件信息
相关资源
- TSP城市问题145个城市数据及其相应的
- 遗传算法解决TSP旅行商问题程序开源
- 将rtsp转码为flv格式用于h5播放前端使
- 5种多旅行商问题(MTSP)的遗传算法
- rtsp-h264.zip
- 免疫算法求解TSP问题详解
- websocket-rtsp-proxy-test.zip
- TSP问题测试数据集
- MP4v2录制rtsp流存为MP4文件
- rtsp摄像头推流上云使用浏览器播放
- Gprint 条码机 TSPL 中文编程手册蓝牙打
- PocketSphinxDemo
- 人工鱼群 求解tsp 14城
-
ijkpla
yer 最新rtsp .ts so库 - rtsp大全
- rtsp视频组帧(tcp和udp)
- TSP问题的数模论文合集
- TSP问题测试数据和最优结果含100多组
-
能够播放rtsp的ijkpla
yer动态库 - 离散数学实验TSP旅行商问题的代码实
- qt5.8实现rtsp流播放
- TSPLIB数据集、使用方法及最优解
- Setup for TheBestSpinner
- 满足三角不等式的TSP问题的近似算法
- RtspRtcpRtpLoad_h264.tar.gz
- live555通过VS2013编译,自己整理的,附
- 简单的RTSP RTP RTCP推送H264码流服务器实
- 支持高版本谷歌播放rtsp的插件vxg me
- rtsp 服务器代码,VC可编译使用,RTS
- RTSP流媒体客户端播放器demo
评论
共有 条评论