动态规划解决TSP问题

题目描述

某推销员要从城市 v1 出发,访问其它城市v2,v3,…,v6 各一次且仅一次,最后返回v1。D为各城市间的距离矩阵。
问:该推销员应如何选择路线,才能使总的行程最短?

         

                                   

 

/*
编辑者 : Lin_QC
*/

#include<stdio.h>
#include<stdlib.h>
#define NODE_NUMBER 6

int D[NODE_NUMBER][NODE_NUMBER] =   //每个点之间距离的矩阵
{ 0,10,20,30,40,50,
  12,0,18,30,25,21,
  23,19,0,5,10,15,
  34,32,4,0,8,16,
  45,27,11,10,0,18,
  56,22,16,20,12,0
};
int Path[6][6];   // 行表示走到第几步,列表是当前在哪一个点,它的值表示下一个走哪
int cost[6][6] = {
	1000,1000,1000,1000,1000,1000,
	1000,1000,1000,1000,1000,1000,
	1000,1000,1000,1000,1000,1000,
	1000,1000,1000,1000,1000,1000,
	1000,1000,1000,1000,1000,1000,
	1000,1000,1000,1000,1000,1000
};   // 记录Path每一个数据的当前最优值,先初始化一个很大的值

int TSP(int step,int node ,int S)
{
	int min = 10000;
	int tmp = 10000;
	int next_node=1;
	int min_node;
	if (step == 6) {
		return D[node][0];
	}
	for (int i = 1; i <=16 ; i *= 2) {
		int t = S & i;
		if (t == i) {	
			tmp = D[node][next_node] + TSP(step +1, next_node, S - i);
			if (min > tmp)
			{
				min = tmp;
				min_node = next_node;
			}
		}	
		next_node++;
	}
	if (min < cost[step][node]) {
		Path[step][node] = min_node;
		cost[step][node] = min;
	}
	return min;

}
int main()
{
	int next_node;
	int ShortestDistance;
	ShortestDistance=TSP(1,0,31);
	printf("The Shortest distance is:%d\n",ShortestDistance);
	printf("The best Path is: 1 ");
	next_node = 0;
	for (int i = 1; i <= 5; i++) {
		printf("%d ", Path[i][next_node]+1);
		next_node = Path[i][next_node];
	}
	printf("1 \n");
	system("pause");
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值