题目
TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。
这个问题迄今为止各种算法只是求当前情况下的最优情况,无法得出统一的求解方式。
下面是两种不同的算法实现,注释部分给的很详细。
//动态规划和贪心法求解tsp问题
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
#define inf 1000000
/*
贪心法使用最近邻接点策略,来求解tsp问题。
大致的思路是:
P[]:存储所经历的点的一维数组,初始化为一个结点即结点0,P[i]=j代表第i步是经历第j个节点
V[]:存储未经历的点的一维数组,初始化为除结点0外的全部结点,V[i]=i代表第i个节点,一旦某个节点被选进P,那么该节点的值设置为inf,即V[i]=inf
path[]:存储路线的,初始化为inf,path[i]=j:第i步要走的路的长度是j
邻接矩阵中两点之间没有路用路经长为inf表示
1.确定好出发点
2.把出发点作为第0个点,重新对邻接矩阵进行构造,构造成一个以出发点为第0个点的邻接矩阵
3.设定当前走到的结点是p
4.从V中遍历寻找一个最优的结点v,使得p和v的距离最近:这个判断要包括:p和v之间有路,而且dis(p,v)<=dis(p,x),x表示V中和v不同的任意一点
5.P=P+v,V=V-v。path[i]=distance(p,v)
6.如果V不空,则执行第3步;如果V空,则程序结束。返回结果即可
*/
//传入的参数中二维指针martix代表邻接矩阵,而num代表城市的数目
void greedPath(double martix[][5], int num){
//首先是初始化工作
double path[num]={
0};
int V[num]={
0};
for(int i=0;i<num;i++){
if(i==0){
V[i]=inf;
}else
{
V[i]=i;
}
}
int P[num]={
0};
//下面是主要代码部分
/*
要考虑P和V中的顶点怎么表示,每执行到第i步,当前的顶点p就用顶点P[i]表示,
每执行到第i步,V中的顶点就要减少i个,但是我们不知道前i-1步从V中剔除的顶点是什么,所以每次遍历的时候就要
再多一层遍历,遍历V数组,并进行判断:当前遍历到的该节点没有被剔除而且和p[i]之间有路可走而且这条路的长度是不是最小的
*/
for(int i=0;i<num-1;i++){
double min=inf;
//从第1个顶点开始遍历判断
for(int j=1;j<num;j++){
//有路,而且没有被剔除
if(martix[P[i]]