穷举查找之旅行商问题、背包问题、分配问题

博客探讨了穷举查找在解决组合问题如旅行商问题和背包问题时的低效性,指出这些问题属于NP困难类别。同时介绍了分配问题,一个可以通过穷举查找解决但效率极低的例子,尽管存在更高效的匈牙利方法。
摘要由CSDN通过智能技术生成

穷举查找

对于组合问题来说,穷举查找是一种简单的蛮力算法。它要求生成问题域中的每一个元素,选出其中满足问题约束的元素,然后再找出一个期望元素。

旅行商问题

简单来说,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到出发的城市之前,对每个城市都只访问一遍。这个问题可以很方便地用加权图来建模,也就是说,用图的顶点代表城市,用边的权重表示城市间的距离。这样该问题就可以表述为求一个图的最短哈密顿回路问题。

哈密顿回路:一个对图的每个顶点都只穿越一次的回路

对于四个点都连通的图,我们假定从a点出发,可以将获得(4-1)!条路径(公式(n-1)!),但是需要注意的是,如果没有假定起点,那么这个问题的规模将增大n倍
在这里插入图片描述
对于图中的例子,其实我们发现它们是两两成对的,同对之间不同的仅仅是方向,因此,我们可以将路径总数减半(n-1)!/2,但是,显然,这并没有提高太大的效率。

背包问题

这是计算机科学中另一个著名的问题。给定n个重量为 w 1 , w 2 , . . . , w n , w_1,w_2,...,w_n, w1,w2,...,wn,价值为 v 1 , v 2 , . . . , v n v_1,v_2,...,v_n v1,v2,...,vn的物品和一个承重为W的背包,求这些物品中一个最优价值的子集,并且要能够装到背包中。
在这个问题中,穷举查找需要考虑给定的n个子集,为了找出可行的子集(也就是说,总重量不超过背包承重能力的子集),要计算出每个子集的总重量,然后在它们中间找到价值最大的子集。因为一个n元素集合的子集数量为 2 n 2^n 2n个,所以无论生成独立子集的效率有多高,穷举查找都会导致一个 Ω ( 2 n ) \Omega(2^n) Ω(2n)的算法。如下例子:
在这里插入图片描述

因此无论是对旅行商问题还是背包问题,穷举查找型算法对于任何输入都是非常低效的。实际上,这两个问题就是所谓的NP困难问题中最著名的例子。

分配问题

对于可以穷举查找求解的问题,我们再举第三个例子:有n个任务需要分配给n个人执行,一个任务对应一个人(意思是说:每个任务只分配一个人,每个人只分配一个任务)。对于每一对i,j=1,2,…,n来说,将第j个任务分配给第i个人的成本是C[i,j],该问题要找出总成本最小的分配方案。
下面是该问题的一个小规模的实例,表中的数值代表的是分配成本C[i,j]
在这里插入图片描述
很容易发现,分配问题的实例完全可以用它的成本矩阵C来表示。就这个矩阵来说,这个问题要求在矩阵的每一行中选出一个元素,这些元素分别属于不同的列,而且元素的和是最小的。请注意,求解该问题并没有一个显而易见的策略。例如,我们不能选择每行中的最小元素,因为这些元素可能属于同一列。实际上,整个矩阵的最小元素并不一定是最优解的一部分。下面是上面例子的答案:
在这里插入图片描述

由于在分配问题的一般情况下,需要考虑的排列数量是n!,所以除了该问题的一些规模非常小的实例,穷举查找法几乎不实用。幸运的是,对于该问题有一个效率高得多的算法,叫匈牙利方法。

笔者打算先把穷举的情况先了接了,再深入后面的改良,穷举算法的改进版后续会再做补充

### 回答1: 分治法:分治法是将一个大的复杂问题分解为若干个小的相对简单的子问题,再求解每个子问题,最终求得整个问题的解。优势:把大问题分成若干个小问题,每个小问题都相对容易求解;应用场合:分治法在算法设计中应用最广泛的是求解最近点对问题,也可以用于求解其他问题,如求最大子序列、求极大子矩阵等;时间复杂度:T(n)=2T(n/2)+O(n);空间复杂度:O(logn)。贪心法:贪心法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。优势:有时可以得到一个比较好的解;应用场合:贪心法应用最广泛的是用于最优化问题,如最小费用流、最短路径、最大化利润等;时间复杂度:O(n);空间复杂度:O(1)。动态规划法:动态规划法是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。优势:可以把复杂问题转换为更容易求解的子问题;应用场合:动态规划最常用于求解最优化问题,比如最小路径、最大子序列等;时间复杂度:O(n^2);空间复杂度:O(n^2)。回溯法:回溯法是一种暴力搜索算法,它尝试利用递归搜索每一种可能的结果,从而找到最优解。优势:可以找到一个最优解;应用场合:回溯法常用于具有约束条件的优化问题,如八皇后问题、求解背包问题等;时间复杂度:O(n^k),其中k是问题的约束条件;空间复杂度:O(n)。分支限界法:分支限界法是一种将复杂问题分解为子问题的方法,它利用一些策略来减少子问题的数量,以达到降低时间复杂度的目的。优势:可以降低时间复杂度;应用场合:分支限界法常用于具有约束条件的优化问题,如旅行商问题、求解背包问题等;时间复杂度:O(bn),其中b为分支因子;空间复杂度:O(h),其中h为树的高度。 ### 回答2: 分治法:将问题划分为子问题,并分别解决每个子问题,最后合并子问题的解来得到原问题的解。性质是问题可以被划分为规模较小的子问题。特点是适用于问题的结构可划分且子问题之间相互独立。优势是能够降低问题的复杂度。应用场合包括排序算法图论、动态规划等。时间复杂度通常为O(nlogn),空间复杂度为O(n)。 贪心法:每一步都选择当前情况下最优解,希望最终能得到全局最优解。性质是当前最优解可以导致全局最优解。特点是简单、高效,但不一定能得到最优解。优势是时间复杂度低。应用场合包括背包问题、调度问题等。时间复杂度通常为O(nlogn),空间复杂度为O(1)。 动态规划法:将问题划分为子问题,并存储子问题的解,通过递推式求解问题。性质是问题具有重叠子问题最优子结构。特点是能够避免重复计算子问题,提高效率。优势是能够求解多阶段决策问题。应用场合包括最短路径问题背包问题等。时间复杂度通常为O(n^2),空间复杂度为O(n)。 回溯法:通过枚举所有可能的解,并逐步构建候选解,当候选解满足问题要求时,得到正确解。性质是能够穷举所有可能的解空间。特点是需要搜索整个解空间,效率较低。优势是能够解决部分可行解的问题。应用场合包括八皇后问题旅行商问题等。时间复杂度通常较高,取决于搜索树规模,空间复杂度为O(n)。 分支限界法:通过剪枝策略来减少搜索空间,从而提高搜索效率。性质是将问题划分为子问题,采用优先队列或优先级队列进行搜索。特点是能够剪枝去除不必要的子问题。优势是能够解决大规模问题。应用场合包括旅行商问题、任务调度问题等。时间复杂度取决于搜索的深度、剪枝效果优先队列的使用情况,空间复杂度为O(n)。 ### 回答3: 分治法: 性质:将一个大的问题划分为多个子问题,子问题可以独立求解。 特点:递归地将问题划分为更小的子问题,然后将各个子问题的解合并起来得到原问题的解。 优势:容易理解实现,能够解决大规模问题。 应用场合:排序算法(如归并排序、快速排序)、查找问题(如二分查找)等。 时间复杂度:一般为O(nlogn)。 空间复杂度:一般为O(n)。 贪心法: 性质:通过每次选择局部最优解来构建全局最优解。 特点:每次做出选择时,只考虑当前局部最优解,不考虑未来的结果。 优势:简单、高效,适用于求解一些最优化问题。 应用场合:霍夫曼编码、最小生成树算法(如Prim算法、Kruskal算法)等。 时间复杂度:一般为O(nlogn)。 空间复杂度:一般为O(1)。 动态规划法: 性质:通过将问题分解成更小的子问题,并记忆子问题的解,避免重复计算。 特点:具有最优子结构重叠子问题。 优势:可以解决一些具有重叠子问题问题,提高算法的效率。 应用场合:背包问题、最长公共子序列等。 时间复杂度:一般为O(n^2)。 空间复杂度:一般为O(n)。 回溯法: 性质:通过尝试所有可能的解,并在搜索过程中进行剪枝。 特点:可以通过深度优先搜索的方式进行实现。 优势:能够解决需要尝试所有可能情况的问题。 应用场合:八皇后问题、0-1背包问题等。 时间复杂度:一般为O(n!)。 空间复杂度:一般为O(n)。 分支限界法: 性质:通过剪枝策略,减少搜索空间,提高求解效率。 特点:通过优先队列等数据结构,选择最优的分支进行搜索。 优势:适用于求解优化问题,如旅行商问题、装箱问题等。 应用场合:旅行商问题、0-1背包问题等。 时间复杂度:一般为O(b^d)。 空间复杂度:一般为O(b^d)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿豆蛙给生活加点甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值