算法设计与分析 第6章_第1页
算法设计与分析 第6章_第2页
算法设计与分析 第6章_第3页
算法设计与分析 第6章_第4页
算法设计与分析 第6章_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章分支限界法1学习要点理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架(1)队列式(FIFO)分支限界法(2)优先队列式分支限界法通过应用范例学习分支限界法的设计策略。(1)单源最短路径问题(2)装载问题;(3)0-1背包问题;(4)旅行售货员问题26.1 分支限界法的基本思想分支限界法与回溯法(1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

(2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

36.1 分支限界法的基本思想

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。46.1 分支限界法的基本思想常见的两种分支限界法(1)队列式(FIFO)分支限界法按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。5n=3时的0-1背包问题,用完全二叉树表示的解空间,实例如下:w=[16,15,15],p=[45,25,25],c=30。(1)队列式(FIFO)分支限界法(2)优先队列式分支限界法极大堆来表示活结点表的优先队列。61243301045620四城市旅行售货员问题。(1)队列式(FIFO)分支限界法(2)优先队列式分支限界法极小堆来存储活结点表76.50-1背包问题算法的思想

首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。

在下面描述的优先队列分支限界法中,节点的优先级是剩下的最大单位重量价值的物品装满剩余容量的价值和。

算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。811×w=11无效解w=4,v=40ub=70

2w=4,v=40ub=76

3w=0,v=0ub=6045

6w=9,v=65ub=69

7w=4,v=40ub=64

8w=12无效解

9

w=9,v=65

ub=65×优先队列式分支限界法求解0/1背包问题

4个物品的重量分别为(4,7,5,3),价值分别为(40,42,25,12),背包容量W=10。

1

w=0,v=0

ub=10096.50-1背包问题上界函数Boundcleft=c-cw;b=cp;while(i<=n&&w[i]<=cleft)//n表示物品总数,cleft为剩余容量{cleft-=w[i];//w[i]表示i号的物品重量b+=p[i];//p[i]表示i号的物品价值i++;}if(i<=n)b+=p[i]/w[i]*cleft;//装填剩余容量装满背包returnb;

//b为上界函数返回值106.50-1背包问题

while(i!=n+1){//非叶结点

//检查当前扩展结点的左儿子结点

Typewwt=cw+w[i];if(wt<=c){//左儿子结点为可行结点

if(cp+p[i]>bestp)bestp=cp+p[i];//bestp为当前最优值

AddLiveNode(up,cp+p[i],cw+w[i],true,i+1);}//up为价值上界//将一个新的活结点插入到子集树和最大堆中,true表示为左子树up=Bound(i+1);//检查当前扩展结点的右儿子结点

if(up>=bestp)//右子树可能含最优解

AddLiveNode(up,cp,cw,false,i+1);

//取下一个扩展节点(略)}分支限界搜索过程1122

6.7TSP问题

TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。

526 31 13

27 498

34 5C=∞

3 1 5 8

3158∞679 6∞42 74∞3 923∞(a)一个无向图(b)无向图的代价矩阵图示无向图及其代价矩阵1223

采用贪心法求得近似解为1→3→5→4→2→1,其路径长度为1+2+3+7+3=16,这可以作为TSP问题的上界。 把矩阵中每一行最小的元素相加,可以得到一个简单的下界,其路径长度为1+3+1+3+2=10,但是还有一个信息量更大的下界:考虑一个TSP问题的完整解,在每条路径上,每个城市都有两条邻接边,一条是进入这个城市的,另一条是离开这个城市的,那么,如果把矩阵中每一行最小的两个元素相加再除以2,如果图中所有的代价都是整数,再对这个结果向上取整,就得到了一个合理的下界。

lb=((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14

于是,得到了目标函数的界[14,16]。需要强调的是,这个解并不是一个合法的选择(可能没有构成哈密顿回路),它仅仅给出了一个参考下界。13∑2c[r][r∑∑r行最小的两个元素)/224部分解的目标函数值的计算方法例如,以下无向图中,如果部分解包含边(1,4),则该部分解的下界是lb=((1+5)+(3+6)+(1+2)+(3+5)+(2+3))/2=16。ri∈Urj∉Ulb=(k−1

i=1ii+1]+ri行不在路径上的最小元素+j

526 31 13

27 498

34 5C=∞

3 1 5 8

3158∞679 6∞42 74∞3 923∞(a)一个无向图(b)无向图的代价矩阵图示无向图及其代价矩阵1425

21→2lb=14×

31→3lb=14

41→4lb=16

51→5lb=19

62→3lb=16

72→4lb=16

82→5lb=19×

93→2lb=16

103→4lb=15

113→5lb=14lb=1912×135→25→4lb=16lb=14 14 4→2lb=18

164→5

15×4→2lb=15 17 5→2×分支限界法求解TSP问题示例

1

start lb=141526具体的搜索过程如下(加黑表示该路径上已经确定的边):(1)在根结点1,根据限界函数计算目标函数的值为lb=((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14;(2)在结点2,从城市1到城市2,路径长度为3,目标函数的值为((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,将结点2加入待处理结点活结点表中;在结点3,从城市1到城市3,路径长度为1,目标函数的值为((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,将结点3加入活结点表中;在结点4,从城市1到城市4,路径长度为5,目标函数的值为((1+5)+(3+6)+(1+2)+(3+5)+(2+3))/2=16,将结点4加入活结点表中;在结点5,从城市1到城市5,路径长度为8,目标函数的值为((1+8)+(3+6)+(1+2)+(3+5)+(2+8))/2=19,超出目标函数的界,将结点5丢弃;166.7旅行售货员问题算法描述template<classType>classTraveling{friendvoidmain(void);public:TypeBBTSP(intv[]);private:

intn;//图G的顶点数

Type**a,//邻接矩阵

NoEdge,//无边标志

cc,//当前费用

bestc;//当前最小费用};176.7旅行售货员问题算法描述template<classType>classMinHeapNode{friendTraveling<Type>;public:operatorType()const{returnlcost;}private:Typelcost,//子树费用的下界

cc,//当前费用

rcost;//x[s:n-1]中顶点最小出边费用和

ints,//根节点到当前结点的路径为x[0:s]*x;//需要进一步搜索的结点为x[s+1:n-1]};186.7旅行售货员问题算法描述template<classType>TypeTraveling<Type>::BBTSP(intv[]){//解旅行售货员的优先队列分支定界法,定义最小堆容量为1000

MinHeap<MinHeapNode<Type>>H(1000);Type*MinOut=newType[n+1];//计算MinOut[i]=顶点i的最小出边费用

TypeMinSum=0;//最小出边的费用和

int

i,j;

for(i=1;i<=n;i++){TypeMin=NoEdge;

for(j=1;j<=n;j++)

if(a[i][j]!=NoEdge&&(a[i][j]<Min||Min==NoEdge))Min=a[i][j];

if(Min==NoEdge)returnNoEdge;//无回路

MinOut[i]=Min;

MinSum+=Min;}196.7旅行售货员问题算法描述//初始化

MinHeapNode<Type>E;

E.x=newint[n];

for(i=0;i<n;i++)

E.x[i]=i+1;//需要进一步搜索的结点为x[s+1:n-1]

E.s=0;//根节点到当前结点的路径为x[0:s]

E.cc=0;

E.rcost=MinSum;//x[s:n-1]中顶点最小出边费用和Typebestc=NoEdge;206.7旅行售货员问题算法描述//搜索排列空间树

while(E.s<n-1){//非叶节点

if(E.s==n-2){//当前扩展结点是叶结点的父结点

//再加2条边构成回路

//判断回路是否优于当前最优解

if(a[E.x[n-2]][E.x[n-1]]!=NoEdge&&a[E.x[n-1]][1]!=NoEdge&&(E.cc+a[E.x[n-2]][E.x[n-1]]+a[E.x[n-1]][1]<bestc||bestc==NoEdge)){//是一条比之前找到的费用更小的回路

bestc=E.cc+a[E.x[n-2]][E.x[n-1]]+a[E.x[n-1]][1];

E.cc=bestc;

E.lcost=bestc;

E.s++;

H.Insert(E);}//把满足if条件的叶结点插入到优先队列elsedelete[]E.x;}//不满足条件就舍弃该叶结点

21else{//非叶节点的父结点时,产生当前扩展结点的所有儿子结点

for(i=E.s+1;i<n;i++){

if(a[E.x[E.s]][E.x[i]]!=NoEdge){//可行子结点

Typecc=E.cc+a[E.x[E.s]][E.x[i]];Typercost=E.rcost-MinOut[E.x[E.s]];Typeb=cc+rcost;//子节点的下界

if(b<bestc||bestc==NoEdge){//子树可能含有最优解,结点插入最小堆

MinHeapNode<Type>N;

N.x=newint[n];

for(j=0;j<n;j++)

N.x[j]=E.x[j];N.x[E.s+1]=E.x[i];//下一个扩展结点

N.x[i]=E.x[E.s+1];//原先的扩展结点被交换到后面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论