一直没太搞明白分支限界和回溯有什么区别,今天算是终于搞明白了,以最经典的0-1背包问题为例。
n = 3, 0 -1背包问题;
w = [16, 15, 15];
p = [45, 25, 25];
CostMax = 30;
解空间树如下图所示,1代表选择,0代表不选。
初学者一直容易搞混的问题就是结点的问题,这里结点不是代表的解,每一条边才是代表的解;
分支限界法如下处理:
Step1:
可扩展结点:A 活结点队列:B,C
选择路径 :A
当前W:0
当前P:0
Step2:
可扩展结点:B; 活结点队列:C,D,E
选择路径:A->B
当前W:16
当前P:45
Step3:
可扩展结点:C 活结点队列:D,E,F,G
选择路径:A->C
当前W:0
当前P:0
Step4:
如果扩展D,那么当前w = 31 > 30越界,所以直接进行剪枝,解空间树变成如下:
Step5:
可扩展结点:E 活结点队列:F,G,J,K
选择路径:A->B->E
当前W:16
当前P:45
Step6:
可扩展结点:F 活结点队列:G,J,K,L,M
选择路径:A->C->F
当前W:15
当前P:25
Step7:
可扩展结点:G 活结点队列:J,K,L,M,N,O
选择路径:A->C->G
当前W:0
当前P:0
Step8:
如果扩展J,那么当前w = 16+15=31>30,所以对J剪枝,解空间树变为:
Step9:
可扩展结点:K 活结点队列:L,M,N,O
选择路径:A->B->E->G
当前W:16
当前P:45
Step10:
可扩展结点:L 活结点队列:M,N,O
选择路径:A->C->F->L
当前W:30
当前P:50
Step11:
可扩展结点:M 活结点队列:N,O
选择路径:A->C->F->M
当前W:15
当前P:25
Step12:
可扩展结点:N 活结点队列:O
选择路径:A->C->G->N
当前W:15
当前P:25
Step13:
可扩展结点:O 活结点队列:NULL
选择路径:A->C->G->O
当前W:0
当前P:0
活结点队列为空,算法终止,从可行解中筛选出最佳解为(0,1,1),maxP = 50;
回溯法比较好理解,就是本科数据结构教材上讲过的深度优先算法,这里不再多赘述。