【回溯算法】旅行商问题--TSP问题

这篇具有很好参考价值的文章主要介绍了【回溯算法】旅行商问题--TSP问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【问题描述】

一销售商从n个城市中的某一城市出发,不重复地走完其余n—1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。本题假定该旅行商从第1个城市出发。

输入

对每个测试例,第1行有两个整数:n(4≤n≤10)和m(4≤m≤20 ) ,n是结点数,m是边数。

接下来m行,描述边的关系,每行3个整数:(i,j),length,表示结点i到结点j的长度是length。

当n=0时,表示输入结束。

输出

对每个测试例,输出最短路径长度所经历的结点,最短的长度。

输入样例

4 6

1 2 20

1 4 4

1 3 6

2 3 5

2 4 10

3 4 15

0

输出样例

1 3 2 4

25

【算法分析】

旅行商问题的解空间是一棵排列树。 开始时,x={1,2,…,n},相应的排列树由x的全排列构成。

TSP问题(Traveling Salesman Problem)通常称为旅行商问题,也称为旅行售货员问题、货担郎问题等,是组合优化中的著名难题,也是计算复杂性理论、图论、运筹学、最优化理论等领域中的一个经典问题,具有广泛的应用背景。

问题的一般描述为:旅行商从n个城市中的某一城市出发,经过每个城市仅有一次,最后回到原出发点,在所有可能的路径中求出路径长度最短的一条。

设G=(V, E)是一个带权图,其每一条边(u, v)∈E的费用(权)为正数w(u, v)。目的是要找出G的一条经过每个顶点一次且仅经过一次的回路,即汉密尔顿(Hamilton)回路v1,v2 ,…,vn ,使回路的总权值最小:【回溯算法】旅行商问题--TSP问题

【回溯算法】旅行商问题--TSP问题 文章来源地址https://www.toymoban.com/news/detail-481171.html

【代码部分】 

//旅行商问题回溯算法的数据结构

#define NUM 100
int n;				//图G的顶点数量
int m;				//图G的边数
int a[NUM][NUM];		//图G的邻接矩阵
int x[NUM];			//当前解
int bestx[NUM];		//当前最优解向量
int cc;				//当前费用
int bestc;			//当前最优值
int NoEdge = -1;		//无边标记
//在构造邻接矩阵a时,其初始值应为NoEdge:
for (i=0; i<NUM; i++)
  for (j=1; j<NUM; j++)
    a[i][j] = NoEdge;

//最优值和向量x的初始化数值如下:
bestc = NoEdge;
for(i=1; i<=n; i++)
  x[i] = i;
//旅行商问题回溯算法的实现
//形参t是回溯的深度,从2开始
void Backtrack(int t)
{
  //到达叶子结点的父结点
  if(t==n)
  {
    if(a[x[n-1]][x[n]]!= NoEdge && a[x[n]][1]!= NoEdge && 
      (cc + a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc== NoEdge))
    {
      for(int i=1; i<=n; i++)
        bestx[i] = x[i];
      bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];
    }
    return;
  }
else 
  {
    for(int i=t; i<=n; i++)
    {
      if(a[x[t-1]][x[i]]!= NoEdge &&
        (cc + a[x[t-1]][x[i]]< bestc||bestc == NoEdge))
      {
        swap(x[t],x[i]);
        cc += a[x[t-1]][x[t]];
        Backtrack(t+1);
        cc -= a[x[t-1]][x[t]];
        swap(x[t],x[i]);
      }
    }
  }
}

//完整实现
#include <iostream>
using namespace std;

#define NUM 100
int n;
int m;
int a[NUM][NUM];
int x[NUM];
int bestx[NUM];
int cc;
int bestc;
int NoEdge = -1;

void Backtrack(int t)
{
	if(t==n)
	{
		if(a[x[n-1]][x[n]]!= NoEdge && a[x[n]][1]!= NoEdge && 
			(cc + a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc== NoEdge))
		{
			for(int i=1; i<=n; i++)
				bestx[i] = x[i];
			bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];
		}
		return;
	}
	else 
	{
		for(int i=t; i<=n; i++)
		{
			if(a[x[t-1]][x[i]]!= NoEdge &&
				(cc + a[x[t-1]][x[i]]< bestc||bestc == NoEdge)) 
			{
				swap(x[t],x[i]);
				cc += a[x[t-1]][x[t]];
				Backtrack(t+1);
				cc -= a[x[t-1]][x[t]];
				swap(x[t],x[i]);
			}
		}
	}
}

int main() 
{
	int i, j;
	int from, to, length;
	while (scanf("%d%d", &n, &m) && n) 
	{
		for (i=0; i<NUM; i++)
			for (j=1; j<NUM; j++)
				a[i][j] = NoEdge;
		for (i=0; i<m; i++)
		{
			scanf("%d%d%d", &from, &to, &length);
			a[from][to] = length;
			a[to][from] = length;
		}
		bestc = NoEdge;
		for(i=1; i<=n; i++)
			x[i] = i;
		Backtrack(2);
		for(j=1; j<=n; j++)
			printf("%d ", bestx[j]);
		printf("\n%d\n", bestc);
	}	
	return 0;
}

到了这里,关于【回溯算法】旅行商问题--TSP问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++动态规划解决TSP(旅行商)问题

    题目描述: 某旅行商希望从某城市出发经过一系列的城市最后再回到出发的城市。这些城市之间均可直航,他希望只经过这些城市一次且旅行的总线路最短。设有n个城市,城市的编号从1到n。 输入第一行为整数n,表示城市的数量。其后n行,每行有n个整数,用空格隔开,表

    2024年02月03日
    浏览(28)
  • 旅行商问题 Traveling Salesman Problem(TSP)

    一个商人从一点出发,经过所有点后返回原点。 目标:经过所有点的最短路程。 约束: 1,除起点和终点外,所有点当且仅当经过一次; 2,起点与终点重合;所有点构成一个连通图 图论解释:该问题实质是在一个带权完全无向图中,找一个权值最小的哈密尔顿回路 哈密尔

    2024年02月03日
    浏览(28)
  • 旅行商问题(TSP)及Python图论求解

    旅行商问题(Traveling Salesman Problem, TSP)是指给定一个城市的集合以及每两个城市之间的距离,找到一条经过每个城市恰好一次且路径最短的回路。 可以想象成一个旅行商要拜访多个城市,问他如何安排路线,使得行程最短。这个问题可能看起来简单,但是随着城市数量的增

    2024年02月12日
    浏览(25)
  • Hopfield神经网络求解旅行商(TSP)问题matlab代码

            1.网络结构         连续Hopfield神经网络(Continuous Hopfield Neural Network,CHNN)的拓扑结构和离散Hopfield神经网络的结构类似,如图11-1所示。连续Hopfield网络和离散Hopfield 网络的不同点在于其传递函数不是阶跃函数,而是连续函数。         与离散型Hopfield神经网络不

    2024年02月14日
    浏览(28)
  • 强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

    Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获得的累积奖励。 Q-learning的训练过程如下: 1. 初

    2024年02月03日
    浏览(29)
  • python实现大规模邻域搜索(LNS)求解旅行商问题(TSP)

    参考《Handbook of Metaheuristics (Third Edition)》中的Large neighborhood search章节, 建议直接阅读英文原版 大规模邻域搜索(LNS) 属于超大邻域搜索(Very Large-Scale Neighborhood Search, VLNS)的一类 ,随着算例规模的增大,邻域搜索算法的邻域规模呈指数增长或者当邻域太大而不能在实际中明确搜索

    2024年02月08日
    浏览(31)
  • 基于JAVA+Springboot+Thymeleaf前后端分离项目:助农农产品销售商城系统设计与实现

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年02月20日
    浏览(47)
  • 基于回溯法求解旅行售货员问题

    一、实验目的 1.掌握基于回溯的算法求解旅行商问题的原理。 2.掌握编写回溯法求解旅行商问题函数的具体步骤并理解回溯法的核心思想以及其求解过程。 3.掌握子集树以及其他几种解空间树的回溯方法并具备运用回溯算法的思想设计算法并用于求解其他实际应用问题的能力

    2024年02月09日
    浏览(30)
  • 回溯法--旅行售货员问题--排列树

    回溯法有点类似于 暴力枚举 的搜索过程,回溯法的基本思想是按照深度优先搜索的策略,从根节点出发深度搜索解空间树,当搜索到某一节点时,如果该节点可能包含问题的解,则继续向下搜索;反之回溯到其祖先节点,尝试其他路径搜索。 第一类问题:只要求求得一个可

    2024年02月05日
    浏览(26)
  • 旅行商问题(枚举,回溯,动态规划,贪心,分支界限)

    假设有一个货郎担要拜访n个城市,他必须选择所要走的路程,路程的限制时每个城市只能拜访一次,而且最后要走到原来出发的城市,要求路径长度。 旅行商问题将要走过的城市建立成一个完全图。稠密图,所以用临接矩阵来存。 由于路径的特殊性,可以正走也可以反着走

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包