【整理】旅行商问题(traveling salesman problem,TSP)

旅行商

一个旅行商由某市出发,经过所有给定的n个城市后,再

回到出发的城市。除了出发的城市外,其它城市只经过一

回。这样的回路可能有多个,求其中路径成本最小的回路。

蛮力【穷举】

【例4-4】旅行商问题——排列树

 计算模型

(1) 存储 图G(V, E)。以邻接矩阵的方式存储,设计如下:

 

 (2)计算 设起始点下标为0

  生成排列树。设解空间为a,则其解空间的计算过程可描述为:

  求回路代价。设sumi 是并入第i个结点的代价 :

 sumi并入第i个结点的代价= sum_i-1代入第i-1个结点的代价 + 边(i-1到i)

分支限界法:

穷举法代码:

#include<iostream>
using namespace std;

//蛮力(穷举)
//邻接矩阵
int n = 4;
int edge[4][4] = { 0,8,5,4,
				8,0,7,3,
				5,7,0,1,
				4,3,1,0 };
int vertex[4] = { 'a','b','c','d' };
int a[] = { 0,1,2,3 };//解空间
int minvalue = 10000;//当前最小值
int path[4] = { 0 };//当前解的路径
int minpath[4] = { 0 };//最优解的路径

void showpath(int a[])
{
	cout << "showpath:";
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << "\t";
	}
	//回到终点
	cout <<a[0]<< endl;
}
void copypath(int minpath[])
{
	for (int i = 0; i < n; ++i)
	{
		minpath[i] = a[i];
	}
}
int cost()//求当前路径的权值
{
	int sum = edge[0][a[0]];
	int i;
	for (i = 1; i < n; ++i)
	{
		sum += edge[a[i - 1]][a[i]];
	}
	sum += edge[a[i - 1]][0];//回到0
	return sum;
}
//递归
void EnumTSP(int i)
{
	int k, temp;
	if (i == n - 1)//最后一个结点,递归出口
	{
		if (cost() < minvalue)//当前解的权值 < 当前最小
		{
			minvalue = cost();//更新最小权值
			copypath(minpath);//赋值到最优解路径
		}
	}
	else
	{
		for (int k = i; k < n; k++)
		{
			//全排列
			temp = a[i]; a[i] = a[k]; a[k] = temp;
			//下一层递归
			EnumTSP(i + 1);
			//恢复现场
			temp = a[i]; a[i] = a[k]; a[k] = temp;
		}
	}
}

int	main()
{
	EnumTSP(0);//从第0层开始
	showpath(minpath);
	cout <<"minvalue:" << minvalue << endl;
	return 0;
}

回溯法代码:

#include<iostream>
#include<queue>
using namespace std;

//分支限界法
typedef struct node {
    bool vis[20];
    int st;//起点
    int ed;//终点
    int k;//走过的点数
    int sumv;//走过的路径距离
    int lb;//目标函数的值 下界
    int path[20];//当前路径
    //运算符重载
    bo

离已知,旅行商问题Traveling Salesman ProblemTSP)是在图论中的经典问题。它假设有若干个城市,并且每两个城市之间的距离都已知。问题的目标是找到一条路径,使得旅行商能够依次访问每个城市,并且最终回到起始城市,同时总路径长度最短。 TSP是一个NP-hard问题,意味着在一般情况下很难找到一个高效的解决算法。目前,对于TSP的求解方法主要有穷举法、贪心算法、动态规划、遗传算法等。 穷举法是一种暴力的解法,它尝试列举出所有可能的路径,并计算每条路径的总长度,最后选择其中最短的路径。这种方法适用于城市数量较少的情况,但随着城市数量的增加,计算量呈指数级增长。 贪心算法是一种局部最优策略,它从一个起始城市开始,每次选择距离最近的下一个城市作为下一个访问目标,直到遍历完所有城市。贪心算法的计算速度较快,但可能得到的结果并不一定是最优解。 动态规划是一种针对TSP的优化算法,通过利用子问题的最优解来构造整体解。它将问题分解为多个子问题,并通过递归计算子问题的最优解,最终得到整体的最优解。动态规划的时间复杂度为O(n^2*2^n)。 遗传算法是一种启发式的优化算法,它模拟自然界中的遗传进化过程。通过对路径进行交叉、变异等操作,逐步优化路径长度,最终找到近似最优解。遗传算法能够处理大规模的TSP问题,但结果通常只是近似最优解。 总之,TSP是一个经典的图论问题,已经有人提出了多种求解方法。根据问题的规模和对结果要求的不同,可以选择适用的解决算法。然而,由于TSP的复杂性,要找到真正的最优解仍然是一个挑战。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值