《算法设计与分析》第09章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京邮电大学计算机学院 2008年3月
template<class T> class JS{ public: JS(T *prof,int *de,int *time,int size); T JSFIFOBB(); void GenerateAns(int *x,int &k); private: T *p,total; int *t,*d,n; Node *ans,*root; };
}
南京邮电大学计算机学院 2008年3月
9.2.3 LC分枝限界法
【程序9-3】 基于上下界的LC分枝限界法 template<class T> Node<T>* LCBB(Node<T>* t,T& U) { LiveList<Node<T>* > lst(mSize); Node<T> *ans=NULL,*x,E=*t; do { for( 对结点E的每个孩子x){ if (ĉ(x)<U){ x=new Node;x->parent=E; lst.Append(x);
南京邮电大学计算机学院 2008年3月
if(lst.IsEmpty()){ cout<<“没有答案结点”;return;
}
lst.Serve(E); }while(1);
}
南京邮电大学计算机学院 2008年3月
9.1.2 LC分枝限界法
代价函数c(· ) 若X是答案结点,则c(X)是从根结点到X的搜索代价; 若X不是答案结点且子树X上不含任何答案结点, 则c(X) = ;若X不是答案结点但子树X上包含答案 结点,则c(X)等于子树X上具有最小搜索代价的答 案结点的代价。
ĉ(X) 是代价估计函数,它由两部分组成:从根到X
的 代 价 f(X) 和 从 X 到 答 案 结 点 的 估 计 代 价 (X) , 即
ĉ(X)=f(X)+ ĝ(X) 。一般而言,可令f(X)等于X在树
中的层次。
南京邮电大学计算机学院 2008年3月
9.1.3 15谜问题
在一个44的方形棋盘上放置了15块编了号的牌, 还剩下一个空格。问题要求对于任意给定的一种 初始排列,通过一系列的合法移动,将给定的初 始排列转换成目标排列。
template<class T> void BranchBound(Node<T>* t) { LiveList<Node<T>* > lst(mSize); Node<T> *x,*E=t; do { for( 对结点E的每个不受限的孩子){ x=new Node;x->parent=E; if ( x是一个答案结点 ){ 输出从x到 t的一条路径;return; } lst.Append(x); }
南京邮电大学计算机学院 2008年3月
template<class T> struct qNode{ qNode(){} qNode(T p,T los,int sd,int k,Node* pt) { prof=p;loss=los;d=sd;ptr=pt;j=k; } T prof,loss; Node* ptr; };
南京邮电大学计算机学院 2008年3月
南京邮电大学计算机学院 2008年3月
相对代价估计函数ĝ(.)
ĝ(X) 作为g(X)的估计值,用于估计结点X的相对代
价,它是由X到达一个答案结点所需代价的估计函 数。一般地,假定(X)满足如下特性:如果Y是X的 孩子,则有(Y) ≤(X)。
代价估计函数ĉ(.)
南京邮电大学计算机学院 2008年3月
初始状态和目标状态,从任意初始状态, 经一系列的空格移动,到达目标状态。空格 可以最多有前、后、左和右四种移动方式。 共有16!种不同的排列。这个状态空间树 是相当大的。有必要判定当前到达的状态是 否属于该状态空间树。
南京邮电大学计算机学院 2008年3月
定理9-1 对给定的初始状态,当且仅当
9.1 9.2 9.3 9.4 9.5 9.6
一般方法 求最优解的分枝限界法 带时限的作业排序 0/1背包 旅行商问题 批处理作业调度
南京邮电大学计算机学院 2008年3月
9.1 一般方法
南京邮电大学计算机学院 2008年3月
9.1.1 分枝限界法概述
采用广度优先产生状态空间树的结点,并使用剪 枝函数的方法称为分枝限界法。按照广度优先的 原则,一个活结点一旦成为扩展结点(E-结点)R 后,算法将依次生成它的全部孩子结点,并将它 们一一加入活结点表,此时R自身成为死结点。算 法从活结点表中另选一个活结点作为E-结点。
南京邮电大学计算机学院 2008年3月
9.3 带时限的作业排序
南京邮电大学计算机学院 2008年3月
9.3.1 问题描述
对于单处理机的带时限作业排序问题,如果每个作 业具有相同的处理时间,则可以用贪心法求解。如 果每个作业的处理时间允许不同,带时限的作业排 序问题可描述为:设有n个作业和一台处理机,每个 作业所需的处理时间、要求的时限和收益可用三元 组(ti, di, pi), 0≤i<n表示,其中,作业i的所需 时间为ti,如果作业i能够在时限di内完成,将可收益 pi,求使得总收益最大的作业子集J。
南京邮电大学计算机学院 2008年3月
9.3.2 分枝限界法求解
可变大小元组(x0, x1,…, xk)表示解,xi为作业编 号。 问 题 的 显 式 约 束 为 : xi{0, 1,…, n1} 且 xi < xi+1(0≤i<n1), 隐式约束为:对于选入子集J的作业(x0, x1,…, xk ),存在一种作业排列使J中作业均能如期完成。 问题的目标函数是作业子集J中所有作业所获取的 收益之和,使得总收益最大的作业子集是问题的最 优解。如果希望以最小值为最优解,则可以适当改 变目标函数,将其改为未入选子集J的作业所导致 南京邮电大学计算机学院 2008年3月
可变大小元组(x0, x1,…, xk)表示解,xi为作业编号。 显式约束为:xi{0, 1,…, n1}且xi<xi+1(0≤i<n1), 隐式约束为:对于选入子集J的作业(x0, x1,…, xk), 存在一种作业排列使J中作业均能如期完成。 问题的目标函数是作业子集J中所有作业所获取的收 益之和,使得总收益最大的作业子集是问题的最优解。 如果希望以最小值为最优解,则可以适当改变目标函 数,将其改为未入选子集J的作业所导致的损失,即为:
南京邮电大学计算机学院 2008年3月
例9-1 (4-皇后问题) FIFO分枝限界法求解
南京邮电大学计算机学院 2008年3月
【程序9-1】分枝限界算法 template <class T> struct Node{ T cost; Node* parent; }
南京邮电大学计算机学院 2008年3月
less(k) i
k 1
16
j
为偶数时,可以由此初始状态到达目标状态,其中, i和j分别是空格在棋盘上的行和列下标。
南京邮电大学计算机学院 2008年3月
15谜问题的部分状态空间树(FIFOBB)
南京邮电大学计算机学院 2008年3月
15谜问题的部分状态空间树(LCBB)
南京邮电大学计算机学院 2008年3月
南京邮电大学计算机学院 2008年3月
if ( x是一个答案结点 && cost(x)<U) if (u(x)+< cost(x)) U=u(x)+; else { U=coxt(x);ans=x;} else if(u(x)+<U) U=u(x)+;
} } if(!lst.IsEmpty()){ lst.Serve(E); if (ĉ(E)≥U) return ans; } else return ans; }while(1); }
南京邮电大学计算机学院 2008年3月
9.2.2 FIFO分枝限界法
template<class T> Node<T>* FIFOBB(Node<T>* t,T& U) { LiveList<Node<T>* > lst(mSize); Node<T> *ans=NULL, *x, *E=t; do { for(对结点E的每个孩子x){ if (ĉ(x)<U){ x=new Node;x->parent=E;
Hale Waihona Puke Baidu 9.2 求最优解的分枝限界法
南京邮电大学计算机学院 2008年3月
9.2.1 上下界函数
定义9-1 状态空间树上一个结点 X 的代价函数 c(· ) 定义为:若X是答案结点,则c(X)为X所代表的可行解 的目标函数值;若 X为非可行解结点,则c(X)=;若 X代表部分向量,则c(X)是以X为根的子树上具有最小 代价的结点代价。显然,这样定义的c(X)也是难以计 算的,它的计算难度与求得问题最优解的难度相当
南京邮电大学计算机学院 2008年3月
可变大小元组状态空间树
南京邮电大学计算机学院 2008年3月
9.3.3 带时限作业排序算法
【程序9-4】 带时限的作业排序 struct Node{ Node(Node* par,int k) { parent=par;j=k; } Node* parent; int j; };
南京邮电大学计算机学院 2008年3月
相对代价函数g(· ) 衡量一个结点X的相对代价一般有两种标准:① 在 生成一个答案结点之前,子树X上需要生成的结点 数目;② 在子树X上,离X最近的答案结点到X的路 径长度。容易看出,如果采用标准①,总是生成最 小数目的结点;如果采用标准②,则要成为E-结点 的结点只是由根到最近的那个答案结点路径上的那 些结点。
南京邮电大学计算机学院 2008年3月
lst.Append(x); if ( x是一个答案结点 && cost(x)<U) if (u(x)+< cost(x)) U=u(x)+; else { U=cost(x);ans=x;} else if(u(x)+<U) U=u(x)+; } } do{ if(lst.IsEmpty()) return ans; lst.Serve(E); } while (ĉ(E)≥U ); }while(1);
南京邮电大学计算机学院 2008年3月
例9-1 设有带时限的作业排序实例:n=4,(p0, d0, t0)=(5, 1, 1),(p1, d1, t1)=(10, 3, 2),(p2, d2, t2)=(6, 2, 1)和(p3, d3, t3)=(3, 1, 1),求使得总收益最大的作业子集J。
min{
iJ,i 1..n
pi }
南京邮电大学计算机学院 2008年3月
ĉ(X) u(X)
iJ, i m
p,
i
m max {i|i J }
iJ,i 1..n
pi pi pi
iJ,i m i m 1,...,n
ĉ(X) c(X) u(X)
“十一五”国家级规划教 材
电子工业出版社
算法设计与分析
DeSign and Analysis of Algorithms In C++
陈慧南 编著
南京邮电大学计算机学院 2008年3月
第2部分 算法设计策略
南京邮电大学计算机学院 2008年3月
第9章 分支限界法
南京邮电大学计算机学院 2008年3月
南京邮电大学计算机学院 2008年3月
不同的活结点表形成不同的分枝限界法,分为: FIFO分枝限界法、LIFO分枝限界法和LC(least cost)分枝限界法。三种不同的活结点表,规定了 从活结点表中选取下一个E-结点的不同次序。 FIFO分枝限界法的活结点表是先进先出队列 LIFO分枝限界法的活结点表是堆栈; LC分枝限界法的活结点表是优先权队列,LC分 枝限界法将选取具有最高优先级的活结点出队列, 成为新的E-结点。
定义9-2 函数u(· ĉ(· )和 )分别是代价函数c(· )的上界和
下界函数。对所有结点X,总有ĉ(X)≤c(X)≤u(X)。
南京邮电大学计算机学院 2008年3月
基于上下界函数的分枝限界法的限界方法 U的值可以按下列原则修正: 如果X是答案结点,cost(X)是X所代表的可行解的 目标函数值,u(X)是该子树上最小代价答案结点代 价的上界值,则U=min{cost(X), u(X)+, U}; 如果X代表部分向量,则U=min{u(X)+, U}。 使用ĉ(X)≥U 剪除多余分枝。