首页 > 其他分享 >旅行售货员问题-回溯法-深度搜索

旅行售货员问题-回溯法-深度搜索

时间:2023-05-25 17:05:56浏览次数:30  
标签:旅行 int Graph 算法 回溯 顶点 100 售货员 bestcost


问题描述:

某售货员要到若干城市去推销商品,已知各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。

算法描述:

回溯法,序列树, 假设起点为 1。

算法开始时 x = [1, 2, 3, ..., n]

x[1 : n]有两重含义 x[1 : i]代表前 i 步按顺序走过的城市, x[i + 1 : n]代表还未经过的城市。利用Swap函数进行交换位置。

若当前搜索的层次i = n 时,处在排列树的叶节点的父节点上,此时算法检查图G是否存在一条从顶点x[n-1] 到顶点x[n] 有一条边,和从顶点x[n] 到顶点x[1] 也有一条边。若这两条边都存在,则发现了一个旅行售货员的回路即:新旅行路线),算法判断这条回路的费用是否优于已经找到的当前最优回路的费用bestcost,若是,则更新当前最优值bestcost和当前最优解bestx。

若i < n 时,检查x[i - 1]至x[i]之间是否存在一条边, 若存在,则x [1 : i ] 构成了图G的一条路径,若路径x[1: i] 的耗费小于当前最优解的耗费,则算法进入排列树下一层,否则剪掉相应的子树。

代码实现:

#include <bits/stdc++.h>
using namespace std;
const int max_ = 0x3f3f3f;
const int NoEdge = -1;
int citynum;
int edgenum;
int currentcost;
int bestcost;
int Graph[100][100];
int x[100];
int bestx[100];
void InPut()
{
    int pos1, pos2, len;
    scanf("%d %d", &citynum, &edgenum);
    memset(Graph, NoEdge, sizeof(Graph));
    for(int i = 1; i <= edgenum; ++i)
    {
        scanf("%d %d %d", &pos1, &pos2, &len);
        Graph[pos1][pos2] = Graph[pos2][pos1] = len;
    }
}
void Initilize()
{
    currentcost = 0;
    bestcost = max_;
    for(int i = 1; i <= citynum; ++i)
    {
        x[i] = i;
    }
}
void Swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
void BackTrack(int i) //这里的i代表第i步去的城市而不是代号为i的城市
{
    if(i == citynum)
    {
        if(Graph[x[i - 1]][x[i]] != NoEdge && Graph[x[i]][x[1]] != NoEdge && (currentcost + Graph[x[i - 1]][x[i]] + Graph[x[i]][x[1]] < bestcost || bestcost == max_))
        {
            bestcost = currentcost + Graph[x[i - 1]][x[i]] + Graph[x[i]][x[1]];
            for(int j = 1; j <= citynum; ++j)
                bestx[j] = x[j];
        }
    }
    else
    {
        for(int j =  i; j <= citynum; ++j)
        {
            if(Graph[x[i - 1]][x[j]] != NoEdge && (currentcost + Graph[x[i - 1]][x[j]] < bestcost || bestcost == max_))
            {
                Swap(x[i], x[j]);  //这里i 和 j的位置交换了, 所以下面的是currentcost += Graph[x[i - 1]][x[i]];
                currentcost += Graph[x[i - 1]][x[i]];
                BackTrack(i + 1);
                currentcost -= Graph[x[i - 1]][x[i]];
                Swap(x[i], x[j]);
            }
        }
    }
}
void OutPut()
{
    cout << "路线为:" << endl;
    for(int i = 1; i <= citynum; ++i)
        cout << bestx[i] << " ";
    cout << "1" << endl;
}
int main()
{
    InPut();
    Initilize();
    BackTrack(2);
    OutPut();
}

测试样例:

旅行售货员问题-回溯法-深度搜索_回溯法

输入:

4 6
1 2 30
1 3 6
1 4 4
2 4 10
2 3 5

3 4 20

输出:

路线为:

1 3 2 4 1

截图:

旅行售货员问题-回溯法-深度搜索_Graph_02

标签:旅行,int,Graph,算法,回溯,顶点,100,售货员,bestcost
From: https://blog.51cto.com/u_16129621/6350066

相关文章

  • 图的m着色问题-回溯法-深度搜索
    问题描述:给定无向连通图G=(V,E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。......
  • 0-1背包问题 - 回溯法 - 深度搜索
    算法描述:0-1背包问题是子集选取问题。一般情况下,0-1背包问题是NP难得。0-1背包问题的解空间可用子集树表示。在搜索解空间的时,只要其左儿子节点是一个可行节点,搜索就进去其左子树(约束条件)。当右子树中可能包含最优解时才进入右子树搜索(限界函数)。否则就将右子树剪去。计算右子......
  • 装载问题(最优装载问题变形)-回溯法-深度搜索
    问题描述:有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi<=c1+c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。问题分析:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船......
  • 路径总和 leetcode——递归+回溯
    题目leetcode:113代码与解析这道题可以看做leetcode112和leetcode257合体这道题要遍历整棵树,把所有符合条件的路径添加进去,所以不需要返回值递归三部曲:确定参数和返回值要传入当前节点,和总和,不需要返回值确定终止条件如果当前节点没有叶子结点,并且和等于target.那么添加进r......
  • 算法学习day25回溯part02-216、17
    packageLeetCode.backtrackpart02;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;/***216.组合总和III*找出所有相加之和为n的k个数的组合,且满足下列条件:*只使用数字1到9*每个数字最多使用一次*返回所有可能的有效......
  • 旅行小记--南京和某人的第一次越野
    2023年4月15日周六14时12分,某人一时兴起报名“2023南京老山山径赛赛事-20KM双人组”。窃喜,至少5月份还可以看到某人。 2023年5月7日22时聊起5天后的相见,开始规划车票及时间问题,发现某人是真的可可爱爱又强强的。杭州-->南京 上海-->南京2023年5月8日周一12点31分......
  • 7、递归和回溯法
    内容来自刘宇波老师玩转算法面试7.1、树形问题7.2、什么是回溯7.3、排列问题7.4、组合问题7.5、回溯法解决组合问题的优化7.6、二维平面上的回溯法WordSearch7.7、floodfill算法,一类经典问题NumberofIslands-7.8、回溯法是经典人工智能的基础NQueens......
  • 混合粒子群算法—旅行商问题(TSP)优化 Matlab代码可用于路径规划,物流配送,路径优化
    混合粒子群算法—旅行商问题(TSP)优化Matlab代码可用于路径规划,物流配送,路径优化源码+注释数据可以修改多少个坐标都行帮忙改数据就是另外的价钱[旺柴]代码一经售出概不退换!望理解ID:475676436106074......
  • 遗传算法代码 旅行商问题(TSP)优化 Matlab代码可用于
    遗传算法代码旅行商问题(TSP)优化Matlab代码可用于路径规划,物流配送,路径优化源码+注释数据可以修改多少个坐标都行帮忙改数据就是另外的价钱[旺柴]代码一经售出概不退换!望理解ID:814676638908840......
  • 蚁群算法—旅行商问题(TSP)优化 Matlab代码可用于路径规划,物流配送,路径优化
    蚁群算法—旅行商问题(TSP)优化Matlab代码可用于路径规划,物流配送,路径优化源码+注释数据可以修改多少个坐标都行帮忙改数据就是另外的价钱[旺柴]代码一经售出概不退换!望理解ID:515676772863638......