• 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!