Bài toán người du lịch Bài toán ng ườ i du l ị ch Có n thành phố ñược ñánh sốtừ 1 ñến n, chi phí ñi từthành phố i ñến thành phốj là C[i, j].. Một người ñi du lịch xuất phát từmột thành p
Trang 2b) UCLN(M, N) = UCLN(M, phần dư của M/N) nếu N<>0
a) F(0) = F(1)= 1
Trang 3M ộ t ñị nh nghiã ñệ qui ph ả i có 2 thành ph ầ n:
Trang 4int UCLN(int M, int N)
Trang 5• V i S là thao tác không ñệqui
Ví dụ: Hàm tìm giá trịphần tửF(n) của dãy Fibonacci
3- Đệ qui phi tuyến:
L ờ i g ọ i ñệ qui ñượ c th ự c hi ệ n bên trong vòng l ặ p
Hàm F()
{
{
Nếu (thỏa ñiều kiện dừng) thì <thực hiện S>
Ngược lại < gọi ñệ qui F >
}
}
Trang 7T ổ ng quan thu ậ t gi ả i Quay lui (BackTracking)
Tổng quan thuật giải Quay lui (BackTracking)
• C ấ u trúc l ờ i gi ả i là m ộ t t ậ p h ợ p có N ph ầ n t ử cùng ki ể u
• Xác ñị nh giá tr ị t ừ ng ph ầ n t ử , d ự a trên t ậ p giá tr ị ñề c ử
• Để tìm m ộ t l ờ i gi ả i khác, ta quay lui ch ọ n giá tr ị khác cho m ỗ i ph ầ n t ử
Xn
… X3 X2 X1
Trang 8Bài toán: Li ệ t kê các dãy nh ị phân có ñộ dài n
0 0 1
Cấu trúc lời giải
Xác ñị nh giá tr ị ph ầ n t ử X[i] c ủ a dãy nh ị phân
Trang 9– Giá trị các phần tử phải phân biệt
– Các tập con phải khác nhau
Trang 10{ Ghi nh ậ n giá tr ị v ñã ñượ c ch ọ n;
Try( i+1); //G i ñ qui ñ xác ñ nh ph n t X i+1
B ỏ ghi nh ậ n giá tr ị v ñã chọ n; (n ế u c ầ n)
Trang 11cho các thành phần trước ñó
Chú ý: Dãy {1, 2, 3} và dãy {2, 1, 3} là khác nhau
H ng gi i quy t chung là t ch c các bi n tr ng thái l u
tr thông tin ph c v cho vi c ki m tra:
Try( i + 1 );
F[v] = 0;
} }
}
Trang 12Thu ậ t gi ả i xác ñị nh b ướ c ñ i th ứ i c ủ a quân Mã
Try(i+1);
x = u-dx[j]; y = v-dy[j];
BC[u,v] = 0;
Trang 13Bài toán: Đặ t 8 Quân H ậ u trên bàn c ờ qu ố c t ế 8x8 sao cho
các quân H ậ u không ă n nhau
ñường chéo nào ñã có quân hậu:
– Đường chéo ngược: CN[1 15]
Ô(d, c) thuộc ñường CN[c + d - 1]
– Đường chéo xuôi: CX[1 15]
Ô(d, c) thuộc ñường CX[ 8 + c – d]
• Tổchức biến trạng thái ñểghi nhận cộ
ñã có quân hậu: Cot[1 8]
1 2 3
1 2 3
Thu ậ t gi ả i xác ñị nh c ộ t ñặ t quân h ậ u trên dòng d
Thu ậ t gi ả i xác ñị nh c ộ t ñặ t quân h ậ u trên dòng d
DienDong(d+1);
Cot[ c ] = CN[c + d -1] = CX[8+c-d] = 0;
}}
Trang 14Bài toán người du lịch
Bài toán ng ườ i du l ị ch
Có n thành phố (ñược ñánh sốtừ 1 ñến n), chi phí ñi từthành phố i ñến thành
phốj là C[i, j]
Một người ñi du lịch xuất phát từmột thành phốmuốn ñi thăm các thành phố
khác, mỗi thành phố ñúng một lần rồi quay về nơi xuất phát
Hãy tìm 1 hành trình cho người du lịch ñểtổng chi phí theo hành trình này là ít
1230
Trang 151 i
1 i
i , X C X , X X
4
0421
4012
2103
1230
Try( i + 1 );
F[ j ] = 0;
} }
}
Trang 16• Sminlà tổng chi phí thấp nhấ ñã chọn trong các hành trình tìm ñược Khởi
tạo ban ñầu cho Smin = Cmax * (n + 1), trong ñó Cmax là chi phí lớn nhấ
trong các chi phí C[i, j] ñã cho
1 i
1 i
X C
(i=1, ,n) Xác ñịnh các ñồ vật cần bỏ vào ba lô sao cho tổng
trọng lượng không quá M nhưng có tổng giá trị là lớn nhất
Trang 18Công d ụ ng
Công dụng
• Ý t ưở ng:
– Thêm vào thuật toán quay lui khả năng ñánh giá lời giải tối ưu ở
từng bước xác ñịnh phần tử Xi
– Nếu tại bước thứ i ñánh giá ñược lời giải sẽ không tối ưu thì quay
lui ngay không cần phải tìm tiếp các phần tử khác.
Mô hình ñ ánh giá nhánh c ậ n
trong thu ậ t toán quay lui:
Mô hình ñánh giá nhánh cận
trong thuật toán quay lui:
void Try( int i )
Trang 19Bài toán người du lịch
Bài toán ng ườ i du l ị ch
Có n thành phố (ñược ñánh sốtừ 1 ñến n), chi phí ñi từthành phố i ñến thành
phốj là C[i, j]
Một người ñi du lịch xuất phát từmột thành phốmuốn ñi thăm các thành phố
khác, mỗi thành phố ñúng một lần rồi quay về nơi xuất phát
Hãy tìm 1 hành trình cho người du lịch ñểtổng chi phí theo hành trình này là ít
4
0421
4012
2103
1230
Ma trận chi phí C
Phân tích:
• Cấu trúc lời giải là dãy: X[1 n]
– X[1] = 1 ñược xem là thành phố xuất phát.
– X[2 n] là một hoán vị của các thành phố 2, ,n.
• Tổ chức ghi nhận lời giải tối ưu:
ñược Khởi tạo ban ñầu cho Smin = Cmax * (n + 1), trong ñó Cmax
là chi phí lớn nhất trong các chi phí C[i, j] ñã cho
Trang 20T ổ ch ứ c ñ ánh giá l ờ i gi ả i t ạ i b ướ c th ứ i:
Tổ chức ñánh giá lời giải tại bước thứ i:
• Mảng T[1 n]: T[i] chứa tổng chi phí từ X[1] ñến X[i]
• Gọi Cmin là chi phí thấp nhất trong các chi phí C[i, j].
• Sau khi xác ñịnh X[i], nếu ñi tiếp (n – i +1) thành phố nữa thì chi
phí tối thiểu phải là: T[i] + Cmin*(n-i+1)
• Nếu T[i] + Cmin*(n-i+1) < Smin thì lời giải tìm ñược có khả năng
tối ưu, ngược lại thì không tối ưu.
Trang 211 Có N gói kẹo, gói thứi có Ai cục kẹo Xây dựng thuật toán chia N gói kẹo
thành hai phần sao cho ñộchênh lệch sốkẹo giữa hai phần là ít nhất Yêu
cầu, không ñược thay ñổi sốkẹo trong mỗi gói ; in ñộchênh lệch nhỏnhấ
giữa hai phần có thể ñược và in danh sách gói kẹo của từng nhóm
2 Cho 1 mảng gồm n các sốnguyên a[1], a[2], , a[n] và một sốnguyên S Hãy
tìm tất cảcác dãy con : 1 <= x1 < x2 < < xk <= n sao cho: a[x1] + a[x2] + +
a[xk] = S
3 Một dây chuyền sản xuất có N (N<=100) vịtrí Có N công nhân, cho biết năng
suất của công nhân thứi mà làm ởvịtrí thứj là Cij (Cij : Integer) Hãy sắp xếp
N công nhân vào N vịtrí sao cho ñạt năng suất cao nhấ
4 Tính sốcách và in tất cảcác cách phân tích sốtựnhiên N >1 thành tổng các
sốtựnhiên nhỏ hơn nó (mọi phân tích chỉkể ñúng một lần: 4+3+1 và 1+4+3
chỉlà một)
5 Hãy tìm tập hợp các dấu '+’, ‘-‘ và không dấu giữa dãy số 123456789 sao cho
ñược một biểu thức có giá trịb ng = N cho trước Ví dụ: N = 280 ta có các tổ
hợp sau: 1+2+345-67+8-9; 1+234-5+67-8-9; 123-4+5+67+89
Trang 226 Cho một dãy N sốnguyên Hãy loại bỏkhỏi dãy một sốphần tử ñể ñược mộ
dãy con, có ít nhất 2 phần tử, không giảm và dài nhất In ra dãy con ñó
Ví dụ: N = 10: 2 6 -7 5 8 1 -3 5 15 9
Kết quảtìm ñược dãy con không giảm dài nhất có 4 phần tử:
-7 -3 5 9
7 Một người cha mang theo sốtiền là M vào một cửa hàng ñểmua K món quà
ñểtặng cho các con Trong cửa hàng có N mặt hàng, mặt hàng thứi có giá
tiền là Ai Người cha cần chọn K (K < N) mặt hàng khác nhau ñểlàm quà
sao cho tổng sốtiền của K mặt hàng này là lớn nhất nhưng không lớn hơn
sốtiền mang theo
8 Mỗi hột xí ngầu có 6 mặt, mỗi mặt chứa từ 1 ñến 6 dấu chấm Liệt kê các kế
quảphân biệt có thểcó khi ñổcùng lúc 3 hột xí ngầu, không kểthứtựxuấ
hiện trên các hột xí ngầu, ví dụ{1, 2, 3} và {2, 3, 1} là như nhau
9 Trên bàn cờô vuông 4x4 xếp 8 quân cờg m 4 quân màu ñen và 4 quân
màu trắng sao cho trên mỗi hàng và mỗi cột có ñúng một quân màu ñen và 1
quân màu trắng Thểhiện trên màn hình các cách sắp xếp này
10 Một cơ sởsản xuất cần phân công M nhân viên tham gia thực hiện N hợp
ñồng sản xuất sản phẩm (M >= N) Mỗi nhân viên chỉtham gia thực hiện mộ
hợp ñồng Người ta dựtính rằng, nếu phân công i nhân viên tham gia thực
hiện hợp ñồng j thì có thời gian hoàn thành hợp ñồng là T[i,j] Hãy tìm
phương án phân công mỗi hợp ñồng bao nhiêu nhân viên sao cho tổng số
thời gian hoàn thành N hợp ñồng là ít nhấ
11 Cho ma trận vuông cấp 8 chứa các sốnguyên Tìm giá trị ớn nhất của tổng
8 sốh ng trên ma trận sốtrên sao cho 2 sốh ng bất kỳtrong 8 sốh ng trên
không nằm trên cùng một hàng, không cùng nằm trên một cột và không cùng
n m trên ñường chéo
... viên cho tổng sốthời gian hồn thành N hợp đồng nhấ
11 Cho ma trận vuông cấp chứa sốnguyên Tìm giá trị ớn tổng
8 sốh ng ma trận sốtrên cho sốh ng bất kỳtrong sốh ng
không... suất cao nhấ
4 Tính sốcách in tất cảcác cách phân tích sốtựnhiên N >1 thành tổng
sốtựnhiên nhỏ (mọi phân tích chỉkể ñúng lần: 4+3+1 1+4+3
chỉlà một)
5 Hãy tìm tập...
• Cấu trúc lời giải dãy: X[1 n]
– X[1] = ñược xem thành phố xuất phát.
– X[2 n] hoán vị thành phố 2, ,n.
• Tổ chức ghi nhận lời giải tối