TSP问题解读

TSP问题—贪心算法(greedy algorithm)

TSP问题

问题描述如下:
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

贪心算法(greedy algorithm)

贪心算法:又称贪婪算法。当前情况下的最好选择,否则将来可能会后悔,故名“贪心”。这种算法策略,每次的选择都是局部最优解。选择的策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

	step0: 初始化,当前点位第一个访问城市
	step1: 遍历剩下所有点。
	step2: 是否被访问过,是就跳过此点,否就判断是否是最短路径。
	step3: 是就继续执行。否就到下个点,跳到step2。
	step4: 最短路径就记录下当前点,并标记被访问过。并将此点设为当前点。
	setp5: 判断是否最后一个点,否就跳至step0,是就结束。

代码如下:


#include<iostream>
using namespace std;
int main()
{
	int i,j,k;
	int n;
	cin>>n;
	int s[n];//记录遍历的顺序 
	int D[n][n];
	for(i=0; i<n; i++){//输入两个城市之间的顺序 
		for(j=0; j<n; j++){
			cin>>D[i][j];
		}
	}
	int sum = 0;//记录距离
	int Dtemp = 10000;
	int l;
	int flag = 0;
	i = 1;
	s[0] = 0;//代表第一个城市已经被访问 
	do{
		k = 1;Dtemp = 10000;
		do{
			l = 0;flag = 0;
			do{
				if(s[l] == k){
					flag = 1;
					break;
				}
				else l++;
			}while(l<i);
			if(flag == 0 && D[k][s[i-1]] <Dtemp){
				j = k;//保留距离i-1最短的城市 
				Dtemp = D[k][s[i-1]];//保留最短的距离 
			}
			k++;
		}while(k<n);
		s[i] = j;//将访问的城市记录
		cout<<Dtemp<<endl; 
		sum+=Dtemp;//距离累加 
		i++; 
	}while(i<n);
	sum+=D[0][j];
	cout<<D[0][j]<<endl;
	cout<<"最短路径为:";
	for(i=0; i<n; i++){
		cout<<s[i]<<" ";
	}
	cout<<endl;
	cout<<"最短距离为:"<<sum<<endl;
	return 0;
} 

总结

最近项目上有个类似问题,找出当前巡逻网的最优路径,我们使用的也是贪心算法求解。网上找了相关资料,简单的记录了下TSP问题和贪心算法。还有很多关于TSP问题,可参考文献【2】。当然贪心算法并不是最优解,只是当前局部自由解,项目暂时够用。

参考

  1. https://blog.csdn.net/qq_40883132/article/details/79338167
  2. https://blog.csdn.net/yjr3426619/article/details/83387962
  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值