排列组合什么时候用a子集树什么时候排列树

Python基于回溯法子集树模板解决全排列问题示例
作者:罗兵
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python基于回溯法子集树模板解决全排列问题,简单描述了全排列问题并结合实例形式分析了Python使用回溯法子集树模板解决全排列问题的具体步骤与相关操作注意事项,需要的朋友可以参考下
本文实例讲述了Python基于回溯法子集树模板解决全排列问题。分享给大家供大家参考,具体如下:
实现 'a', 'b', 'c', 'd' 四个元素的全排列。
这个问题可以直接套用排列树模板。
不过本文使用子集树模板。分析如下:
一个解x就是n个元素的一种排列,显然,解x的长度是固定的,n。
我们这样考虑:对于解x,先排第0个元素x[0],再排第1个元素x[1],...,当来到第k-1个元素x[k-1]时,就将剩下的未排的所有元素看作元素x[k-1]的状态空间,遍历之。
至此,套用子集树模板即可。
'''用子集树实现全排列'''
a = ['a','b','c','d']
# 一个解(n元0-1数组)
# 冲突检测:无
def conflict(k):
global n, x, X, a
return False # 无冲突
# 用子集树模板实现全排列
def perm(k): # 到达第k个元素
global n, a, x, X
if k &= n: # 超出最尾的元素
#X.append(x[:]) # 保存(一个解)
for i in set(a)-set(x[:k]): # 遍历,剩下的未排的所有元素看作元素x[k-1]的状态空间
if not conflict(k): # 剪枝
perm(0) # 从x[0]开始
更多关于Python相关内容可查看本站专题:《》、《》、《》、《》、《》及《》
希望本文所述对大家Python程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具算法分析期末试题集答案(6套)-博泰典藏网
典藏文档 篇篇精品
算法分析期末试题集答案(6套)
导读:算法只保存从根结点到当前扩展结点的路径,7.回溯法的算法框架按照问题的解空间一般分为(子集树)算法框架与(排列树)算法框,则算法共耗时(O(mn)),则按时完成所有任务最少需要几台机器?(提示:使用贪心算法),解法:现采用Dijkstra算法计算从源顶点1到其它顶点间最短路径,对算法进行了一些改进,算法在执行上有什么不同,具体为:算法Maxloading初始时将bestw设置为0,因此在算法搜动集合中选出最大的相容活动子集合),得到的最大相容活动子集合为活动( {1,4,8,11}
3. 所谓贪心选择性质是指(所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到)。 4. 所谓最优子结构性质是指(问题的最优解包含了其子问题的最优解)。 5. 回溯法是指(具有限界函数的深度优先生成法)。 6. 用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树
中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为(O(h(n)))。 7. 回溯法的算法框架按照问题的解空间一般分为(子集树)算法框架与(排列树)算法框架。 8. 用回溯法解0/1背包问题时,该问题的解空间结构为(子集树)结构。 9.用回溯法解批处理作业调度问题时,该问题的解空间结构为(排列树)结构。 10.用回溯法解0/1背包问题时,计算结点的上界的函数如下所示,请在空格中填入合适的内容:
i S[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14 Typep Knap::Bound(int i) {// 计算上界
Typew cleft = c -
// 剩余容量
// 结点的上界
// 以物品单位重量价值递减序装入物品
while (i <= n && w[i] <= cleft) {
cleft -= w[i];
b += p[i];
// 装满背包
if (i <= n) (b += p[i]/w[i] * cleft); }
11. 用回溯法解布线问题时,求最优解的主要程序段如下。如果布线区域划分为n?m的方格阵列,扩展每个结点需O(1)的时间,L为最短布线路径的长度,则算法共耗时 (
),构造相应的最短距离需要(O(L))时间。
12. 用回溯法解图的m着色问题时,使用下面的函数OK检查当前扩展结点的每一个儿子所相应的颜色的可用性,则需耗时(渐进时间上限)(O(mn))。
13. 旅行售货员问题的解空间树是(排列树)。 Bool Color::OK(int k) {//
for(int j=1;j<=n;j++) if((a[k][j]= =1)&&(x[j]= =x[k])) } for (int i = 0; i < NumOfN i++) {
nbr.row = here.row + offset[i].
nbr.col = here.col + offset[i].
if (grid[nbr.row][nbr.col] == 0) {
// 该方格未标记
grid[nbr.row][nbr.col]
= grid[here.row][here.col] + 1;
if ((nbr.row == finish.row) &&
(nbr.col == finish.col)) // 完成布线
Q.Add(nbr);}
三、 解答题 1. 机器调度问题。 问题描述:现在有n件任务和无限多台的机器,任务可以在机器上得到处理。每件任务的开始时间为si,完成时间为fi,si<fi 。[si,fi]为处理任务i的时间范围。两个任务i,j重叠指两个任务的时间范围区间有重叠,而并非指i,j的起点或终点重合。例如:区间[1,4]与区间[2,4]重叠,而与[4,7]不重叠。一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。最优分配是指使用的机器最少的可行分配方案。 问题实例:若任务占用的时间范围是{[1,4],[2,5],[4,5],[2,6],[4,7]},则按时完成所有任务最少需要几台机器?(提示:使用贪心算法) 画出工作在对应的机器上的分配情况。
?f(n)?bf(n?1)?g(n)2. 已知非齐次递归方程:? ,其中,b、c是常数,f(0)?c?g(n)是n的某一个函数。则f(n)的非递归表达式为:f(n)?cb??bn?ig(i)。 ni?1n?h(n)?2h(n?1)?1现有Hanoi塔问题的递归方程为:? ,求h(n)的非递归表h(1)?1?达式。 解:利用给出的关系式,此时有:b=2, c=1, g(n)=1, 从n递推到1,有: h(n)?cbn?1??bn?1?ig(i)i?1n?1?2n?1?2n?2?...?22?2?1 ?2n?1 3. 单源最短路径的求解。 问题的描述:给定带权有向图(如下图所示)G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 解法:现采用Dijkstra算法计算从源顶点1到其它顶点间最短路径。请将此过程填入下表中。
迭代 S {1}
dist[2] dist[3] dist[4] dist[5] 10
初始 1 2 3 4 4. 请写出用回溯法解装载问题的函数。 装载问题:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且?w?cii?1n1?c2。装载问题要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。 解:void backtrack (int i)
{// 搜索第i层结点
if (i > n)
// 到达叶结点
更新最优解bestx,
r -= w[i];
if (cw + w[i] <= c) {// 搜索左子树
cw += w[i];
backtrack(i + 1);
cw -= w[i];
if (cw + r > bestw)
// 搜索右子树
backtrack(i + 1);
r += w[i];
5. 用分支限界法解装载问题时,对算法进行了一些改进,下面的程序段给出了改进部分;试说明斜线部分完成什么功能,以及这样做的原因,即采用这样的方式,算法在执行上有什么不同。
解答:斜线标识的部分完成的功能为:提前更新bestw值; 这样做可以尽早的进行对右子树的剪枝。具体为:算法Maxloading初始时将bestw设置为0,直到搜索到第一个叶结点时才更新bestw。因此在算法搜索到第一个叶子结点之前,总有bestw=0,r>0 故Ew+r>bestw总是成立。也就是说,此时右子树测试不起作用。 为了使上述右子树测试尽早生效,应提早更新bestw。又知算法最终找到的最优值是所求问题的子集树中所有可行结点相应重量的最大值。而结点所相应得重量仅在搜索进入左子树是增加,因此,可以在算法每一次进入左子树时更新// 检查左儿子结点
Type wt = Ew + w[i];
// 左儿子结点的重量
bestw) bestw =
// 加入活结点队列
bestw && i < n)
Q.Add(Ew);
// 可能含最优解
Q.Delete(Ew);
// 取下一扩展结点
包含总结汇报、教学研究、农林牧渔、求职职场、行业论文、人文社科、计划方案以及算法分析期末试题集答案(6套)等内容。本文共10页
相关内容搜索子集树和排列树_中华文本库
算法中有时找不到问题解的是( A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 5. 回溯法解旅行售货员问题时的解空间树是( A A、子集树 B、排列树 )...
第五章 回溯法 9 4.子集树与排列树图5-1和图5-4中的两棵解空间树是回溯法解题时常 遇到的两类典型的解空间树。 当所给的问题是从n个元素的集合S中找出...
t++;} //solution(t)为假,则仅得到一个部分解,需继续纵深搜索 } else t--; } //while循环结束后,完成整个回溯搜索过程 } 5.1.5 子集树与排列树 ? ...
解空间树的叶结点的个数 (n-1)! 1 6 30 5 4 2 10 3 20 4 59 66 25 66 25 59 7 回溯法算法框架子集树与排列树子集树 ? 所给的问题是从n个...
2、回溯算法解题步骤: (1)针对所给问题,定义问题的解空间, 确定易于搜 索的解空间结构;(排列树,子集树) (2)以深度优先方式(确定扩展规则) 搜索解空间, 并...
回溯法解旅行售货员问题时的解空间树是( A A、子集树 B、排列树 C、深度优先生成树 6.下列算法中通常以自底向上的方式求解最优解的是( A、备忘录法 B、...
9 5.1 回溯法的算法框架本节介绍回溯法算法框架的有关问题: 一、问题的解空间 二、回溯法的基本思想 三、子集树与排列树 四、递归回溯 *五、迭代回溯 10 ...
A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、...现在位置:

我要回帖

更多关于 排列组合什么时候用a 的文章

 

随机推荐