Mỗi cuộc họp i có thời điểm bắt đầu si và một thời điểm kết thúc fi, mà si ≤ fi.. Nếu được lựa chọn, cuộc họp i diễn ra trong thời khoảng [si, fi.. GIẢI THUẬT SƠ BỘ Trong thủ tục áp
Trang 1LOGO TRƯỜNG ĐẠI HỌC SƯ PHẠM TPHCM KHOA CÔNG NGHỆ THÔNG TIN
LỚP TIN HỌC KHÓA 35
BÁO CÁO BÀI TẬP LỚN
MÔN: CẤU TRÚC DỮ LIỆU 2
GVHD: ThS NGUYỄN THỊ BÍCH NGÂN
THỰC HIỆN: NHÓM 25 NGUYỄN NGỌC NHẤT LINH
ĐINH VĂN QUYÊN
Trang 2phục vụ được nhiều cuộc họp nhất.
2
Trang 3PHÂN TÍCH BÀI TOÁN
Giả sử ta có một tập S = {1, 2, …, n} gồm n cuộc
họp nhưng chỉ có 1 phòng hội thảo nên chỉ có thể được dùng cho một cuộc họp tại một lúc
Mỗi cuộc họp i có thời điểm bắt đầu si và một
thời điểm kết thúc fi, mà si ≤ fi Nếu được lựa
chọn, cuộc họp i diễn ra trong thời khoảng [si, fi) Cuộc họp i và j là tương thích nếu thời khoảng
[si, fi) và [sj, fj) không phủ lấp lên nhau (tức là, i
và j là tương thích nếu si >= fj hay sj >= fi)
MĐFBM HDJF HJFD JDKF
3
Trang 4PHÂN TÍCH BÀI TOÁN
Trang 5GIẢI THUẬT SƠ BỘ
Trong thủ tục áp dụng giải thuật tham lam để giải bài toán bố trí cuộc họp, ta cần phải sắp các cuộc họp theo thứ tự tăng của thời điểm kết thúc : f1 ≤ f2 ≤ … ≤ fn.
procedure MEETING-SELECTOR(S, f) ; /* S là mảng giữ thời điểm bắt đầu và f là mảng giữ thời điểm kết thúc */
5
Trang 8HÀM BỐ TRÍ LỊCH HỌP
void boTriLichHop() {
dem++;
luu[dem]=i;
} }
}
8
Trang 10NHẬN XÉT
Giải thuật tham lam áp dụng vào bài toán lựa chọn một khả năng tối ưu cục bộ với hy vọng
sẽ dẫn đến một lời giải tối ưu toàn cục
Giải thuật không nhất thiết đem lại lời giải tối
ưu Tuy nhiên thủ tục void boTriLichHop() ở trên thường tìm được một lời giải tối ưu cho một thể hiện của bài toán bố trí phòng họp
10
Trang 12PP QUY HOẠCH ĐỘNG
Nhận xét: Với cách làm này ta đã chia 1 bài toán lớn (dãy con của n cuộc họp) thành các bài toán con cùng kiểu có kích thước nhỏ
hơn (dãy con của dãy có i cuộc họp đầu tiên) Vấn đề là công thức truy hồi để phối hợp kết quả của các bài toán con
12
Trang 13đầu tiên ta sẽ được dãy cuộc họp được sắp dài nhất xét từ 0 đến i.
13
Trang 14TỔ CHỨC DỮ LIỆU
s[MAX], f[MAX], *name[MAX], n, luu[MAX]
giống như khai báo ở trên
int truoc[MAX]; //truoc[i] luu chi so cua cuoc hop da duoc sap xep truoc cuoc hop thu i
int L[MAX]; //phan tu L[i] luu so luong cuoc hop da duoc sap xep trong day i+1 cuoc hop dau tien
int LMax; //luu so phan tu lon nhat hien tai cua day con s[i]
int luuj=-1; //luu vi tri ma BMax thay doi
int y; //ham muc tieu - so cuoc hop lon nhat co the sap
14
Trang 17TẠO BẢNG
HÀM TẠO BẢNG
void taoBangLichHop() {
for (int j=0; j<i; ++j)
if (f[j]<=s[i] && LMax<L[j]) {
LMax=L[j];
luuj=j;
} L[i]=LMax+1;
truoc[i]=luuj;
} }
17
Trang 19TRA BẢNG
HÀM TRA BẢNG:
void traBangLichHop() {
int i=0;
for ( int j=1; j<n; ++j)
if (L[i]<L[j]) i=j;
int max=y=L[i]-1; //i la chi so co L[i] lon nhat // vi mang trong C++ bat dau tu 0 nen phai -1 while (i>-1)
{ luu[max ]=i;
i=truoc[i];
} }
19
Trang 20Giải thuật Quy hoạch động sẽ đưa ra một lời giải tối ưu hơn so với giải thuật Tham lam Tuy nhiên, giải thuật Quy hoạch động thường có độ phức tạp không dưới O(n2) nên khi không gian bài toán lớn thì thời gian chạy là không thể
chấp nhận được.
20
Trang 21TÀI LIỆU THAM KHẢO
PGS.TS Dương Tuấn Anh, Bài giảng điện tử
Phân tích và Thiết kế giải thuật.
Trần Hữu Quốc Thư, Giáo trình Phân tích
thiết kế giải thuật.
ThS Nguyễn Thị Bích Ngân, Một số bài toán
quy hoạch động điển hình.
Và một số tài liệu khác từ Internet
21