You are on page 1of 55

THUẬT TOÁN ỨNG

DỤNG
Thực hành
Buổi 2: Đệ quy
NỘI DUNG

• 01. Cái túi (Knapsack)


• 02. Xếp thùng hàng (Container)
• 03. Phân công giảng dạy (BCA)
• 04. Lập lộ trình xe bus (CBUS)
• 05. Lập lộ trình giao hàng cho nhiều xe (CVRP)
01. Cái túi (Knapsack)
• 1.1 Lịch sử bài toán
• 1.2 Phát biểu bài toán
• 1.3 Ứng dụng
• 1.4 Thuật giải và cài đặt
1.1 Lịch sử bài toán cái túi
• Bài toán cái túi đã được nghiên cứu trong hơn một
thế kỷ, với các công trình đầu tiên có niên đại từ
năm 1897.
• Tên gọi của bài toán xuất hiện từ những công trình
đầu tiên của nhà toán học Tobias Dantzig người
Lithuania (1884-1956)
• Các vấn đề thực tế cần giải quyết
• Vấn đề phổ biến là việc đóng gói các vật phẩm hữu ích
hoặc có giá trị nhất mà không làm quá tải hành lý.
• Vấn đề khó khăn trong việc phân bổ nguồn lực với một
ngân sách hay thời gian giới hạn
1.2 Phát biểu bài toán
• Một nhà thám hiểm cần đem theo một cái túi có trọng
lượng không quá m.
• Có n đồ vật có thể đem theo.
• Đồ vật thứ i có trọng lượng ai và giá trị sử dụng ci.
• Hỏi nhà thám hiểm cần đem theo những đồ vật nào để
cho tổng giá trị sử dụng là lớn nhất.
• Tổng trọng lượng đồ vật mang theo cái túi không vượt quá
m?
1.2 Phát biểu bài toán
1.3 Ứng dụng
• Tối thiểu hóa kho lưu trữ

• Lựa chọn danh mục đầu tư

• Lựa chọn mã để chứng


khoán hóa tài khoản

• Xếp hàng trong lĩnh vực


vận chuyển hàng hóa
1.4 Thuật giải và cài đặt
• Duyệt toàn bộ
• Thuật toán 01
• Thuật toán 02
1.4 Thuật giải và cài đặt
Thuật toán 01:
• Mỗi cách chọn lấy các đồ vật tương ứng với một dãy
nhị phân độ dài n.
• bit thứ i là 0/1 tương ứng là không lấy/có lấy đồ vật thứ i.
• Duyệt hết các xâu nhị phân độ dài n và tìm nghiệm tốt
nhất.
• Để xét hết các xâu nhị phân độ dài n, có thể dùng đệ
quy - quay lui hoặc chuyển đổi giữa thập phân với nhị
phân.
• Độ phức tạp O(2n × n)
1.4 Thuật giải và cài đặt
Thuật toán 01:
1.4 Thuật giải và cài đặt
Thuật toán 02: Đệ quy quay lui
• Thử thêm vào túi từng món đồ
• Kiểm tra ràng buộc (trọng lượng đồ trong túi <= m).
• Cập nhật trọng lượng, giá trị sử dụng của túi đồ lúc này.
• Thử thêm vào túi món đồ tiếp theo đến khi trọng lượng
vượt quá b thì quay lui lại.
• Cập nhật lại trạng thái trước đó của trọng lượng và giá trị
sử dụng.
1.4 Thuật giải và cài đặt
Thuật toán 02: quay lui
1.4 Thuật giải và cài đặt
Thuật toán 02: quay lui
1.4 Thuật giải và cài đặt
Thuật toán 03
• Chia tập đồ vật làm hai phần A và B.
• Mỗi cách chọn lấy các đồ vật tương ứng với một cách lấy
bên A kết hợp với một cách lấy bên B.
• Ý tưởng chính:
• Lưu trữ hết các cách lấy bên B và sắp xếp trước theo một
thứ tự.
• Sau đó với mỗi cách lấy bên A, ta có thể tìm kiếm nghiệm
tối ưu bên B một cách nhanh chóng.
• Giả sử cách lấy tối ưu là lấy mA bên A và mB bên B, ta
sẽ xét tuần tự từng mA một và tìm kiếm nhị phân mB.
• Độ phức tạp O(2A × log(2B) + 2B) = O(2n/2 × n) nếu
chọn |A| = |B| = n / 2
1.4 Thuật giải và cài đặt
Thuật toán 03
• S1, S2 là tập các cách lấy bên A, bên B có 2 tham số là
khối lượng (w), giá trị (v) và đã được sort lại theo
tham số khối lượng (w).
• maxValue[j] = max{S2[0].w; S2[1].w,..., S2[j].w}
1.4 Thuật giải và cài đặt
Thuật toán 03
02. Xếp thùng hàng (Container)
• 2.1 Lịch sử bài toán
• 2.2 Phát biểu bài toán
• 2.3 Ứng dụng
• 2.4 Thuật giải và cài đặt
2.1 Lịch sử bài toán
• Một nghiên cứu năm 1999 của Kho lưu trữ thuật toán
Đại học Stony Brook đã chỉ ra rằng, trong số 75 bài
toán thuật toán, bài toán cái túi là bài toán phổ biến
thứ 19 và cần thứ ba sau cây hậu tố và bài toán đóng
gói thùng.
• Thực tế bài toán đóng gói thùng hàng xuất hiện rất
nhiều trong thực tế, việc đóng thùng phải tối ưu nhất
khi kích thước thùng là cố định và kích cỡ hàng hóa
đa dạng.
• Có rất nhiều biến thể của bài toán này, và một trong
đó là bài toán đóng gói thùng hàng tối ưu hai chiều
(cao và rộng)
2.2 Phát biểu bài toán
• Có 1 thùng chứa kích thước chiều ngang là W, chiều
dọc H.
• Yêu cầu: Cần tìm cách xếp N thùng đồ hình chữ nhật
có kích thước là wi x hi với i = 1,2,..,N vào thùng chứa,
biết rằng:
• Các mặt của thùng đồ được xếp song song với các mặt của
thùng chứa.
• Không được xoay các thùng đồ.
• Không có 2 thùng đồ nào chồng lên nhau.
2.2 Phát biểu bài toán
2.3 Ứng dụng
• Tối ưu trong bài toán xếp hàng trên các phương tiện
vận chuyển như xe tải, xe container, tàu biển

• Tối ưu kho bãi


2.4 Thuật giải và cài đặt
Đệ quy quay lui
• Coi thùng chứa gồm WxH ô vuông kích thước 1x1.
• Thử xếp các thùng đồ vào thùng chứa bằng cách đặt
từng thùng đồ vào từng vị trí trong thùng chứa.
• Nếu đặt được thùng đồ đó và thùng chứa, đánh dấu
vị trí đó và thử xếp tiếp thùng đồ tiếp theo.
• Nếu xếp đủ N thùng đồ thì giải quyết xong.
• Ngược lại, nếu chưa đủ thì thử tiếp thùng đồ tiếp
theo.
2.4 Thuật giải và cài đặt
2.4 Thuật giải và cài đặt
2.4 Thuật giải và cài đặt
03. Phân công giảng dạy
(BCA)
• 3.1 Lịch sử bài toán
• 3.2 Phát biểu bài toán
• 3.3 Ứng dụng
• 3.4 Thuật giải và cài đặt
3.1 Lịch sử bài toán
• Bài toán gán việc là bài toán tổng quát
• Trong quá trình phân công công việc, thì mỗi công việc sẽ
tạo ra các giá trị khác nhau, và mỗi người lao động có khi
được phân công công việc sẽ được trả chi phí khác nhau
theo trình độ của họ và công việc không vượt quá khả
năng của người lao động.
• Việc phân công hiệu quả khi chi phí là tối thiểu nhưng lợi
nhuận lại tối đa đồng thời các công việc được giao phải
phù hợp với người lao động.
• Khi số lượng người lao động là bằng 01 thì đó là bài
toán lựa chọn các công việc để đối đa lợi nhuận.
3.2 Phát biểu bài toán BCA
• Mỗi đầu học kỳ các bộ môn phải thực hiện phân công
giảng dạy đều cho các giảng viên.
• Có n khóa học và m giáo viên,
• Mỗi giáo viên có thể dạy nhiều khóa học khác nhau.
• Mỗi một giáo viên không thể dạy hai khóa học có giờ trùng
nhau.
• Load của một giáo viên là số khóa học phải dạy của giáo
viên đó.
• Yêu cầu : Tìm cách xếp lịch cho giáo viên sao cho
Load tối đa của các giáo viên là tối thiểu.
3.2 Phát biểu bài toán BCA
3.3 Ứng dụng
• Áp dụng trong các bài toán lập lịch phân công công
việc
• Áp dụng vào lập lịch trình cất cánh hạ cánh trên các
đường băng
3.4 Thuật giải và cài đặt
• Sử dụng thuật toán vét cạn, duyệt toàn bộ khóa học,
xếp giáo viên dạy khóa học đó.
• Nếu phân công cho giáo viên A môn X, mọi môn
học trùng lịch với môn X không thể được dạy bởi
giáo viên A sau này.
• Nếu maxLoad hiện tại lớn hơn minLoad tối ưu thu
được trước đó thì không duyệt nữa.
3.4 Thuật giải và cài đặt
3.4 Thuật giải và cài đặt
3.4 Thuật giải và cài đặt
3.4 Thuật giải và cài đặt
3.4 Thuật giải và cài đặt
04. Lập lộ trình xe bus (CBUS)
• 4.1 Lịch sử bài toán
• 4.2 Phát biểu bài toán
• 4.3 Ứng dụng
• 4.4 Thuật giải và cài đặt
4.1 Lịch sử bài toán
• Bài toán định tuyến cho một tập các phương tiện đi
để thỏa mãn phục vụ các khách hàng sao cho tối ưu
về đường đi hay thời gian,... được nhắc đến trong
nghiên cứu của George Dantzig và John Ramser vào
năm 1959, trong đó đề xuất thuật toán đầu tiên được
viết và được áp dụng cho việc giao xăng dầu.
• Bài toán này là khái quát của bài toán “Người du
lịch”
4.2 Phát biểu bài toán
• Có n hành khách 1, 2,..., n, hành khách i cần di chuyển
từ địa điểm i đến địa điểm j
• Xe khách xuất phát ở địa điểm 0 và có thể chứa tối đa
k hành khách
• Cho ma trận c với c(i, j) là khoảng cách di chuyển từ
địa điểm i đến địa điểm j
• Yêu cầu: Tính khoảng cách ngắn nhất để xe khách
phục vụ hết n hành khách và quay trở về địa điểm 0
• Lưu ý: Ngoại trừ địa điểm 0, các địa điểm khác chỉ
được thăm tối đa 1 lần
4.2 Phát biểu bài toán
4.3 Ứng dụng
• Thiết kế tuyến xe bus
cho trường học

• Thiết kế tuyến xe bus


trong thành phố
4.4 Thuật giải và cài đặt
Thuật toán 1
• Sử dụng thuật toán vét cạn, thực hiện bằng thủ tục đệ quy
thử mọi thứ tự thăm.
• Dùng bitmask s để lưu trạng thái các địa điểm đã được thăm,
• Biến slhk lưu lại số lượng hành khách ở trên xe khách
• Biến v lưu đỉnh cuối cùng thuộc đường đi đang xét
• Tại mỗi lần gọi đệ quy, ta xét các địa điểm chưa được thăm i
• Nếu 1<= i <= n
• Nếu slhk = k, không thể thăm địa điểm i
• Nếu slhk < k, cập nhật slhk = slhk +1, thêm i vào đường đi hiện tại và gọi
đệ quy
• Nếu n + 1 <= i <= 2n
• Nếu địa điểm i - n đã được thăm, cập nhật slhk = slhk -1, thêm i vào đường
đi hiện tại và gọi đệ quy.
• Ngược lại, không thể thăm địa điểm i
4.4 Thuật giải và cài đặt
Thuật toán 2

• Sử dụng kỹ thuật nhánh cận để giảm số lần gọi đệ


quy.
• Nhận xét: Xe khách luôn cần đi qua 2×N+1 cạnh.
• f là độ dài đường đi hiện tại,
• r là số cạnh mà xe khách còn phải đi qua,
• cmin là độ dài cạnh nhỏ nhất trong số cạnh mà xe cần đi
qua, ta có công thức cận bound=f+r×cmin
• Nếu bound < kết quả tốt nhất đã nhận được thì đi
vào nhánh đó. Ngược lại thì bỏ qua.
4.4 Thuật giải và cài đặt
Thuật toán 2
4.4 Thuật giải và cài đặt
Thuật toán 2
05. Lập lộ trình giao hàng cho
nhiều xe (CVRP)
• 5.1 Lịch sử bài toán
• 5.2 Phát biểu bài toán
• 5.3 Ứng dụng
• 5.4 Thuật giải và cài đặt
5.1 Lịch sử bài toán
• Capacitated Vehicle Routing Problem bắt nguồn từ
năm 1959 khi George Dantzig và John Ramser thiết
lập công thức toán học và phương pháp tiếp cận bằng
thuật toán để giải quyết vấn đề cung cấp xăng dầu
cho các trạm dịch vụ.
• Năm 1964, Clarke và Wright đã cải tiến cách giải của
Dantzig và Ramser bằng cách sử dụng một cách tiếp
cận khác, được gọi là thuật toán tiết kiệm.
5.2 Phát biểu bài toán
• Có K xe tải giống hệt nhau, có sức chứa Q cần được
lên lịch giao hàng từ kho 0 cho khách hàng 1,..,n.
• Khách hàng i yêu cầu d[i] thùng hàng.
• Khoảng cách giữa khách hàng i và j là c[i][j]
Với 0 <= i, j <= n
• Cần xây dựng phương án vận chuyển sao cho:
• Mỗi xe đều được phân công vận chuyển.
• Mỗi khách hàng chỉ được nằm trên 1 tuyến đường.
• Tổng số kiện hàng trên xe không vượt quá tải trọng xe.
 Cần liệt kê các phương án vận chuyển
5.2 Phát biểu bài toán
5.3 Ứng dụng
• Tối ưu lập lộ trình giao hàng trong logistic.

• Tối ưu lộ trình giao hang từ kho đến các chi nhánh


bán lẻ.
5.4 Thuật giải và cài đặt
5.4 Thuật giải và cài đặt
• Thiết kế dữ liệu
• y[k] điểm giao đầu tiên của xe thứ k (y[k] {1,2,...,N}, với
k=1,2,…,K)
• x[i] là điểm tiếp theo của điểm giao i trên lộ trình
(x[i] = {0,1,2,…,N} với i = 1,2,...,N)
• Do các xe giống hệt nhau nên giả định y[1] < y[2] < … <
y[K]
• visited[v] = true nếu v đã được thăm bởi 1 xe nào đó
5.4 Thuật giải và cài đặt
• Chiến lược duyệt
• Bắt đầu bằng việc duyệt bộ giá trị cho (y[1],. . ., y[K])
• Với mỗi bộ giá trị đầy đủ của (y[1],. . ., y[K]), bắt đầu duyệt bộ
giá trị cho x[1,...,N] xuất phát từ x[y[1]]
• Mỗi khi thử giá trị x[v] = u cho xe thứ k thì
• Nếu load[k] + d[v] > Q thì thử phương án khác
• Nếu u > 0 (chưa phải điểm xuất phát) thử duyệt tiếp giá trị cho x[u]
vẫn trên chuyến xe thứ k
• Nếu u = 0 (điểm xuất phát) thì
• Nếu k = K (đã đủ hết các chuyến cho K) xe và điểm giao nào cũng được
thăm thì ghi nhận 1 phương án
• Ngược lại, thử duyệt tiếp giá trị cho chuyến của xe k+1 bắt đầu bởi cho
x[y[k+1]]
• Biến segments
• Ghi nhận số chặng (đoạn nối giữa 2 điểm liên tiếp trên đường đi)
• Khi segments = N+K thì thu được phương án đầy đủ
5.4 Thuật giải và cài đặt
Thank you
for your
attentions!

You might also like