一类工作调度问题的回溯解法
算法设计与分析——批处理作业调度(回溯法)

算法设计与分析——批处理作业调度(回溯法)之前讲过⼀个相似的问题流⽔作业调度问题,那⼀道题最开始⽤动态规划,推到最后得到了⼀个Johnson法则,变成了⼀个排序问题,有兴趣的可以看⼀下本篇博客主要参考⾃⼀、问题描述给定n个作业的集合{J1,J2,…,Jn}。
每个作业必须先由机器1处理,然后由机器2处理。
作业Ji需要机器j的处理时间为t ji。
对于⼀个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。
所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度⽅案,使其完成时间和达到最⼩。
例:设n=3,考虑以下实例:看到这⾥可能会对这些完成时间和是怎么计算出来的会有疑问,这⾥我拿123和312的⽅案来说明⼀下。
对于调度⽅案(1,2,3)作业1在机器1上完成的时间是2,在机器2上完成的时间是3作业2在机器1上完成的时间是5,在机器2上完成的时间是6作业3在机器1上完成的时间是7,在机器2上完成的时间是10所以,作业调度的完成时间和= 3 + 6 + 10这⾥我们可以思考⼀下作业i在机器2上完成的时间应该怎么去求?作业i在机器1上完成的时间是连续的,所以是直接累加就可以。
但对于机器2就会产⽣两种情况,这两种情况其实就是上图的两种情况,对于(1,2,3)的调度⽅案,在求作业2在机器2上完成的时间时,由于作业2在机器1上还没有完成,这就需要先等待机器1处理完;⽽对于(3,1,2)的调度⽅案,在求作业2在机器2上完成的时间时,作业2在机器1早已完成,⽆需等待,直接在作业1被机器1处理之后就能接着被处理。
综上,我们可以得到如下表达式if(F2[i-1] > F1[i])F2[i] = F2[i-1] + t[2][i]elseF2[i] = F1[i] + t[2][i]⼆、算法设计类Flowshop的数据成员记录解空间的结点信息,M输⼊作业时间,bestf记录当前最⼩完成时间和,数组bestx记录相应的当前最佳作业调度。
回溯检索法

回溯检索法回溯检索法(Backtracking Algorithm)是一种常用于解决问题的算法思想,它通过递归的方式,在问题的解空间中搜索所有可能的解,直到找到满足条件的解或者搜索完整个解空间。
回溯检索法通常用于求解组合问题、排列问题、子集问题等,其灵活性和高效性使其成为解决一系列复杂问题的重要方法。
回溯检索法的基本思想是在问题的解空间中进行深度优先搜索,通过逐步构建解的方式,尝试每个可能的选择,如果当前选择导致无法满足问题的约束条件,则进行回溯,撤销当前选择,返回上一步进行新的选择。
这种递归的过程一直持续到找到满足条件的解,或者搜索完整个解空间。
回溯检索法的步骤如下:1. 定义问题的解空间:根据问题的要求,确定解的形式和解的约束条件,构建解空间。
2. 确定搜索方向:根据问题的要求,确定搜索的顺序,即确定每一步的选择范围。
3. 进行深度优先搜索:从初始状态开始,依次进行选择和判断,如果当前选择满足约束条件,则进入下一步继续搜索;如果当前选择导致无法满足约束条件,则进行回溯,撤销当前选择,返回上一步进行新的选择。
4. 判断是否找到解:在搜索的过程中,判断是否已经找到满足条件的解,如果找到解则结束搜索,否则继续搜索。
5. 输出解:如果找到解,则输出解;如果未找到解,则输出无解。
回溯检索法的优点是能够找到所有可能的解,而不仅仅是一个解。
但是回溯检索法的缺点是搜索过程中需要存储中间结果,占用额外的空间,并且在解空间较大时,搜索过程可能会非常耗时。
因此,对于复杂的问题,需要合理设计剪枝策略,减少搜索的时间和空间复杂度。
回溯检索法的应用非常广泛,常见的问题包括组合问题、排列问题、子集问题、棋盘问题、图的遍历等等。
例如,在八皇后问题中,回溯检索法可以用来搜索满足条件的八皇后摆放位置;在数独问题中,回溯检索法可以用来搜索解数独的方法;在图的遍历中,回溯检索法可以用来搜索从起点到终点的所有路径等等。
回溯检索法是一种强大而灵活的算法思想,通过递归的方式,在问题的解空间中搜索所有可能的解。
最佳调度问题(搜索回溯)

最佳调度问题(搜索回溯)最佳调度问题【问题描述】假设有n个任务由k个可并⾏⼯作的机器完成。
完成任务i需要的时间为ti。
试设计⼀个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。
编程计算完成这n个任务的最佳调度。
【输⼊格式】由⽂件machine.in给出输⼊数据。
第⼀⾏有2 个正整数n和k。
第2 ⾏的n个正整数是完成n个任务需要的时间。
【输出格式】将计算出的完成全部任务的最早时间输出到⽂件machine.out。
【输⼊样例】7 32 14 4 16 6 5 3【输出样例】17/*搜索问题我会先想每个⼩问题⾯临的共同条件是什么,每加⼊⼀件任务,他加⼊的条件是什么?他要加⼊哪个机器?加⼊的条件是什么?时间怎样最短?然后我就蒙圈了、、、我智障的想法是search(1,1)把第⼀个加⼊第⼀个机器,然后直到search(7,1)把第七个加⼊第⼀个,然后再加⼀个机器search(1,2)直到search(7,2)后来想想真是愚蠢呐,上⽹搜了⼀下、、才明⽩...orz,search(int,int)⾥⾯的两个参数⼀个表⽰加⼊的第⼏个任务,另⼀个是现在的时间,所以search()⾥⾯是什么很重要,我发现这就⽐如前⾯的题⽬的效率问题,求最⾼的效率,search()⾥⾯也有⼀个参数代表效率,从0开始;还有着⼀个题注意剪枝,当这⼀种情况已经⽐之前找到的最⼩值⼤时这种情况就可以舍弃不⽤考虑了QWQ*/#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int a[30],s[30];int n,k,minn=0x7ffff;void search(int,int);int main() {scanf("%d%d",&n,&k);for(int i=1; i<=n; i++) //输⼊每个时间scanf("%d",&a[i]);search(1,0);//加⼊第⼀个时间,现在花费的时间是0;cout<<minn;return0;}void search(int x,int y) {if(y>=minn)return;//剪枝已经⽐最⼩的⼤了就不⽤再放了,舍弃这种⽅法if(x>n) { //放完了进⾏判断if(y<minn)minn=y;return;}for(int i=1; i<=k; i++) {if(s[i]+a[x]<=minn) { //剪枝s[i]+=a[x];search(x+1,max(y,s[i]));s[i]-=a[x];//回溯}}return;}。
回溯类算法解法 左程云 -回复

回溯类算法解法左程云-回复回溯类算法解法是一种常见且重要的解题思路,在算法竞赛和面试中经常会遇到。
本文将以中括号内的内容为主题,一步一步回答。
回溯法是一种穷举搜索的方法,通过递归的方式尝试在一个问题的解空间中搜索所有可能的解,并找出满足特定条件的解。
它通常用于解决组合问题、排列问题、子集问题等。
回溯类算法解法的核心思想是通过不断地在选择和撤销选择之间进行转换,以达到搜索所有可能解的目的。
首先,我们需要明确回溯算法的框架。
一个典型的回溯算法通常由四个步骤组成:选择、约束、搜索和撤销选择。
我们来详细解释这四个步骤。
选择:在每一步,我们需要根据问题的具体要求,从当前的状态中选择一个合适的元素。
这个选择通常受到一些条件的限制,我们需要通过约束函数来判断当前选择是否符合条件。
约束:约束函数用来判断当前的选择是否符合问题的限制条件。
在回溯算法中,约束函数通常会在选择和撤销选择的过程中进行调用,并返回一个布尔值来表示当前的选择是否有效。
搜索:搜索过程是回溯算法的核心部分。
我们使用递归的方式在解空间中搜索所有可能的解。
在每一步中,我们都会进行选择和撤销选择的操作,并根据约束函数的返回值来决定是否继续搜索。
撤销选择:在搜索的过程中,当我们尝试了所有的选择之后,如果没有找到符合条件的解,就需要撤销当前的选择,并回到上一步进行下一次的选择。
这个过程通常可以通过回溯的方式来实现。
了解了框架之后,我们来看一个具体的例子:全排列问题。
给定一个没有重复数字的序列,我们需要返回这些数字的所有可能排列。
我们可以通过回溯算法来解决这个问题。
首先,我们定义一个递归函数permute 来进行搜索。
在permute 函数中,我们需要传入三个参数:当前的排列、已经选择的数字、未选择的数字。
当未选择的数字为空时,说明我们已经找到了一个符合条件的排列,将其加入到结果集中。
否则,我们遍历未选择的数字,对于每个数字,我们进行选择、约束、搜索和撤销选择的过程。
0028算法笔记——【回溯法】批作业调度问题和符号三角形问题

1、批作业调度问题(1)问题描述给定n个作业的集合{J1,J2,…,Jn}。
每个作业必须先由机器1处理,然后由机器2处理。
作业Ji需要机器j的处理时间为tji。
对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。
所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。
例:设n=3,考虑以下实例:这3个作业的6种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们所相应的完成时间和分别是19,18,20,21,19,19。
易见,最佳调度方案是1,3,2,其完成时间和为18。
(2)算法设计批处理作业调度问题要从n个作业的所有排列中找出具有最小完成时间和的作业调度,所以如图,批处理作业调度问题的解空间是一颗排列树。
按照回溯法搜索排列树的算法框架,设开始时x=[1,2,……n]是所给的n个作业,则相应的排列树由x[1:n]的所有排列构成。
算法具体代码如下:[cpp]view plain copy1.#include "stdafx.h"2.#include <iostream>ing namespace std;4.5.class Flowshop6.{7.friend int Flow(int **M,int n,int bestx[]);8.private:9.void Backtrack(int i);10.11.int **M, // 各作业所需的处理时间12. *x, // 当前作业调度13. *bestx, // 当前最优作业调度14.15. *f2, // 机器2完成处理时间16. f1, // 机器1完成处理时间17. f, // 完成时间和18.19. bestf, // 当前最优值20. n; // 作业数21. };22.23.int Flow(int **M,int n,int bestx[]);24.25.template <class Type>26.inline void Swap(Type &a, Type &b);27.28.int main()29.{30.int n=3,bf;31.int M1[4][3]={{0,0,0},{0,2,1},{0,3,1},{0,2,3}};32.33.int **M=new int*[n+1];34.35.for(int i=0;i<=n;i++)36. {37. M[i]=new int[3];38. }39. cout<<"M(i,j)值如下:"<<endl;40.41.for(int i=0;i<=n;i++)42. {43.for(int j=0;j<3;j++)44. {45. M[i][j]=M1[i][j];46. }47. }48.49.int bestx[4];50.for(int i=1;i<=n;i++)51. {52. cout<<"(";53.for(int j=1;j<3;j++)54. cout<<M[i][j]<<" ";55. cout<<")";56. }57.58. bf=Flow(M,n,bestx);59.60.for(int i=0;i<=n;i++)61. {62.delete []M[i];63. }64.delete []M;65.66. M=0;67.68. cout<<endl<<"最优值是:"<<bf<<endl;69. cout<<"最优调度是:";70.71.for(int i=1;i<=n;i++)72. {73. cout<<bestx[i]<<" ";74. }75. cout<<endl;76.return 0;77.}78.79.void Flowshop::Backtrack(int i)80.{81.if (i>n)82. {83.for (int j=1; j<=n; j++)84. {85. bestx[j] = x[j];86. }87. bestf = f;88. }89.else90. {91.for (int j = i; j <= n; j++)92. {93. f1+=M[x[j]][1];94.//机器2执行的是机器1已完成的作业,所以是i-195. f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+M[x[j]][2];96.97. f+=f2[i];98.if (f < bestf)//剪枝99. {100. Swap(x[i], x[j]); 101. Backtrack(i+1); 102. Swap(x[i], x[j]); 103. }104. f1-=M[x[j]][1];105. f-=f2[i];106. }107. }108.}109.110.int Flow(int **M,int n,int bestx[]) 111.{112.int ub=30000;113.114. Flowshop X;115. X.n=n;116. X.x=new int[n+1];117. X.f2=new int[n+1];118.119. X.M=M;120. X.bestx=bestx;121. X.bestf=ub;122.123. X.f1=0;124. X.f=0;125.126.for(int i=0;i<=n;i++)127. {128. X.f2[i]=0,X.x[i]=i;129. }130. X.Backtrack(1);131.delete []X.x;132.delete []X.f2;133.return X.bestf;134.}135.136.template <class Type>137.inline void Swap(Type &a, Type &b) 138.{139. Type temp=a;140. a=b;141. b=temp;142.}由于算法Backtrack在每一个节点处耗费O(1)计算时间,故在最坏情况下,整个算法计算时间复杂性为O(n!)。
《算法设计与分析》课程中“回溯法”教学探讨

vi akrc it ) odb c t k(n a t
{ i t )otu( ) f( >n up tx ;
2 1 采 用传 统教 学方 法 , . 强化 习题 讨 论 实 验 的 目的是 让学 生 自己动 手完 成任 务 , 同于课 堂教 学学生 是 实验课 的主人 , 对学生 算法 中有 不 针
问题的部分 , 教师应及时加以纠正 , 并以此展开讨论 , 传统教学方法的优点在于条理清楚 , 思路清晰, 教 师在板书时学生可以思考 , 而并非教师用课件直接将算法或程序演示 给学生。例如在做教材 4 9 . 磁带
子树 , 续按 深度 优 先策 略搜 索 。 继
由于回溯法在许多知识领域有广泛 的应用背景 , 故从各级 中小学生信息学竞赛到 A M IP C /C C国际 大学生程序设计竞赛 中均能发现其踪迹 _ 。它可 以解决许多看上去无法处理的问题 , 5 J 另外一些可用类 似于动态规划解决的问题也可用其处理 , 因此掌握回溯法 的原理与编程技巧 , 是程序设计的基本功 。与 动态规划法的状态转移方程因问题而异相比, 回溯法显得相对简单 , 大多数学生经过一段时间的训练均
成 该题 。
对 一些 依 靠搜 索 而不是 直接 套用 子集 树及 排列 树 的 问题 , 加 以启 发诱 导 , 要 及 O I 1 木棍拼接问题。这两题不能完全按照前期所讲授 的子集树及排列树问题 的套路求 解, 启发 学 生这 两题 共 同点是 采用 深度 优先 搜 寻原则 , 回溯 中加 人适 当 的剪枝 函数 , 在 如买 鱼 问题 中鱼 互不冲突 , 木棍拼接问题 中拼接后剩余长度为当前长度 , 即可完成。当学生明白并非所有 的搜索均是照 以前的套路做时, 再让他们做书中 5 1 .5整数变换问题 , 52 世界名画陈列馆问题。为了让学生拓展 及 .5
最佳调度的回溯算法
实验目的:理解回溯法的原理,掌握调度问题的处理方法,实现最佳调度问题的回溯解决。
问题定义输入:1.任务数N2.机器数M3.随机序列长度t[i],其中t[i]=x表示第i个任务完成需要时间单位x,输出:1.开销时间besttime,表示最佳调度需要时间单位2.最佳调度序列bestx[],其中bestx[i]=x,表示将第i个任务分配给第x个机器执行。
实验思想解空间的表示:一个深度为N的M叉树。
基本思路:搜索从开始结点(根结点)出发,以DFS搜索整个解空间。
每搜索完一条路径则记录下besttime 和bestx[]序列开始结点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处向纵深方向移至一个新结点,并成为一个新的活结点,也成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点;直至找到一个解或全部解。
测试数据及结果本测试的硬件以及软件环境如下CPU:PM 1.5G; 内存:768M;操作系统:windows xp sp2;软件平台:JDK1.5;开发环境:eclipse如图1所示:即为求任务数为10机器数为5的最佳调度的算法结果。
图1实验结论以及算法分析通过测试证明算法正确有效。
性能分析的方法:使用JDK 1.5的System.nanoTime(),计算算法消耗的时间,以此来评价算法。
(该方法在JDK1.5以下的版本中不支持)为了不影响算法的准确度,在测试的过程我们注释掉了打印随机字符串的步骤。
由于没有使用限界函数进行优化,算法时间和空间复杂度呈指数级增长。
所以该算法不适合较大规模的计算。
图2图2 蓝线表示机器数一定M=3时,n增大时求解最佳调度对所消耗的时间,该趋势随着指数增加。
图3图3表示任务数N一定时随着M的增大的增长曲线。
图2和图3表明该程序的时间复杂度与理论分析相符合。
五大常用算法回溯算法
五大常用算法回溯算法一、回溯算法的概述回溯算法是一种常用的解决问题的算法,通常用于解决组合优化问题,如排列、组合、子集等问题。
回溯算法通过不断地尝试可能的解,直到找到问题的解或者确定不存在解为止。
它的核心思想是通过递归实现穷举,然后进行剪枝,以提高效率。
回溯算法主要包含以下五个步骤:1.选择:在每一步中,可以根据条件选择一个或多个可能的路径。
2.约束:根据问题的约束条件,限制可选择的路径。
3.:以递归的方式进行,尝试所有可能的解。
4.判断:在的过程中,判断当前路径是否符合问题的要求,如果符合则接受,否则进行回溯。
5.取消选择:在判断出当前路径不符合要求时,撤销当前选择,回到上一步继续尝试其他可能的选择。
回溯算法的优缺点:优点:1.简单直观:回溯算法的思路清晰,易于理解和实现。
2.灵活性高:回溯算法适用于各种问题,没有固定的限制条件,可以根据具体问题进行调整。
3.扩展性好:回溯算法可以通过剪枝策略提高效率,并且可以和其他算法结合使用。
缺点:1.效率低:回溯算法通常需要穷举所有的可能解,因此在处理大规模问题时效率较低。
2.可能的重复计算:由于回溯算法会尝试所有可能的解,所以有可能会产生重复计算的问题。
二、回溯算法的应用回溯算法在许多实际问题中都有应用,包括但不限于以下几个领域:1.组合求解:回溯算法可以用来求解排列、组合、子集等问题。
例如,在给定一组数字的情况下,找到所有可能的组合,使其和等于给定的目标值。
2.图的:回溯算法可以用来解决图的遍历问题,如深度优先、广度优先等。
例如,在给定一张无向图的情况下,找到从起点到终点的路径。
3.数独游戏:回溯算法可以用来解决数独游戏。
数独是一种逻辑类的游戏,在一个9×9的网格中填入1-9的数字,要求每行、每列、每个3×3的子网格都包含1-9的数字,且不能重复。
4.八皇后问题:回溯算法可以用来解决八皇后问题。
八皇后问题是在一个8×8的棋盘上放置八个皇后,要求每行、每列、每个对角线上都不能有两个皇后。
算法详解之回溯法具体实现
算法详解之回溯法具体实现理论辅助:回溯算法也叫试探法,它是⼀种系统地搜索问题的解的⽅法。
回溯算法的基本思想是:从⼀条路往前⾛,能进则进,不能进则退回来,换⼀条路再试。
⽤回溯算法解决问题的⼀般步骤为:1、定义⼀个解空间,它包含问题的解。
2、利⽤适于搜索的⽅法组织解空间。
3、利⽤深度优先法搜索解空间。
4、利⽤限界函数避免移动到不可能产⽣解的⼦空间。
问题的解空间通常是在搜索问题的解的过程中动态产⽣的,这是回溯算法的⼀个重要特性。
还是那个基调,不喜欢纯理论的东西,喜欢使⽤例⼦来讲诉理论,在算法系列总结:动态规划(解公司外包成本问题)的那⼀节⾥⾯我们举得是经典的0-1背包问题,在回溯算法⾥⾯也有⼀些很经典的问题,当然,动态规划的0-1背包问题其实也可以使⽤回溯算法来解。
在诸如此类似的求最优解的问题中,⼤部分其实都可以⽤回溯法来解决,可以认为回溯算法⼀个”通⽤解题法“,这是由他试探性的⾏为决定的,就好⽐求⼀个最优解,我可能没有很好的概念知道怎么做会更快的求出这个最优解,但是我可以尝试所有的⽅法,先试探性的尝试每⼀个组合,看看到底通不通,如果不通,则折回去,由最近的⼀个节点继续向前尝试其他的组合,如此反复。
这样所有解都出来了,在做⼀下⽐较,能求不出最优解吗?例⼦先⾏,现在我们来看看经典的N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后。
按照国际象棋的规矩,皇后可以攻击与之处在同⼀⾏或同⼀列或同⼀斜线上的棋⼦。
n后问题等价于在n*n格的棋盘上⽅置n个皇后,任何2个皇后不放在同⼀⾏或同⼀列或同⼀斜线上。
我们需要求的是可放置的总数。
基本思路:⽤n元组x[1;n]表⽰n后问题的解。
其中,x[i]表⽰皇后i放置在棋盘的第i⾏的第x[i]列。
由于不容许将2个皇后放在同⼀列上,所以解向量中的x[i]互不相同。
2个皇后不能放在同⼀斜线上是问题的隐约束。
对于⼀般的n后问题,这⼀隐约束条件可以化成显约束的形式。
如果将n*n 格的棋盘看做⼆维⽅阵,其⾏号从上到下,列号从左到右依次编号为1,2,...n。
最佳调度问题(回溯算法)
if( time_machine[i] > time_max_K )
time_max_K = time_machine[i];
}
if(time_max_K<time_min)
{
time_min = time_max_K;
for(inti=1;i<=N;i++)
Res[i] = x[i];
}
}
else
{
for(inti=1;i<=K;i++)
{
x[k] = i;
if( placetest(k) )
{
time_machine[i] += t[k];
Backtrack(k+1,t,x);
time_machine[i] -= t[k];
}
}
}
}
三、结果与分析:
附录(源代码)
算法源代码(C++描述)
/*
}
if(time_max_K > time_min)
return false;
else
return true;
}
void Backtrack(int k,int t[],int x[])
{
if(k > N )
{
int time_max_K = time_machine[1];
for(int i=2;i<=K;i++)
结点;直至找到一个解或全部解。
二、核心代码:
boolplacetest(intk)
{
inttime_max_K = time_machine[1];
for(inti=2;i<=K;i++)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 ttKe aoa r r o eS f ae eh oo ,N j g nvri , nig 10 3 hn) .Sae yL b rt yf v l o w r T c lg o oN t n y n nU a i ies Naj 0 9 ,C ia y t n2
LI Lin . W NG a g h i U a g Xin _ a
(.C l g f o ue adIfr t nT cn lg ,L ann r l iesy a a 1 0 9 C ia 1 ol e mp t oma o eh oo y i ig e oC rn n i o NomaUn r t v i ,D l 16 2 , hn ; i n
择该 结点 另一个 没有被 试过 的分 支,如 果该 点处所有 的分 支都 已试 过 ,则算 法回溯 到该 结点之 前被 选择 的点 。首先对 一 类 分配调 度 f题 进行 了分析 ,然后提 出一种基 于 回溯法 的解 决方案 ,并给 出了算法 的具体 实现 过程 ,最后对 所提 出算 法 的复 * q 杂度 进行 了分 析 。 实验 结果验 证 了方法 的有效 性 。 关键 词 :回溯 ;算法 ; 工作调度 ; 限界; 复 杂度
.
Ke o d :b ct cig loi m;jbalct n o d o l i yw r s ak akn ;agrh r t o l a o ;b u ;cmpe t o i n xy
维普资讯
第 2 卷 第 1 期 7 8
VO . 7 12
N O. 8 1
计 算 机 工 程 与 设计
Co u e gn e iga sg mp trEn ie rn ndDe in
20 年 9 06 月
S pt 0 6 e .2 0
krc igag rtm. F n l , tec mpe i f h rp s dag rtm n lz d Smuainrs l h w fe t ta kn loi h ial h o lxt o ep o o e lo h i a ay e . i lt eut s o ii e ci y y t i s o s ts ve.
Ab t a t Ba k r c r g a sr c : c ta k p o r mm i g i awel n wn tc n q e f rs l i g c mb n t r l e r hp o l ms Th e c r a i e s n l k o h i u o o v n o i ao i a c r b e . s — e as es a h i og nz d a r s a mu t sa e d c so e e a a h sa e a c o c m o g a n m b ro l r ai e sma e W h n v ri i f u d t a ep e iu l —t g e iin wh r , te c t g , h ie a n u e f t n t si d . i ae v e e e t so n h t h rbyla lt n teag r h b c ta k , t a a , r —s b ih si tt x cl siwa th s h ie n o sil e dt as u i , h lo tm a krc s h t s osy ee t l e ss ee a t a t sa emo t c p o o o i it a s t a y t rc n h iep it dc o s s h e t t e l r aiea i p it I l atr aie et e , teag rtm a kr c st h e e tc oc on h o e en x r d at n t t s on . fal l n t sa id h lo h b c tak ote n a t n u i e v h t e v r r i
一
类工作调度问题的回溯解法
刘 亮 , 王 相 海 计 算机 软件 新技 术 国家重 点 实验 室 ,江 苏 南京 209) 103
( 1 .辽宁师范大学 计算机与信息技术学院,辽宁 大连 l 09 .南京大学 1 2 ;2 6
摘
一
要 :回溯 法是解 决组合 搜 索 问题 的 重要 方 法 ,该方 法 的搜 索通 过一 个多 阶段 的确定 过程 来 实现 ,在每 一 阶段 都 需要从 些选择 中选 择一 个分 支 , 一旦 发现 前 面的选择 不可 能获得 一个 解 , 则算法进 行 回溯 , 即重新 回到 刚搜 索过 的选 择 点 , 并选
中 图法分 类号 :P31 T . 06
文 献标识 码 : A
文章编 号 :00 04 20) 8 38 2 10. 2 ( 6 1— 3— 7 0 3 0
B ct ciga oi m r id fo lct n rbe akr kn g rh f n jba oa o o l a l t ok o l i p m
pe iu h i on. id fo l ct npolm ru h r l. n e fcet loi m rsne ae nb c rvo s oc p it A kn jbal a o be ibo g t pf sy A dt na e in agrh ipeetd sdo a- c e o o i r s ui t h n i t s b