Tính cấp thiết của đề tài Đặt vấn đề Trong lĩnh vực nghiên cứu thuật toán và tối ưu hóa, các bài toán liên quan đến quy hoach dong dynamic programming co vai trò quan trọng trong việc
Trang 1
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP HÒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
YY UNIVERSITY
OF TRANSPORT HOCHIMINH CITY
Bao cao cudi ky
Nganh: Cong nghé thong tin
Giảng viên hướng dẫn: Huỳnh Thanh Việt
Sinh viên thực hiện: Lê Viết Thiện
MSSV: 0402050299653
Lop: CN2303CLCB
TP Hồ Chí Minh, 2024
BM-TN-05 =
Trang 2LỜI MỞ ĐẦU
1 Tính cấp thiết của đề tài
Đặt vấn đề
Trong lĩnh vực nghiên cứu thuật toán và tối ưu hóa, các bài toán liên quan đến quy hoach dong (dynamic programming) co vai trò quan trọng trong việc giải quyết các bài toán phân nhóm và tối ưu chỉ phí Bài toán phân chia N số thành hai nhóm đề tôi ưu tích của tông (Bài L) và bài toán phân chia một đa giác lồi thành các tam giác sao cho tông
độ dài đường chéo là nhỏ nhất (Bài 2) không chỉ có ý nghĩa lý thuyết mà còn mang ứng dụng thực tiễn cao trong kỹ thuật, thiết kế và tối ưu hóa không gian
Tầm quan trọng và ý nghĩa
Bài 1: Ap dung trong phan bồ tài nguyên, tối ưu hóa sản xuất, và quản lý dữ liệu Bài 2: Ứng dụng trong thiết kế kiến trúc, định tuyến không gian, và giảm chỉ phí kết nối trong các mạng hình học
2 Tình hình nghiên cứu
Các nghiên cứu liên quan đến hai bài toán:
¢ - Bài toán phân nhóm tối ưu:
Được nghiên cứu rộng rãi trong lĩnh vực lập trình động, điển hình là các bài toán như Knapsack Problem (bài toán cái túi) và Partition Problem (bai toan phan hoạch)
« - Bài toán đa giác lồi:
Một biến thê của bài toán chia đa giác (Polygon Triangulation) đã được nghiên cứu từ các năm 1970 với các thuật toán tối ưu như thuật toán của Graham hay Ear Clipping
Tuy nhiên, việc tối ưu hóa độ dài đường chéo trong đa giác lỗi vẫn là chủ đề hấp dân
3 Mục đích nghiên cứu
¢ Bai toan 1: Tim cach phan chia tối ưu sao cho tích tổng hai nhóm là lớn nhất
« _ Bài toán 2: Xác định cách chia một đa giác lồi thành N-2 tam giác sao cho tổng
độ dài các đường chéo là nhỏ nhất
Cả hai bài toán hướng đến việc sử dụng thuật toán quy hoạch động đề đạt được kết quả tối ưu với độ phức tạp tính toán hợp ly
4 Nhiệm vụ nghiên cứu
« _ Phân tích bài toán và xây dựng công thức truy hồi cho cả hai bài toán
« _ Xây dựng chương trình giải quyết bài toán với dữ liệu đầu vào đa dạng
« - Đánh giá kết quả đạt được thông qua các trường hợp kiểm thử và phân tích độ phức tạp thuật toán
5 Phương pháp nghiên cứu
- _ Thu thập thông tin: Tổng hợp các thuật toán đã nghiên cứu từ tài liệu và sách học thuật
‹ _ Phân tích và thiết kế thuật toán: Sử dụng phương pháp quy hoạch động đê tối
ưu hóa lời gIải
Trang 3Công cụ: Ngôn ngữ lập trình: C++
6 Các kết quả đạt được của đề tài
Bài 1:
Chương trình cho phép nhập vào N số nguyên, thực hiện phân nhóm tối ưu và trả
về kết quả bao gồm: hai nhóm, giá trị tổng của từng nhóm, và tích tối đa Bài 2: - - - Chương trinh tính toán cách chia đa giác tôi ưu, xuât ra tông độ dài nhỏ nhất va danh sách các đường chéo được chọn
7 Kết cấu của báo cáo
Chương 1: Tổng quan vẻ bài toán và các nghiên cứu liên quan
Chương 2: Phân tích và thiết kế thuật toán cho bài toán phân nhóm (Bài l) Chương 3: Phân tích và thiết kế thuật toán cho bài toán đa giác (Bài 2) Chương 4: Đánh giá và kết luận
Trang 4DANH MỤC BẢNG BIỂU
Hình I: Bảng ma trận quy hoạch động chia nhóm Hinh 2 File input.txt
Hinh 3 File output.txt
Trang 5MỤC LỤC
LOT MỞ ĐẦU - TH HH HH HH TH TH HH1 HH HH 1g gu 2 DANH MỤC BẢNG BIỂU 1 St E 1E E1 EEEEEEEEE7151111E11E1157121121211E 111111 TTETTE1E1ETTETEETEE71111E1EEESExsrr 4
Chương 1: Tổng quan về bài toán và các nghiên cứu liên quan -. 55s Sccsse se re sxey 6 DAD Dat VAIN rô 6 1.2 Tình hình nghiên CỨU - LH HH HH TH KH KH KT HT KH BH 6 1.2.1 Bài toán phân nhóm tối ưu (Bài 1) cà HH HH HH TH KH KH HH kh 6 I2: 0 03a 002 o0) vì 0 6
1.3 Tinh cap thiét ctha G6 tai 6 1.3.1 VO Dy thuryet noe ccce ce ceceee cece cecee cee eeeeceeeeseeeeecaeecaecacecaesaaeeaeceesaeseeseeseaeseeeseeseeetieeeeeaeeeaes 6 1.3.2 án 6
1.4 Kt ludim ChUONG «0.0 7 Chương 2: Phân tích và thiết kế thuật toánn - 2À S 2Q 2S TT TH TH TT kg ngưng 7 2.1 Phân tích bài toán - HH HH HH KHE TK TH KH KT KH Hi 7
VY CN 8i ni 0n nh 7
VX⁄98040 (0110061) 0787 ` 7
2.4 [it 00080 vi in 0n nh e 9 2.5 Độ phức tạp thuật toán
2.6 Kết quả thực nghiệm - - - S01 nn TH TH TT TH TH TH TH HT TH KH rr 2.7 Kết luận chương - - LH TH HH TH KH TH KHE HT KH TH ki TÔ Chương 3: Phân tích và thiết kế thuật toán cho bài toán chia đa giác lồi TÔ
3.1 Phân tích bài toán - . - LH TH HH HH TK HH HT KH ĐH
3.3 Mã nguồn thuật toán
3.4 MO ta thuat toa -cdidcdẢẢ
kh S8 j0) ni 8n 13 3.6 Kết quả thực nghiệm - LH ng TH KHE HH ĐH KHE KT KH TH kh 13 3.7 Kết luận chương .- - ch KH TK KHE TT KH BH kh 13 Chương 4: Đánh giá kết luận
4.1 Đánh giá kết quả
CV CN 00) 010 e
N411)08101/18.3 (00 ẽ 15
Trang 6Chương 1: Tổng quan về bài toán và các nghiên cứu liên quan
1.1 Đặt vấn đề
Phan chia tài nguyên và tôi ưu hóa chỉ phí luôn là những vẫn đề quan trọng trong nhiều lĩnh vực như sản xuất, thiết kế hệ thông, và quản lý dữ liệu Hai bài toán trong đề tài này tập trung vào việc tối ưu hóa theo hai cách tiếp cận:
« _ Bài toán 1: Phân nhóm N số nguyên sao cho tích tông hai nhóm đạt giả trị lớn nhất
« _ Bài toán 2: Chia một đa giác lồi thành các tam giác không giao nhau, sao cho tông độ dài các đường chéo là nhỏ nhất
Cả hai bài toán đều mang ý nghĩa thực tiễn và lý thuyết cao, thách thức người nghiên cứu trong việc phân tích cầu trúc bài toán và tìm ra thuật toán hiệu quả
1.2 Tình hình nghiên cứu
1.2.1 Bài toán phân nhóm tối ưu (Bài 1)
Bài toán phân nhóm tối ưu, hay còn gọi là bài toán phân hoạch (Partition Problem), được nghiên cứu rộng rãi trong lĩnh vực tối ưu hóa rời rạc Đây là bài toán cơ bản với nhiều ứng dụng thực tiễn, đặc biệt trong việc chia nguồn lực hoặc tối ưu hóa tài nguyên Phương pháp nôi bật:
« - Thuật toán quy hoạch động:
Quy hoạch động (dynamic programming) là một phương pháp được sử dụng trong toán học và khoa học máy tính để giải quyết các vẫn đề phức tạp bằng cách chia chúng thành các bài toán con đơn giản hơn Bằng cách giải mỗi bài toán con chỉ một lần và lưu trữ kết quả, nó tránh được các phép tính dư thừa, dẫn đến giải pháp hiệu quả hơn cho nhiều bài toán
1.2.2 Bài toán chia đa giác lồi (Bài 2)
Bài toán chia đa giác lỗi thành các tam giác, còn được biết đến là bài toán Polygon Triangulation, là một trong những vấn đẻ quan trọng trong đồ họa máy tính, hình học tính toán và thiết kế không gian
Phương pháp nôi bật:
« - Thuật toán quy hoạch động:
Thuật toán này tối ưu hóa việc lựa chọn các đường chéo dựa trên việc chia nhỏ bài toán lớn thành các bài toán con, từ đó giảm tổng chỉ phí (ví dụ: độ dài các đường chéo) Đây là cách tiếp cận phổ biến nhất đề giải bài toán này do hiệu quả cao và khả năng mở rộng
1.3 Tính cấp thiết của đề tài
1.3.1 Về lý thuyết
« _ Cả hai bải toán đều là các bài toán tối ưu hóa điền hình, đòi hỏi sự hiểu biết và khả năng áp dụng linh hoạt thuật toán quy hoạch động
1.3.2 Về ứng dụng
« _ Bài 1: Góp phân tối ưu hóa phân bô tài nguyên hoặc cân bằng khối lượng công việc trong sản xuât - ¬
« - Bài 2: Có giá trị thực tiên trong thiết kê kiên trúc, xử lý mô hình hình học, và
Trang 7phát triển đồ họa máy tính
1.4 Kết luận chương
Chương này đã tóm tắt các nghiên cứu liên quan đến hai bài toán, cùng với lý do chọn đề tài Việc tập trung nghiên cứu hai bài toán trên không chỉ giúp giải quyết các vấn đề lý thuyết quan trọng mà còn mang lại ý nghĩa ứng dụng thực tiễn cao Trong các chương tiếp theo, nội dung sẽ tập trung vào phân tích, thiết kế, và triển khai thuật toán quy hoạch động để giải quyết các bài toán nay
Chương 2: Phân tích và thiết kế thuật toán
2.1 Phân tích bài toán
Bài toán phân nhóm tối ưu yêu cầu chia một tập các số nguyên thành hai nhóm sao cho tích của tổng hai nhóm đạt giá trị lớn nhất Đây là một dạng bài toán phân hoạch (Partition Problem) với các yêu cầu sau:
« _ Tìm hai tập con không giao nhau từ tập số nguyên ban đầu
« Tổng của hai tập con phải bằng tổng của tập số nguyên ban đầu
« _ Tích của tổng hai tập con phải đạt giá trị lớn nhất
Ý tưởng chính:
« - Sử dụng thuật toán quy hoạch động đề xác định tông gần nhất bằng một nửa tông của toàn bộ phần tử trong mảng
« - Sau khi tìm được tổng tôi ưu, ta tạo 2 nhóm dựa trên tổng này
2.2 Thiết kế thuật toán
1 Bước chuẩn bị dữ liệu:
- _ Tính tổng toàn bộ các số nguyên
-_ Đặt mục tiêu là tìm một tổng gần bằng total / 2 (gọi la target)
2 Sử dụng quy hoạch động:
- _ Tạo một mảng trạng thái dp đề kiểm tra xem có thê đạt được tông từ 0 đến target hay không
- _ Cập nhật mảng trạng thái bằng cách duyệt qua các số nguyên và kiếm tra các tông khả thi
3 Truy vết để chia tập:
-_ Dựa vào mảng đp, tìm tổng lớn nhất có thể đạt được (sum1) nhỏ hơn hoặc bằng target
- Tinh tong con lai (sum2 = total - sum1)
- Phan chia cac s6 vao hai tập con dựa trên tông đạt được
4 Tính kết quả:
- Tinh va in ra tích của hai tông
- Inra hai tập con
2.3 Mã nguồn thuật toán
#include <iostream>
#include <vector>
using namespace std;
Trang 8
void dividearrMinDifference(vector<int>& arr) {
// tinh tổng n số nguyên
int total = 0;
for (int items : arr)
total += items;
int n = arr.size();
int target = total / 2;
vector<bool> dp(target + 1, false);
dp[0] = true;
for (int i = 0; <n; i++) {
for (int j = target; j >= arr[i]; j ) {
if (dp[j - arr[i]])
dpfj] = dpfj - arr[i]];
}
int sum1;
for (sum1 = target; sum1 >= 0; sum1 ) {
if (dp[sum1])
break;
}
int sum2 = total - sum1;
vector<int> part1, part2;
int currentSum = sum1;
for (inti=n- 1; i>= 0; i ) {
if (currentSum >= arr[i] && dp[currentSum - arr[i]]) {
part1.push_back(arr{i]);
currentSum -= arr[Ï];
}
currentSum = sum2;
for nti =n - 1;i >= 0; i ) {
if đind(part1.beginQ, part1.endQ, arr[i]) == part1.end(Q) {
part2.push_back(arr{i]);
}
cout << "Part 1:";
for (int items : part1)
Cout << items << " ";
cout << "(" << total - sum2 <<" phan tu)" << endl;
Trang 9
cout << "Part 2: ";
for (int items : part2)
cout << items << "";
cout << "(" << total - sum1 <<" phan tu)" << endl;
cout << "Tich hai tong lon nhat: "<< sum1 * sum2 << "\n";
}
int main() {
vector<int> arr = { 2, 5, 4, 3, 15};
dividearrMinDifference(arr);
return 0;
2.4 Mô tả hoạt động của thuật toán
Bước khởi tạo:
Tính tổng toàn bộ các số và khởi tạo mảng trạng thái dp
Cập nhật mảng dp: Lấy tổng các phần tử trong mảng rồi chia cho 2 để tìm ra target Sử dụng quy hoạch động để kiêm tra khả năng tạo thành các tông từ 0 đến target
CASE TEST : 2, 5, 4, 3, 15
2 1
25 2
254 3
25.43 4
2,5,4,3,15 5
Hinh 1: Bang ma trén quy hoạch động chia nhóm Tim tong gan nhat:
Dựa trên mảng dp, xác định tông gần nhất với target (lớn nhất có thé)
Truy vết và chia tập:
Lần lượt truy vết dé xác định các phần tử thuộc hai tập con
2.5 Độ phức tạp thuật toán
1
2
Thời gian:
O(n x target), với n là số lượng phân tử và target là một nửa tông các sô Không gian:
O(target), do chỉ cần mảng trang thai dp
2.6 Kết quả thực nghiệm
Với dữ liệu đầu vào {2, 5, 4, 3, 15}, thuật toán trả về:
Part 1:3 45 2( 14)
Trang 10« Part2: 15 (15)
¢ Tich hai tông lớn nhất: 210
2.7 Kết luận chương
Thuật toán quy hoạch động được thiết kế giúp giải quyết bài toán phân nhóm tối ưu một cách hiệu quả Phương pháp này đảm bảo tìm được kêt quả chính xác với thời gian tinh toán hợp lý, phù hợp với các bải toán phân hoạch lớn hơn Trong chương tiệp theo, chúng ta sẽ phân tích bài toán chia đa giác lỗi và xây dựng thuật toán tương ứng
Chương 3: Phân tích và thiết kế thuật toán cho bài toán chia đa giác lôi
3.1 Phân tích bài toán
Bài toán chia đa giác lồi:
« - Một đa giác lồi gồm nnn đỉnh được chia thành các tam giác sao cho tổng độ dài các đường chéo được sử dụng là nhỏ nhất
« Đa giác lồi được xác định bằng tọa độ của các đỉnh
Ý tưởng chính:
« - Sử dụng quy hoạch động để tìm cách chia tối ưu
« Xác định chỉ phí nhỏ nhất khi chia đa giác thành hai phần tại các điểm kkk giữa hai dinh ii va jjj
C ác bước thực hiện:
Xác định độ dài các đường chéo giữa các đỉnh
2 Duyệt qua tất cả các cách chia và chọn cách chia có tổng chi phí nhỏ nhất
3 Sử dụng bảng lưu trữ dé ghi lai chi phí tối ưu cho từng đoạn
3.2 Thiết kế thuật toán
1 Đọc dữ liệu đầu vào:
o Tw file input.txt, nhap số lượng đỉnh nmn và tọa độ các đỉnh
2 Tính độ đài đường chéo:
o Tao mang d[i][j] lưu trữ độ dài đường chéo giữa hai đỉnh 11 và JJJ
3 Quy hoạch động:
o_ Tạo bảng LI]J] đề lưu chỉ phí nhỏ nhất khi chia đa giác từ đỉnh iii dén jj
o Tinh chi phi téi wu bang cách thử tất cả các đỉnh trung gian kkk giữa iii va
|ÌỆ
4 Truy vết:
o_ Sử dụng bảng truy vết H[ï][j] để lưu lại đỉnh trung gian tối ưu khi chia đoạn từ iii đến jjj
o_ Dựa vào bảng này, xây dựng các tam giác tối ưu
5 Ghi kết quả:
o_ Ghi tông độ đài các đường chéo và cách nối các đỉnh vào file output.txt 3.3 Mã nguồn thuật toán