一直沒太搞明白分支限界和回溯有什麼區別,今天算是終於搞明白了,以最經典的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;
回溯法比較好理解,就是本科數據結構教材上講過的深度優先算法,這裏不再多贅述。