第6章 回溯算法

合集下载

回溯算法详解

回溯算法详解

回溯算法详解
回溯算法是一种经典问题求解方法,通常被应用于在候选解的搜索空间中,通过深度优先搜索的方式找到所有可行解的问题。

回溯算法的本质是对一棵树的深度优先遍历,因此也被称为树形搜索算法。

回溯算法的基本思想是逐步构建候选解,并试图将其扩展为一个完整的解。

当无法继续扩展解时,则回溯到上一步并尝试其他的扩展,直到找到所有可行的解为止。

在回溯算法中,通常会维护一个状态向量,用于记录当前已经构建的解的情况。

通常情况下,状态向量的长度等于问题的规模。

在搜索过程中,我们尝试在状态向量中改变一个或多个元素,并检查修改后的状态是否合法。

如果合法,则继续搜索;如果不合法,则放弃当前修改并回溯到上一步。

在实际应用中,回溯算法通常用来解决以下类型的问题:
1. 组合问题:从n个元素中选取k个元素的所有组合;
2. 排列问题:从n个元素中选择k个元素,并按照一定顺序排列的所有可能;
3. 子集问题:从n个元素中选择所有可能的子集;
4. 棋盘问题:在一个给定的n x n棋盘上放置n个皇后,并满足彼此之间不会互相攻击的要求。

回溯算法的时间复杂度取决于候选解的规模以及搜索空间中的剪枝效果。

在最坏情况下,回溯算法的时间复杂度与候选解的数量成指数级增长,因此通常会使用剪枝算法来尽可能减少搜索空间的规模,从而提高算法的效率。

总之,回溯算法是一种非常有用的问题求解方法,在实际应用中被广泛使用。

同时,由于其时间复杂度较高,对于大规模的问题,需要慎重考虑是否使用回溯算法以及如何优化算法。

回溯算法原理和几个常用的算法实例

回溯算法原理和几个常用的算法实例

回溯算法原理和几个常用的算法实例回溯算法是一种基于深度优先的算法,用于解决在一组可能的解中找到满足特定条件的解的问题。

其核心思想是按照特定的顺序逐步构造解空间,并通过剪枝策略来避免不必要的。

回溯算法的实现通常通过递归函数来进行,每次递归都尝试一种可能的选择,并在达到目标条件或无法继续时进行回溯。

下面介绍几个常用的回溯算法实例:1.八皇后问题:八皇后问题是一个经典的回溯问题,要求在一个8×8的棋盘上放置8个皇后,使得每个皇后都不能相互攻击。

即每行、每列和对角线上都不能有两个皇后。

通过在每一列中逐行选择合适的位置,并进行剪枝,可以找到所有满足条件的解。

2.0-1背包问题:0-1背包问题是一个经典的组合优化问题,要求在一组物品中选择一些物品放入背包,使得其总重量不超过背包容量,同时价值最大化。

该问题可以通过回溯算法进行求解,每次选择放入或不放入当前物品,并根据剩余物品和背包容量进行递归。

3.数独问题:数独问题是一个经典的逻辑推理问题,要求在一个9×9的网格中填入数字1-9,使得每行、每列和每个3×3的子网格中都没有重复数字。

该问题可以通过回溯算法进行求解,每次选择一个空格,并依次尝试1-9的数字,然后递归地进行。

4.字符串的全排列:给定一个字符串,要求输出其所有可能的排列。

例如,对于字符串"abc",其所有可能的排列为"abc"、"acb"、"bac"、"bca"、"cab"和"cba"。

可以通过回溯算法进行求解,每次选择一个字符,并递归地求解剩余字符的全排列。

回溯算法的时间复杂度通常比较高,因为其需要遍历所有可能的解空间。

但是通过合理的剪枝策略,可以减少的次数,提高算法效率。

在实际应用中,可以根据具体问题的特点来设计合适的剪枝策略,从而降低算法的时间复杂度。

回溯算法的步骤

回溯算法的步骤

回溯算法的步骤介绍回溯算法是一种常用于解决组合优化问题的算法。

它将问题转化为一个搜索树,并使用深度优先搜索的方式遍历整个搜索空间,通过剪枝操作来减少不必要的搜索。

思想回溯算法的思想是不断地试错和回溯。

它通过尝试每一种可能的解决方案,并在发现这条路不可能得到正确解时进行回溯,回退到上一步继续尝试其他的方案。

回溯算法适用于十分灵活的问题,因为它并不局限于特定的解决策略,而是通过搜索整个解空间来找到问题的解。

步骤回溯算法的步骤可以总结为以下几个部分:1. 定义问题的解空间首先需要明确问题的解空间是什么。

解空间是所有可能的解的集合,可以用一个树形结构来表示。

2. 确定搜索的起点确定搜索的起点,通常是空解或者是一个可以快速得到解的初始解。

3. 确定搜索的终点确定搜索的终点,即找到一个满足问题要求的解,或者搜索到整个解空间。

4. 递归地搜索解空间递归地搜索解空间,从起点开始不断地向下搜索,直到找到一个满足条件的解,或者搜索到整个解空间。

5. 对每一个可能的解进行评估对每一个可能的解进行评估,判断是否满足问题的要求。

6. 进行剪枝操作在搜索过程中,如果发现当前的解已经不可能得到满足要求的解,可以进行剪枝操作,直接放弃当前解在解空间的搜索,回溯到上一步继续搜索其他的解。

7. 回溯操作如果当前解满足了问题的要求,可以将其加入到结果集中。

然后进行回溯操作,回退到上一步继续搜索其他的解。

8. 返回解集最后返回所有满足问题要求的解。

实例分析为了更好地理解回溯算法的步骤,我们用一个实例来进行分析。

问题:给定一个数组,求所有可能的子集。

解空间:解空间是所有可能的子集的集合。

起点:空集。

终点:找到所有可能的子集。

步骤: 1. 确定问题的解空间:所有可能的子集的集合,可以用一个树形结构来表示,根节点是空集。

2. 确定搜索的起点:空集。

3. 确定搜索的终点:找到所有可能的子集。

4. 递归地搜索解空间:从起点开始向下搜索,每次可选的操作是向集合添加一个新元素或不添加。

基本算法-回溯法(迷宫问题)

基本算法-回溯法(迷宫问题)

基本算法-回溯法(迷宫问题)作者:翟天保Steven版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处前言本文介绍一种经典算法——回溯法,可作为迷宫问题的一种解法,以下是本篇文章正文内容,包括算法简介、算法应用(迷宫问题)、算法流程和C++代码实现。

一、回溯法简介回溯法(Backtracking)是枚举法的一种,可以找出所有或者一部分的一般性算法,且有效避免枚举不对的解。

当发现某个解的方向不准确时,就不再继续往下进行,而是回溯到上一层,减少算法运行时间,俗称“走不通就回头换路走”。

特点是在搜索过程中寻找问题的解,一旦发现不满足条件便回溯,继续搜索其他路径,提高效率。

二、算法应用(迷宫问题)1.问题描述迷宫问题是回溯法的一种应用。

迷宫问题的描述为:假设主体(人、动物或者飞行器)放在一个迷宫地图入口处,迷宫中有许多墙,使得大多数的路径都被挡住而无法行进。

主体可以通过遍历所有可能到出口的路径来到达出口。

当主体走错路时需要将走错的路径记录下来,避免下次走重复的路径,直到找到出口。

主体需遵从如下三个原则:1.一次步进只能走一格;2.遇到路径堵塞后,退后直到找到另一条路径可行;3.走过的路径记录下来,不会再走第二次。

2.解题思路首先创建一个迷宫图,比如用二维数组人为定义MAZE[row][col],MAZE[i][j]=1时表示有墙无法通过,MAZE[i][j]=0时表示可行,假设MAZE[1][1]为入口,MAZE[8][10]为出口,创建如下初始迷宫图:图1 初始迷宫图当主体在迷宫中前行时,有东南西北(即右下左上)四个方向可以选择,如下图所示:图2 方向示意图视情况而定,并不是所有位置都可以上下左右前进,只能走MAZE[i][j]=0的地方。

通过链表来记录走过的位置,并将其标记为2,把这个位置的信息放入堆栈,再进行下个方向的选择。

若走到死胡同且未到达终点,则退回到上一个岔路口选择另一个方向继续走。

回溯算法

回溯算法

刚才的方法为生成皇后的摆放方案再去判断是否符合 要求,效率比较低,我们能不能每摆放一个皇后就看 这个皇后摆放的位置对还是不对,这样可以节省很多 无效的搜索 procedure try(dep:longint); var i:longint; begin if dep>n then inc(total) else for i:=1 to n do begin a[dep]:=i; if pd(dep) then try(dep+1); end; end;
procedure search(dep:longint); var i:longint; begin if dep>n then print else for i:=1 to 4 do{每个城市有四种颜色} begin a[dep]:=i; if check(dep) then search(dep+1); end; end;
主要代码: procedure search(dep:longint); var i:longint; begin if dep>n then print else for i:=1 to n do begin a[dep]:=i; search(dep+1); end; end;
program pailie(input,output); var n:integer; a:array[1..20] of integer; procedure print; var i:integer; begin for i:=1 to n do write(a[i]); writeln; end;
代码实现: procedure try(dep:longint); var i:longint; begin if dep>n then print else for i:=1 to n do begin a[dep]:=i; try(dep+1); end; end;

C语言回溯法

C语言回溯法

回溯算法学习重点:1、理解回溯法的基本思想;2、掌握回溯法解题的基本算法。

`学习过程:一、回溯法的基本思想回溯法又称试探法。

回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

具体说,就是:在搜索(依次用各种方法一一去试探)的过程中,当在P点有N种选择,则从第一种开始尝试,若第K种可行,即这一步搜索成功,打上标记,再向前(即 P+1点)搜索;如在P 点搜索失败(所有的方法都试探过,没有一种可行),为了摆脱当前的失败,就返回搜索进程中的上一点(即P-1点),再用第K+1种方法(假设上次在P-1点用第K种方法搜索成功,必须明确以前用过的方法不能再用,否则会陷入死循环)再去搜索,重新寻求解答。

这样搜索回溯,再搜索再回溯,如能搜索到终点,问题有解,如最后回溯到出发点,问题就无解。

这种在搜索的过程中,先对深度大的点进行扩展的算法,叫深度优先搜索法。

设搜索深度指针为P,搜索方法指针为I,可把深度优先搜索算法写成如下形式:P=0:I=0DOI=I+1(搜索到一种方法)IF 搜索方法有效 THEN试探产生临时新结点IF 符合条件 THENP=P+1(深入一步),新结点记录,I=0,再全方位搜索IF到达终点 THEN 结束搜索,输出结果END IFELSE(搜索的方法无效)I=上次搜索的方法(下一轮将用I的下一方法去搜索),P=P-1(后退一步返回上结点) END IFL00P UNTIL P=0IF P=0 THEN ’深度指针P为0,表示已退到起始状态,是本题无解的标志无解ELSE输出结果END IFEND二、应用举例1、【问题描述】有一迷宫(如图),可用一个10行9列的0~1矩阵表示,其中0表示无障碍(白色),1表示有障碍(黑色)。

设入口位置的坐标为(2,1),出口为(9,9),规定每次移动中只能从一个无障碍的单元移到其周围四个方向上任一无障碍的单元。

计算方法之——回溯算法

计算方法之——回溯算法

引言寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解。

理论上,当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上述方法是可行的。

不过,在实际应用中,很少使用这种方法,因为候选解的数量通常都非常大(比如指数级,甚至是大数阶乘),即便采用最快的计算机也只能解决规模很小的问题。

对候选解进行系统检查的方法有多种,其中回溯和分枝定界法是比较常用的两种方法。

按照这两种方法对候选解进行系统检查通常会使问题的求解时间大大减少(无论对于最坏情形还是对于一般情形)。

事实上,这些方法可以使我们避免对很大的候选解集合进行检查,同时能够保证算法运行结束时可以找到所需要的解。

因此,这些方法通常能够用来求解规模很大的问题。

算法思想回溯(backtracking)是一种系统地搜索问题解答的方法。

为了实现回溯,首先需要为问题定义一个解空间(solution space),这个空间必须至少包含问题的一个解(可能是最优的)。

下一步是组织解空间以便它能被容易地搜索。

典型的组织方法是图(迷宫问题)或树(N皇后问题)。

一旦定义了解空间的组织方法,这个空间即可按深度优先的方法从开始节点进行搜索。

回溯方法的步骤如下:1) 定义一个解空间,它包含问题的解。

2) 用适于搜索的方式组织该空间。

3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。

回溯算法的一个有趣的特性是在搜索执行的同时产生解空间。

在搜索期间的任何时刻,仅保留从开始节点到当前节点的路径。

因此,回溯算法的空间需求为O(从开始节点起最长路径的长度)。

这个特性非常重要,因为解空间的大小通常是最长路径长度的指数或阶乘。

所以如果要存储全部解空间的话,再多的空间也不够用。

算法应用回溯算法的求解过程实质上是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中<<数据结构>>(严蔚敏).(1) 幂集问题(组合问题) (参见《数据结构》(严蔚敏))求含N个元素的集合的幂集。

回溯算法的步骤

回溯算法的步骤

回溯算法的步骤回溯算法的步骤回溯算法是一种通过穷举所有可能的解来求解问题的算法。

它通常用于求解组合优化问题、排列问题和子集问题等。

下面我们将介绍回溯算法的步骤。

1. 定义问题在使用回溯算法之前,需要先定义好要解决的问题。

例如,如果要求解一个排列问题,那么就需要确定排列中元素的个数和范围。

2. 确定状态空间树状态空间树是指所有可能解的集合。

在回溯算法中,状态空间树通常用于表示所有可能的决策路径。

例如,在排列问题中,每一个节点代表一个元素被选中或未被选中。

3. 确定约束条件约束条件是指限制解决方案可行性的条件。

在回溯算法中,必须遵守约束条件才能得到有效的解决方案。

例如,在排列问题中,每个元素只能出现一次。

4. 确定搜索顺序搜索顺序是指按照什么顺序遍历状态空间树。

在回溯算法中,搜索顺序通常有两种:深度优先搜索和广度优先搜索。

5. 编写递归函数递归函数是实现回溯算法最重要的部分。

递归函数的作用是遍历状态空间树,找到所有可行的解决方案。

在编写递归函数时,需要考虑以下几个方面:(1)确定终止条件:当搜索到状态空间树的叶子节点时,需要确定终止条件,返回当前路径是否符合要求。

(2)确定回溯条件:当搜索到某个节点时,如果发现该节点不符合约束条件,则需要回溯到上一个节点。

(3)确定状态变化:在搜索过程中,需要记录每个节点的状态变化。

例如,在排列问题中,需要记录哪些元素已经被选中。

6. 调用递归函数最后一步是调用递归函数,并将初始状态作为参数传入。

在调用递归函数之后,程序会自动遍历状态空间树,并找到所有可行的解决方案。

总结回溯算法是一种常见的求解组合优化问题、排列问题和子集问题等的算法。

它通过穷举所有可能的解来求解问题,在实际应用中有着广泛的应用。

在使用回溯算法时,需要先定义好要解决的问题,并按照上述步骤进行操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

G
H
I
J Cr<W3 不可行解
K Cr=14,V=45 x=(1,0,0)
L
M Cr=15,V=25 不是最优解
N
O
W3=15,V3=25 Cr=0, V=50 x=(0,1,1)
6
例6.2 旅行商问题 • TSP问题(Traveling Salesman Problem)通常称为旅行商问题,也称为旅 行售货员问题、货担郎问题等,是组合优化中的著名难题,也是计算 复杂性理论、图论、运筹学、最优化理论等领域中的一个经典问题, 具有广泛的应用背景。TSP问题最早在20世纪20年代由数学家兼经济 学家Karl Menger提出来的。 • 问题的一般描述为:旅行商从n个城市中的某一城市出发,经过每个 城市仅有一次,最后回到原出发点,在所有可能的路径中求出路径长 度最短的一条。
9
• 在回溯法搜索解空间树时,通常采用两种策略(剪枝函数) 避免无效搜索以提高回溯法的搜索效率: 1. 用约束函数在扩展结点处减去不满足约束条件的子树; 2. 用限界函数减去不能得到最优解的子树。
– 解0—1背包问题的回溯法用剪枝函数剪去导致不可行解的子树。 – 解旅行商问题的回溯算法中,如果从根结点到当前扩展结点的部 分周游路线的费用已超过当前找到的最好周游路线费用,则以该 结点为根的子树中不包括最优解,就可以剪枝。
i 1
1 20 5 6 4 10 2
n1
(1,3,2,4,1)的总权值 为25,为最优回路。
3
15
4
8
• 回溯法找最小费用周游路线的主要过程
A 1 B 2 3 4
1
20 5
2 3 10 F 4 4 L
C 4 G 3 M 4 N 2 H
D
4 I 2 O 3 P 2 J
E 3 K 2 Q
6 4 3 15
• 在主函数中,需要对相关变量初始化:
memset(bestx, 0, sizeof(bestx)); memset(f2, 0, sizeof(f2)); bestf = infinite; f1 = 0; f = 0; for (i=0; i<=n; i++) x[i] = i;
• 因为这是一棵排列树,因此算法Backtrack(int t)的计算时 间复杂度为O(n!)。
for (int i=t; i<=n; i++) { f1 += job[x[i]][1]; f2[t] = ((f2[t-1]>f1) ? f2[t-1] : f1)+job[x[i]][2]; f += f2[t]; if (f<bestf) //剪枝 { swap(x[t], x[i]); Backtrack(t+1); swap(x[t], x[i]); } f1 -= job[x[i]][1]; f -= f2[t]; } }
– 例如,对于有n种可选择物品的0—1背包问题,其解空间由长度为 n的0—1向量组成,该解空间包含了对变量的所有可能的0—1赋值。
A
1 B 1 D 0 E 0 I 1 J 0 K 1 L F 0 M 1 N 1 0 C 0 G 0 O
1
H
3
6.1.2 回溯法的基本思想
• 在生成解空间树时,定义以下几个相关概念:
– 活结点:如果已生成一个结点而它的所有儿子结点还没有 全部生成,则这个结点叫做活结点。 – 扩展结点:当前正在生成其儿子结点的活结点叫扩展结点 (正扩展的结点)。 – 死结点:不再进一步扩展或者其儿子结点已全部生成的结 点就是死结点。
4
• 在确定了解空间的组织结构后,回溯从开始结点(根结 点)出发,以深度优先的方式搜索整个解空间。
6.2 流水作业调度问题
• 给定n个作业的集合j={j1,j2,…,jn}。 • 每一个作业ji都有两道工序,分别在两台机器上完成。一台机器一次 只能处理一道工序,并且工序一旦开始,就必须进行下去直到完成。 • 每一个作业必须先由机器1处理,然后由机器2处理。 • 作业ji需要机器j的处理时间为t[i][j],其中i= 1, 2, …, n ,j=1, 2。对于 一个确定的作业调度,设f[i][j]是作业i在机器j上的完成处理的时间, 所有作业在机器2上完成处理的时间之和定义如下:
– 可以系统地搜索一个问题的所有解或任意解,既有系统性又有 跳跃性。 – 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避 免不必要搜索的穷举式搜索法。 – 这种以深度优先的方式系统地搜索问题的解的方法称为回溯法。
2
6.1 回溯算法的理论基础
6.1.1 问题的解空间 • 应用回溯法求解时,需要明确定义问题的解空间。问题的 解空间应至少包含问题的一个(最优)解。
7
• 设G=(V, E)是一个带权图,其每一条边(u, v)∈E的费用(权) 为正数w(u, v)。目的是要找出G的一条经过每个顶点一次 且仅经过一次的回路,即汉密尔顿(Hamilton)回路v1, v2 ,…,vn ,使回路的总权值最小:
min{ w(vi,vi1 ) w(vn,v1 )}
第6章 回溯算法
6.1 回溯算法的理论基础
6.1.1 问题的解空间 6.1.2 回溯法的基本思想 6.1.3 子集树与排列树
6.2 流水作业调度问题
1
• 回溯法是一种组织搜索的一般技术,有“通用的解题法” 之称,用它可以系统的搜索一个问题的所有解或任一解。 • 有许多问题,当需要找出它的解集或者要求回答什么解 是满足某些约束条件的最佳解时,往往要使用回溯法。
3
3,1,2 19
3,2,1 19
算法6.8(1) 流水作业调度问题回溯算法的数据结构
#define NUM 20 #define infinite 10000 int n; int job[NUM][3]; int x[NUM]; int bestx[NUM]; int f1; int f2[NUM]; int f; int bestf;
10
6.1.3 子集树与排列树
• 有时问题是要从一个集合的所有子集中搜索一个集合,作 为问题的解。方便地遍历一个集合的所有子集或者所有排列。
• 当问题是要计算n个元素的子集,以便达到某种优化目标 时,可以把这个解空间组织成一棵子集树。
– 例如,n个物品的0-1背包问题相应的解空间树就是一棵子集树。 – 这类子集树通常有2n个叶结点,结点总数为2n +1-1。
• 遍历子集树的任何算法,其计算时间复杂度都是Ω(2n)。
11
算法6.1 回溯算法搜索子集树的伪代码
//形参t为树的深度,根为1 void backtrack (int t) { if (t>n) update(x); else for (int i=0; i<=1; i++) //每个结点只有两个子树 { x[t]=i; //即0/1 if (constraint(t) && bound(t)) backtrack(t+1); } } • 约束函数constraint(t)和限界函数bound(t),称为剪枝函数。 • 函数update(x)是更新解向量x的。 • 约束函数constraint(t),一般可以从问题描述中找到。
12
• 当所给的问题是确定n个元素满足某种性质的排列时,可 以把这个解空间组织成一棵排列树。 • 排列树通常有n!个叶子结点。因此遍历排列树时,其计 算时间复杂度是Ω(n!) 。
– 例如,旅行商问题就是一棵排列树。
13
算法6.2 回溯算法搜索排列树的伪代码
//形参t为树的深度,根为1 void backtrack (int t) { if (t>n) update(x); else for (int i=t; i<=n; i++) { //为了保证排列中每个元素不同,通过交换来实现 swap(x[t], x[i]); if (constraint(t) && bound(t)) backtrack(t+1); swap(x[t], x[i]); //恢复状态 } }
– 这个开始结点成为一个活结点,同时成为当前的扩展结点。在 当前的扩展结点,搜索向深度方向进入一个新的结点。这个新 结点成为一个新的活结点,并成为当前的扩展结点。 – 若在当前扩展结点处不能再向深度方向移动,则当前的扩展结 点成为死结点,即该活结点成为死结点。此时回溯到最近的一 个活结点处,并使得这个活结点成为当前的扩展结点。 – 回溯法以这样的方式递归搜索整个解空间(树),直至满足中 止条件。
f f [i ][2]
i 1 n
• 称为该作业调度的完成时间之和。 • 由于只有两台机器,作业的处理顺序极大地影响结束时间f。流水作 业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其 完成时间和达到最小。
• 由于每个作业都要处理,只是在机器上的处理顺序不同,因此流水作 业调度问题的一个候选解是n个作业的一个排列。 • 设解向量为X ( x1, x2, …, xn) ,就是确定最优解是n个作业( 1, 2, …, n ) 的哪一个排列,因此解空间是一棵排列树。
5
• 例6.1 0—1背包问题 假设背包容量C=30,w={16,15,15},v={45,25,25}
Cr=C=30,V=0 A W1=16,V1=45 Cr=14,V=45 Cr<W2 不可行解 D B Cr=14 V=45 E W2=15,V2=25 Cr=15,V=25 F Cr=30,V=0 C
//∞ //作业的数量 //各作业所需处理时间 //当前作业调度方案 //当前最优作业调度方案 //机器1完成处理时间之和 //每个作业在机器2完成处理时间 //机器2完成时间之和 //当前最优值
算法6.8(2) 流水作业调度问题回溯算法的实现
相关文档
最新文档