Professional Documents
Culture Documents
Thuật toán nhánh và cận và các ví dụ
Thuật toán nhánh và cận và các ví dụ
Thuật toán nhánh và cận và các ví dụ
• Sơ đồ chung nhánh và cận • Thuật toán quay lui cho phép ta giải các bài toán liệt kê tổ hợp và bài toán tối ưu tổ hợp
• Phương án được mô hình hóa bằng một dãy các biến quyết định X1, X2, . . ., Xn
• Bài toán lộ trình xe buýt đón trả khách
• Cần tìm cho mỗi biến Xi một giá trị từ 1 tập rời rạc Ai cho trước sao cho
• Bài toán lộ trình xe tải giao hàng • Các ràng buộc của bài toán được thỏa mãn
• Tối ưu một hàm mục tiêu cho trước
• Bài toán cắt vật liệu 2D
• Tìm kiếm quay lui
• Duyệt qua tất cả các biến (ví dụ thứ tự từ X1, X2, . . ., Xn), với mỗi biến Xk
• Duyệt lần lượt qua tất cả các giá trị có thể gán cho Xk, với mỗi giá trị v
• Kiểm tra ràng buộc
• Gán cho Xk
• Nếu k = n thì ghi nhận một phương án
• Ngược lại, xét tiếp biến Xk+1
3 4
SƠ ĐỒ CHUNG QUAY LUI, NHÁNH VÀ CẬN SƠ ĐỒ CHUNG QUAY LUI, NHÁNH VÀ CẬN
try(1) Bài toán liệt kê try(1) Bài toán tìm min (ký hiệu f* : kỷ lục)
1 1
try(k){ // thử các giá trị có thể gán cho Xk try(k){ // thử các giá trị có thể gán cho Xk
try(2) try(2) for v in Ak do { try(2) try(2) for v in Ak do {
try(2) try(2)
2 3 if check(v,k){ 2 3 if check(v,k){
. . . . . .
Xk = v; Xk = v;
. . . . . . . . . . . . . . . . . . [Update a data structure D] . . . . . . . . . . . . . . . . . . [Update a data structure D]
5 6
7 8
BÀI TOÁN LỘ TRÌNH XE BUÝT BÀI TOÁN LỘ TRÌNH XE BUÝT
• Một xe buýt xuất phát từ điểm 0 cần được tính toán lộ trình để phục vụ đưa đón n khách và quay • Phân tích cận dưới
trở về điểm 0. Khách i có điểm đón là i và điểm trả là i + n (i = 1, 2, …, n). Xe buýt có K chỗ ngồi để
phục vụ khách. Khoảng cách di chuyển từ điểm i đến điểm j là d(i, j), với i, j = 0, 1, 2, . . , 2n. Hãy tính 0
lộ trình cho xe buýt sao cho tổng độ dài quãng đường di chuyển là nhỏ nhất, đồng thời số khách
trên xe tại mỗi thời điểm không vượt quá K.
X2n X1
• Thuật toán nhánh và cận
• Lộ trình chưa đi qua,
• Mô hình hóa: X1, X2, . . ., X2n là dãy các điểm đón-trả trên lộ trình xe buýt (là hoán vị của 1, 2, …, gồm 2n+1-k chặng,
2n).
mỗi chặng có độ dài X2
• Cmin: khoảng cách nhỏ nhất trong số các khoảng cách giữa 2 điểm lớn hơn hoặc bằng .
• Mảng đánh dấu: visited[v] = true có nghĩa điểm v đã xuất hiện trên lộ trình và visited[v] = false, Cmin .
ngược lại • Độ dài lộ trình đầy . . . .
• load: số khách đang có mặt trên xe đủ phát triển tiếp từ
• Khi lộ trình đi đến điểm đón thì load tăng lên 1 và khi đi đến điểm trả thì load giảm đi 1 Lộ trình bộ phận đã đi
Xk sẽ lớn hơn hoặc
• f: độ dài của lộ trình bộ phận qua
bằng f + Xk-1
• k chặng
• f*: độ dài lộ trình ngắn nhất đã tìm thấy (kỷ lục) Cmin*(2n+1-k) Xk
• Độ dài f
Xk
9 10
THANK YOU !
if k = n then updateBest(); }
else { return true;
if f + Cmin*(2n+1-k) < f* then }
try(k+1);
} updateBest(){
if v n then load -= 1; else load += 1; if f + d(X2n,0) < f* then {
f = f - d(Xk-1,Xk); visited[v] = false; f* = f + d(X2n,0);
} }
} }
}
11 12