Vì thế , khác với bài toán đếm tìm kiếm một công thức cho lời giải bài toán liệt kê cần xác định một thuật toán để theo đó có thể lần lượt xây dựng được tất cả các cấu hình đang quan tâm
Trang 2LUẬN VĂN THẠC SĨ MÁY TÍNH
Người hướng dẫn khoa học: PGS.TS Lê Huy Thập
HÀ NỘI, 2016
Trang 3LỜI CẢM ƠN
Trong thời gian thực hiện luận văn thạc sỹ em đã nhận được rất nhiều
sự khích lệ, động viên, giúp đỡ từ phía thầy cô, gia đình và bạn bè xung quanh
Em xin bày tỏ lòng biết ơn chân thành nhất tới thầy giáo, PGS.TS Lê Huy Thập, người đã trực tiếp hướng dẫn em hoàn thành luận văn thạc sỹ này
Em xin gửi lời cảm ơn chân thành tới các thầy cô trong trường Đại học
Trang 4LỜI CAM ĐOAN
Tôi xin cam đoan đây là kết quả nghiên cứu của tôi dưới sự hướng dẫn
khoa học của PGS TS Lê Huy Thập
Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được
ai công bố trong bất kỳ công trình nào khác
Học viên
Đỗ Thị Chuẩn
Trang 5MỤC LỤC
LỜI CẢM ƠN i
LỜI CAM ĐOAN ii
MỤC LỤC iii
DANH MỤC CÁCBẢNG v
vi
MỞ ĐẦU 1
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 3
1.1 Cơ sở dữ liệu quan hệ 3
1.1.1.Quan hệ , khóa , phụ thuộc hàm 4
1.1.2 Mô hình ER 8
1.2 Các kiến thức về toán rời rạc 9
1.2.1 Thuật toán 9
1.2.2 Bài toán liệt kê 9
1.2.3 Bài toán đếm 16
1.2.4 Bài toán tối ưu 23
CHƯƠNG 2 CÁC THUẬT TOÁN 26
2.1 Giới thiệu một số thuật toán tối ưu 26
2.1.1 Mô hình tối ưu tổng quát 26
2.1.2 Thuật toán duyệt toàn bộ 27
2.1.3 Thuật toán nhánh cận 28
2.2 Phát biểu và thuật toán nhánh cận bài toán nhập kho 35
2.2.1 Phát biểu bài toán 35
2.2.2 Thuật toán nhánh cận giải bài toán nhập kho 36
2.2.3 Các quan hệ 37
2.2.4 Mô hình ER 39
2.2.5 Kết nối dữ liệu 39
Trang 62.3 Thuật toán tồn kho 40
2.4 Thiết kế cơ sở dữ liệu 41
CHƯƠNG 3 SỬ DỤNG PHƯƠNG PHÁP NHÁNH CÂN GIẢI 46
BÀI TOÁN NHẬP KHO TỐI ƯU 46
3.1 Mô tả bài toán 46
3.2 Mục đích và nhiệm vụ giải bài toán giải bài toán nhập kho tối ưu 47
3.3 Các giao diện và kết quả chạy chương trình 47
3.3.1 Giao diện chính của chương trình quản lý nhập kho tối ưu 47
3.3.2 Form nhập dữ liệu 48
3.3.3 Form Nhập kho vât tư 49
3.3.4 Form nhập phiếu nhập kho 50
3.3.5 Form nhập phiếu xuất kho 51
3.3.6 Form nhập vật tư 51
3.3.7 Sửa thông tin kho 52
3.3.8 Sửa phiếu nhập kho 52
3.3.9 Form sửa phiếu xuất kho 53
3.3.10 Form sửa thông tin vật tư 54
3.3.11 Form tính phương án nhập kho tối ưu 55
KẾT LUẬN 56
TÀI LIỆU THAM KHẢO 57
Trang 7DANH MỤC CÁC BẢNG
Hình 3.1: Form chính của chương trình quản lý nhập kho tối ưu 47
Hình 3.2: Màn hình nền vào menu “ Nhập dữ liệu” 48
Hình 3.3: Form nhập thông tin kho vật tư 49
Hình 3.4: Nhâp phiếu nhập kho 50
Hình 3.5: Nhập phiếu xuất kho 51
Hình 3.6: Form nhập vật tư 51
Hình 3.7: Sửa thông tin kho 52
Hình 3.8: Form sửa phiếu nhập kho 52
Hình 3.9: Form sửa phiếu xuất kho 53
Hình 3.10: Form sửa thông tin vật tư 54
Hình 3.11: Form tính phương án nhập kho tối ưu 55
Trang 8CSDL
FD :Phụ thuộc hàm
mpn : Phép kết nối tự nhiên
: Phép giao : Phép hợp
B : Thuộc
X→Y
Trang 9MỞ ĐẦU
1 Lý do chọn đề tài
Bất kỳ cơ quan xí nghiệp nào cũng cần đến vật tư hàng hóa Do sự phát triển xã hội ngày càng cao kéo theo sự lớn mạnh của các công ty, xí nghiệp và các tổ chức, và như vậy nhu cầu xuất nhập vật tư hàng hóa có thể rơi ngoài tầm kiểm soát (Cũng không ít cá nhân, cơ quan xí nghiệp lợi dụng vào những nhân tố đó để can thiệp xấu và công tác quản lý này) Để làm tốt công tác quản lý vật tư / hàng hóa thì cần có sự hỗ trợ của các bộ môn khác: như thống
kê, dự báo, hạch toán,…đặc biệt là các mô hình tối ưu cần phải được đưa vào ứng dụng cho công tác quản lý vật tư/hàng hóa
Thực tế hiện nay rất nhiều doanh nghiệp lớn quản lý vật tư / hàng hóa bằng phương pháp thủ công và bán thủ công Như vậy, nếu có một chương trình và quy trình quản lý tốt vật tư / hàng hóa sẽ là những hỗ trợ tối cần thiết cho sự phát triển của các cơ quan xí nghiệp nói riêng và của đất nước nói chung Với mong muốn bổ sung và hỗ trợ vào công tác quản lý xuất và nhập hàng chính xác, nhanh chóng, hiệu quả và thuận lợi tôi chọn đề tài luận văn
“Giải bài toán tối ưu nhập vật tư hàng hóa bằng phương pháp nhánh cận”
để nghiên cứu
2 Mục đích nghiên cứu
Áp dụng phương pháp nhánh cận để tìm phương án tối ưu cho việc nhập vật tư hàng hóa
3 Nhiệm vụ nghiên cứu
Tìm hiểumột số thuật toán tối ưutrong toán rời rạc
Sử dụng phương pháp nhánh cận tìm phương án nhập kho tối ưu và ứng
4 Đối tƣợng và phạm vi nghiên cứu
Đối tƣợng nghiên cứu
Bài toán nhánh cận
Trang 10Phạm vi nghiên cứu
Bài toán nhập kho/hàng hóa
Toán rời rạc
5 Phương pháp nghiên cứu
Kết hợp lý thuyết với đánh giá thực nghiệm
Thu thập tài liệu, phân tích, suy luận, tổng hợp, đánh giá Từ đó đề xuất nghiên cứu và tìm hiểu đề tài,
Phân tích bài toán và ứng dụng thuật toán thử nghiệm
6 Dự kiến kết quả đề tài
Hỗ trợ quản lý vật tư bằng phương pháp nhánh cận
Trang 11CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1.Cơ sở dữ liệu quan hệ
Một số ví dụ minh hoạ giải thích các khái niệm về Cơ Sở Dữ Liệu: Xét hệ thống bán vé máy bay bằng máy tính Dữ liệu lưu trữ trong máy tính gồm:
Thông tin về hành khách (Họ và tên, Quốc tịch, Nước cư trú, Giới tính, Ngày sinh, )
thông tin về chuyến bay (Ký hiệu chuyến bay, Giờ bay, Giờ đến, ), Thông tin về đường bay (Tên đường bay, Nơi đổi má bay hoặc nghỉ tiếp nhiên liệu ),
Mọi thông tin về mối quan hệ này được biểu diễn trong máy thông qua việc đặt chỗ của khách hàng Hãy biểu diễn dữ liệu đó đảm bảo để hành khách đi đúng chuyến baycủa mình
Dữ liệu trên được lưu trong máy theo một quy định nào đó sẽ được gọi
là Cơ Sở Dữ Liệu
Có 3 nông trại, mỗi nông trại có một số công trình kiến trúc:
Nhà ở, Trại bò và Trại gà
Mỗi công trình kiến trúc là một nơi ở cho một số người hay gia súc
Dữ liệu trên được lưu trong máy theo một quy định nào đó để có thể khai thác được các thông tin cần thiết như để biết số bò cái trong trại bò ông Jones, số người trong cả 3 nông trại , sẽ được gọi là Cơ Sở Dữ Liệu
Cơ Sở Dữ Liệu - Database (sẽ viết tắt là CSDL) là tập dữ liệu về đơn vị
tổ chức được lưu trên máy và cách tổ chức quản lý theo một mô hình phù hợp với đơn vị tổ chức đó
Hệ quản trị cơ sở dữ liệu quan hệ là hệ thống các phần mềm cho phép
mô tả, thao tác các cơ sở dữ liệu, nó bảo đảm bí mật, an toàn với nhiều người
sử dụng
Trang 121.1.1.Quan hệ, khóa, phụ thuộc hàm
Quan hệ
Quan hệ n ngôi là một tập con của tích Đề – Các D1xD2x xDn Khi
đó mỗi bộ quan hệ có n thành phần (gọi là n cột), cột thứ i được gọi là có thuộc tính Ai
Định nghĩa 2.1
Gọi R = {A1, A2, , An} là tập hữu hạn các thuộc tính Miền giá trị của thuộc tính Ai là dom(Ai) Quan hệ r - n ngôi trên tập thuộc tính R là tập con của tích Đề – Các:
r dom(A1) dom(A) , , dom(An)
Khóa
Khoá (Key) của một quan hệ r trên tập thuộc tính R = {A1, A2, , An}
là một tập con K {A1, A2, , An} thoả mãn các tính chất: Với bất kỳ hai
bộ ti, tj r vơi i j đều tồn tại một thuộc tính A K sao cho ti(A) tj(A), nghĩa là không tồn tại hai bộ khác nhau mà có giá trị bằng nhau trên mọi thuộc tính thuộc tập con K Điều kiện này có thể ký hiệu ti(K) tj(K) với i j
do vậy mỗi giá trị của K được xác định duy nhất
Định nghĩa
Khoá của quan hệ r trên tập thuộc tính R = {A1, ,An} là tập con K
R sao cho bất kỳ hai bộ ti, tj r, i j luôn luôn thoả mãn ti(K) ti(K) và bất
kỳ tập con thực sự K‟nào của K đều không có tính chất đó Tập K như vậy được gọi là siêu khoá (Superkey) của quan hệ trên tập thuộc tính R
Phụ thuộc hàm
Định nghĩa 5.1
Cho R(U) là một lược đồ (cấu trúc) quan hệ với U = {A1, ,An} là tập thuộc tính và X, Y là hai tập con của U Nói rằng X Y (đọc là Y phụ thuộc hàm vào X) nếu r là một quan hệ (bảng) xác định trên R(U) sao cho bất kỳ hai
Trang 13bộ t1, t2 r (hai hàng thuộc bảng) mà t1[X] = t2[X] thì suy ra t1[Y] = t2[Y] Phụ thuộc hàm sẽ ký hiệu là FD (Function Dependent)
Hệ tiên đề cho phụ thuộc hàm (Hệ tiên đề Armstrong)
Gọi F là tập tất cả các phụ thuộc hàm đối với lược đồ quan hệ R(U) và
X Y (X, Y U) gọi là một phụ thuộc hàm được suy diễn logic từ F nếu quan hệ r trên R(U) thoả mãn các tính chất phụ thuộc hàm cho F thì cũng thoả mãn cho X Y
hệ tiên đề Arstrong thì X Y là đúng trên quan hệ r
Bổ đề Các luật được suy ra từ tiên đề Arstrong:
Trang 14Nghĩa là X+ là tập tất cả các thuộc tính A mà phụ thuộc hàm X A có thể được suy diễn logic từ F nhờ hệ tiên đề Armstrong
Bổ đề 5.3 X Y suy diễn từ hệ tiên đề Armstrong khi và chỉ khi Y X+ Định lý 5.1
Hệ tiên đề Armstrong là đúng và đầy đủ
Tính toán bao đóng
Việc tính bao đóng F+
rất phức tạp nên ta sẽ tính X+ Việc tính X+
dễ dàng hơn theo thuật toán sau đây:
Thuật toán 5.1
Cho tập con các thuộc tính X thuộc tập hữu hạn các thuộc tính U và cho tập các phụ thuộc hàm trên U
Bước 0 Gán X0 = X Bước thứ i+1 Gán Xi+1 = Xi A sao cho (Y Z) F mà trong Z
có A và Y phải thuộc Xi i = 0, 1, 2, Quá trình được lặp lại và kết thúc khi có
Xk=Xk+1 điều này chắc chắn xảy ra vì U hữu hạn Khi đó X+ =Xk
Trang 15Định nghĩa 5.2.2
Gọi F tập của các phụ thuộc hàm là nhỏ nhất nếu nó thoả mãn các diều kiện sau đây;
a Vế phải của phụ thuộc hàm thuộc F chỉ có một thuộc tính
Kết nối không mất thông tin
Cho R là một lược đồ quan hệ, lược đồ này được tách thành các lược đồ con R1, ,Rk gọi D là tập các phụ thuộc hàm
Định nghĩa 5.3.1
Nói rằng phép tách là tách-nối không mất thông tin đối với D nếu quan
hệ r trên R thoả D thì:
r = R1(r)* R2(r)* * Rk(r) tức là quan hệ r được tạo ra từ phép kết nối tự nhiên của các hình chiếu của nó trên các Ri,, i = 1, ,k
Các tính chất:
Ký hiệu: = (R1, ,Rk)
Gọi m là một ánh xạ được định nghĩa như sau:
m (r) = *i=1, ,k Ri(r)
Trang 16Tức là m (r) là phép kết nối tự nhiên của các phép chiếu chiếu quan hệ
r lên các lược đồ con trong = (R1, ,Rk) Điều kiện để kết nối không mất thông tin đối với D là với mọi r thoả mãn D thì r = m (r)
Trang 171.2 Các kiến thức về toán rời rạc
1.2.1 Thuật toán
Khái niệm về thuât toán
Thuật toán là một hệ thống chặt chẽ và rõ ràng các quy tắc nhằm xác đinh một dãy các thao tác trên những đối tượng , sao cho sau một hữu hạn bước thực hiện các thao tác ta thực hiện được mục tiêu cho trước
Để giải bài toán bằng máy tính , chúng tả thường có một quan niệm rộng rãi hơn về thuật toán cụ thể và lưu ý đến các đặc điểm sau:
a Không cần xác định toàn bộ lời giải , các thao tác theo từng bước một cách chính xác , đơn vị và rõ ràng Thay vào đó ta chỉ cần chỉ ra một cách chuyển từ rừng bước giải i đến bước giải kế tiếp i + 1và tìm cách cắt nhỏ bài toán thành các bài toán con , đó chính là thuật toán đệ quy rất quan trọng để giải các bài toán tổng quát
b Có nhiều bài toán không có cách giải đúng hoặc cách giải đúng không thể chấp nhận được do hạn chế về thời gian chạy và kích thước bộ nhớ Nhưng nếu ta chấp nhận kết quả gần đúng thì có thể tồn tại nhiều cách giải
đỡ phức tạp và hiệu quả hơn, đó chính là các thuật toán Heuristic để giải bài toán gần đúng
1.2.2 BÀI TOÁN LIỆT KÊ
Nếu như bài toán đếm ta chỉ đòi hỏi đếm số cấu hình tổ hợp là bao nhiêu thì trong nhiều tình huống , ta còn phải cần rõ những cấu hình tổ hợp
đó là những cấu hình nào đó Bài toán đưa ra danh sách đưa ra danh sách tất
cả cấu hình tổ hợp có thể có được gọi là bài toán liệt kê tổ hợp Vì thế , khác với bài toán đếm tìm kiếm một công thức cho lời giải bài toán liệt kê cần xác định một thuật toán để theo đó có thể lần lượt xây dựng được tất cả các cấu hình đang quan tâm Rõ ràng có nhiều cách liệt kê , tuy nhiên chúng phải đảm bảo 2 nguyên tắc:
Trang 18Không lặp đi lặp lại một cấu hình
Không bỏ sót một cấu hình
Có thể nói rằng phương pháp liệt kê là cách cuối cùng để có thể giải được một số bài toán tổ hợp hiện nay Khó là phương pháp này là sự “bùng
nổ tổ hợp” Để xây dựng chừng 1 tỷ cấu hình ( con số này không không phải
là lớn đối với bài toán tổ hợp – xem lại các số mất thứ tự Dn, số phân bố Un số hình vuông là tỉnh của ln ,….) và giả thiết rằng mỗi thao tác xây dựng mất khoảng 1 giây, ta bỏ ra quãng 31 năm mới giải xong Tuy nhiên với sự phát triển của máy tính điện tử, bằng phương pháp liệt kê nhiều bài toán tổ hợp đã tìm thấy lời giải Mặc khác, chính sự nỗ lực tìm kiếm những giải pháp hữu hạn cho những bài toán khó thuộc lĩnh vực này, đã thúc đẩy thúc đẩy mạnh
mẽ sự phát triển của nhiều ngành toán học
1 Thuật toán và độ phức tạp thuật toán
Khái niệm thuật toán
Định nghĩa
Ta hiểu thuật toán giải bài toán đặt ra là một thủ tục xác định bao gồm một dãy hữu hạn các bước cần thực hiện để thu được lời giải của bài toán
Thuật toán có các đặc trưng sau đây:
Đầu vào (input): Thuật toán nhận dữ liệu vào từ một tập nào đó
Đầu ra (Output): Với mỗi tập các dữ liệu đầu vào , thuật toán đưa ra các
dữ liệu tương ứng với lời giải cảu bài toán
Chính xác (Precision): Các bước của thuật toán được mô tả chính xác Hữu hạn ( Finiteness): Thuật toán cần phải đưa được đầu sau một số hữu hạn (có thể rất lớn) bước với đầu vào
Đơn vị (Uniqueness): Các kết quả trung gian của từng bước thực hiện thuật toán được xác định một cách đơn trị và chỉ phụ thuộc vào đầu vào các kết quả của các bước trước
Trang 19Tổng quát (Generality ): Thuật toán có thể áp dụng để giải mọi bài toán
có dạng đã cho
2 Mô tả thuật toán bằng ngôn ngữ pascal
Cách mô tả thuật toán bằng lời như trình bày trong thí dụ ở mục trên không thật thuận tiện cho việc cài đạt thuật toán trên ngôn ngữ lập trình cụ thể, chẳng hạn PASCAL, C , BASIC,… Tất nhiên có thể mô tả thuật toán sử dụng một ngôn ngữ lập trình nào đó Khi đó ta chỉ có thể sử dụng những cấu trúc lệnh của ngôn ngữ đã chọn Điều đó có thể làm cho việc mô tả thuật toán trở nên phức tạp đồng thời cũng rất khó hiểu Vì thế , để mô tả thuật toán sử dụng ngôn ngữ phỏng PASCAL, trong phép vừa mô tả thuật toán bằng ngôn ngữ đời thường vừa sử dụng những cấu trúc lệnh tương tự như của ngôn ngữ PASCAl ( tất nhiên , các qui tắc cú pháp của ngôn ngữ PASCAL không nhất thiết phải tuân thủ ) Dưới đây ta liệt kê một số câu lệnh chính được sử dụng để mô tả thuật toán
Câu lệnh procedure(function) Mô tả thuật toán trong ngôn ngữ mô phỏng Pascal được bắt đầu từ câu lệnh Procedure (function) , trong đó ta đặt tên cho thuật toán và mô tả danh sách biến của thuật của thuật toán Chẳng hạn , câu lệnh
Function maximum (a,b,c);
Cho biết tên thuật toán được mô tả là maximum , có 3 biến a,b,c;
Proceddure Hoanvi(n);
Cho biết tên thuật toán được mô tả hoán vị với biến là n
Các bước của thuật toán được mô tả trong thân thủ tục ( hàm ) được bắt đầu bởi begin và kết thúc bởi end
Câu lệnh gán Câu lệnh gán được sử dụng để gán giá trị cho các biến Vế trái
cảu các câu lệnh là tên của biến , còn về phải là biểu thức của các hằng , biến
Trang 20gán giá trị hoặc các hàm đã được định nghĩa Kí hiệu = được sử dụng để biểu diễn phép gán
Khối câu lệnh Các câu lệnh có thể nhóm lại thành một khối Để mô tả khối
lệnh ta sử dụng begin và end
Các câu lệnh trong khối được thực hiện tuần tự Dưới đây, thuật ngữ câu lệnh được dùng để chỉ một câu lệnh của một khối câu lệnh
Câu lệnh lặp Ta sử dụng các câu lệnh sau đây
For biến: = giá trị đầu to giá trị cuối do câu lệnh
Tại đầu vòng lặp , biến sẽ được gán cho giá trị đầu, nếu giá tri đầu nhỏ hơn hơn hoặc bằng giá trị cuối và câu lệnh sẽ được thực hiện này của biến Tiếp đến , giá trị của biến sẽ tăng lên 1 và câu lệnh sẽ được thực hiện với giá trị mới của biến Quá trình sẽ được tiếp tục thực hiện cho đến khi biến giá trị cuối Sau khi thực hiện xong câu lệnh với giá trị của biến bằng giá trị cuối, sẽ chuyển sang thực hiện câu lệnh tiếp theo
Nếu giá trị đầu lớn giá trị cuối thì không có câu lệnh nào thực hiện được thực hiện
Câu lệnh lặp thứ hai được sử dụng là câu lệnh “while” sau đây:
While điều kiện do câu lệnh;
Khi câu lệnh này được sử dụng , điều kiện sẽ được kiểm tra , nếu đó là đúng thì câu lệnh được thực hiện, điều đó có thể dẫn tới sự thay đổi giá trị của các biến trong điều kiện Nếu điều kiện vẫn là đúng sau khi thực hiện câu lệnh thì câu lệnh lại được thực hiện Điều đó sẽ tiếp diễn cho đến khi điều kiện là sai
Câu lệnh lặp thứ ba được sử dụng là câu lệnh “ repeat” sau đây:
Repeat câu lệnh until điều kiện;
Khi câu lệnh này được sử dụng, câu lệnh được thực hiện , điều đó có thể dẫn tới sự thay đổi giá trị của các biến trong điều kiện Nếu điều kiện vẫn
Trang 21là đúng, thì câu lệnh lại được thực hiện Điều đó sẽ tiếp diễn cho đến khi điều kiện là đúng
3 Độ phức tạp thuật toán
Một máy tính, mặc dù được cài đặt theo một thuạt toán đúng, có thể không cho kết quả mong muốn đối với một bộ dữ liệu nào đó vì hoặc là nó đòi hỏi quá nhiều thời gian , hoặc là không có đủ bộ nhớ để lưu giữ dữ liệu
và các biến của chương trình Vì vậy , để có thể đánh giá khả năng ứng dụng của chương trình ta cần phải phân tích hiệu quả của thuật toán Phân tích thuật toán là quá trình tìm ra những đánh giá về thời gian tính cũng như dung lượng
bộ nhớ cần thiết để thực hiện thuật toán Độ phức thuật toán của một thuật toán là lượng thời gian và bộ nhớ cần thiết để thực hiện bài toán Trong mục này ta quan tâm đến việc đánh giá thời gian cần thiết để thực hiện thuật toán (ta sẽ gọi là thời gian của thuật toán)
Rõ ràng,thời gian tính của thuật toán là hàm của dữ liệu đầu vào Thông thường khó có thể xây dựng công thức dưới dạng cho hàm này, vì thế ta đặt vấn đề đơn giản hơn Thay vì làm việc với dữ liệu đầu vào, ta sẽ làm việc với một đặc trưng quan trọng của dữ liệu đầu vào, đó là kích thước của nó Chúng
ta sẽ quan tâm đến:
Thời gian tối thiểu cần thiết để thực hiện thuật toán là hàm của dữ liệu đầu vào kích thước n Thời gian như vậy sẽ được gọi là thời gian tính tốt nhất của thuật toán với đầu vào kích thước n
Thời gian nhiều nhất cần thiết để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n Thời gian như vậy sẽ được gọi là thời gian tính tồn nhất của thuật toán với đầu vào kích thước n
Thời gian trung bình cần thiết để thực hiện thuật toán trên tập hữu hạn các đầu vào kích thước n Thời gian như vậy sẽ được gọi là thời gian tính trung bình của thuật toán
Trang 22Để tính toán thời gian tính của thuật toán ta sẽ đếm số câu lệnh mà nó phải thực hiện, hoặc trong một số trường hợp có thể đếm cụ thể số cho phép tính số học, so sánh, gán,… Mà thuật toán đòi hỏi thực hiện Rõ ràng từ thông
số này ta có thể tính được thời gia n thực sự mà thuật toán đòi hỏi nếu nó được cài đặt trên ngôn ngữ lập trình và chạy trên một máy tính đẻ chon đề cài đặt thuật toán cũng như máy tính mà trên đó thực hiện Vì thế nó là tiêu chuẩn khách quan đến đánh giá hiệu quả của thuật toán
4 Phương pháp sinh
Phương pháp sinh có thể áp dụng để giải bài toán liệt kê tổ hợp đặt ra nếu như hai điều kiện sau được thực hiện:
Có thể xác định được một số thứ tự trên tập các cấu hình tổ hợp cần liệt
kê Từ đó có thể xác định được cấu hình đầu tiên và cấu hình cuối cùng trong thứ tự đã xác định
a Xây dựng được thuật toán từ cấu hình chưa phải là cuối cùng đang có
đưa ra đưa ra cấu hình kế tiếp nó
Ta sẽ gọi thuật toán nói trong điều kiện 2) là thuật toán sinh kế tiếp Rõ ràng là thứ tự trong điều kiện 1) cần được lựa chọn sao cho có thể xây dựng được thuật toán sinh kế tiếp Giả thiết rằng , hai điều kiện nêu trên đã được thực hiện , khi đó thuật toán sinh để giải bài toán liệt kê đặt ra được mô tả như sau:
Trang 23b Thuật toán quay lui
Nội dung chính của thuật toán này được là việc xây dựng dần các thành phần của cấu hình bằng cách thử tất cả các khả năng Giả thiết cấu hình cần tìm được mô tả bằng một bộ gồm n thành phần x1, x2,….xn. Giả sử đã xác định được i -1 thành phần x1, x2,….xi-1( mà ta sẽ gọi là lời giải bộ phận cấp i-1), bây giờ xác định thành phần xi bằng cách duyệt tất cả các khả năng có thể
đề cử cho nó (đánh số các khả năng có thể đề cử cho nó đánh số khả năng từ
1 đến ni) Với mỗi khả năng j kiểm tra xem j có chấp nhận được không Xảy
Var j: interger;
Trang 2417, khi những câu hỏi về tổ hợp được nêu ra trong những công trình nghiên cứu các trò chơi may rủi Liệt kê, đếm các đối tượng có những tính chất nào
đó là một phần quan trọng của lý thuyết tổ hợp Chúng ta cần phải đếm các đối tượng để giải nhiều bài toán khác nhau Hơn nữa các kỹ thuật đếm được dùng rất nhiều khi tính xác suất của các biến cố
Trang 25Cơ sở bài toán đếm
Những nguyên lý đếm cơ bản:
1) Quy tắc cộng: Giả sử có k công việc T1, T2, , Tk Các việc này có thể làm tương ứng bằng n1, n2, , nk cách và giả sử không có hai việc nào có thể làm đồng thời Khi đó số cách làm một trong k việc đó là n1+n2+ + nk
Mỗi bước lặp của từng vòng lặp giá trị của k được tăng lên một đơn vị Gọi Ti
Ti là việc chọn một phần tử từ tập Ai với i=1,2, , k Có |Ai| cách làm Ti và không có hai việc nào có thể được làm cùng một lúc Số cách chọn một phần
tử của hợp các tập hợp này, một mặt bằng số phần tử của nó, mặt khác theo quy tắc cộng nó bằng |A1|+|A2|+ +|Ak| Do đó ta có:
|A1 A2 Ak| = |A1| + |A2| + + |Ak|
2) Quy tắc nhân: Giả sử một nhiệm vụ nào đó được tách ra thành k việc T1,
T2, , Tk Nếu việc Ti có thể làm bằng ni cách sau khi các việc T1, T2, Ti-1
đã được làm, khi đó có n1.n2 nk cách thi hành nhiệm vụ đã cho
|A1 x A2 x x Ak| = |A1|.|A2| |Ak|
Nguyên lý bù trừ:
Khi hai công việc có thể được làm đồng thời, ta không thể dùng quy tắc cộng để tính số cách thực hiện nhiệm vụ gồm cả hai việc Để tính đúng số cách thực hiện nhiệm vụ này ta cộng số cách làm mỗi một trong hai việc rồi
Trang 26trừ đi số cách làm đồng thời cả hai việc Ta có thể phát biểu nguyên lý đếm này bằng ngôn ngữ tập hợp Cho A1, A2 là hai tập hữu hạn, khi đó
i i i
i
A
Bây giờ ta đồng nhất tập Am (1 m k) với tính chất Am cho trên tập
vũ trụ hữu hạn U nào đó và đếm xem có bao nhiêu phần tử của U sao cho không thỏa mãn bất kỳ một tính chất Am nào.Gọi N là số cần đếm, N là số phần tử của U Ta có:
N = N | A1 A2 Ak| = N N1 + N2 + ( 1)kNk,
trong đó Nm là tổng các phần tử của U thỏa mãn m tính chất lấy từ k tính chất
đã cho Công thức này được gọi là nguyên lý bù trừ Nó cho phép tính N
qua các Nm trong trường hợp các số này dễ tính toán hơn
Nguyên lý Dirichlet tổng quát:
Mệnh đề: Nếu có N đồ vật được đặt vào trong k hộp thì sẽ thì tồn tại một
hộp có ít nhất N/k [đồ vật]
(Ở đây, [x] là giá trị của hàm trần tại số thực x, đó là số nguyên nhỏ nhất có giá trị lớn hơn hoặc bằng x Khái niệm này đối ngẫu với [x] – giá trị của hàm sàn hay hàm phần nguyên tại x – là số nguyên lớn nhất có giá trị nhỏ hơn hoặc bằng x.)
Trang 27Chỉnh hợp có lặp
Một cách sắp xếp có thứ tự k phần tử có thể lặp lại của một tập n phần
tử được gọi là một chỉnh hợp lặp chập k từ tập n phần tử Nếu A là tập gồm n phần tử đó thì mỗi chỉnh hợp như thế là một phần tử của tập Ak Ngoài ra, mỗi chỉnh hợp lặp chập k từ tập n phần tử là một hàm từ tập k phần tử vào tập n phần tử Vì vậy số chỉnh hợp lặp chập k từ tập n phần tử là nk
C 1
Hoán vị của tập hợp có các phần tử giống nhau
Trong bài toán đếm, một số phần tử có thể giống nhau Khi đó cần phải cẩn thận, tránh đếm chúng hơn một lần Ta xét thí dụ sau
Mệnh đề 2: Số hoán vị của n phần tử trong đó có n1 phần tử như nhau thuộc loại 1, n2 phần tử như nhau thuộc loại 2, , và nk phần tử như nhau thuộc loại
Sự phân bố các đồ vật vào trong hộp
Mệnh đề 3: Số cách phân chia n đồ vật khác nhau vào trong k hộp khác nhau
sao cho có ni vật được đặt vào trong hộp thứ i, với i = 1, 2, , k bằng
n
n
Trang 28
SINH CÁC HOÁN VỊ VÀ TỔ HỢP
Sinh các hoán vị:
Có nhiều thuật toán đã được phát triển để sinh ra n! hoán vị của tập {1,2, ,n} Ta sẽ mô tả một trong các phương pháp đó, phương pháp liệt kê các hoán vị của tập {1,2, ,n} theo thứ tự từ điển Khi đó, hoán vị a1a2 anđược gọi là đi trước hoán vị b1b2 bn nếu tồn tại k (1 k n), a1 = b1, a2 =
b2, , ak-1 = bk-1 và ak< bk
Thuật toán sinh các hoán vị của tập {1,2, ,n} dựa trên thủ tục xây dựng hoán vị kế tiếp, theo thứ tự từ điển, từ hoán vị cho trước a1 a2 an Đầu tiên nếu an-1< an thì rõ ràng đổi chỗ an-1 và an cho nhau thì sẽ nhận được hoán
vị mới đi liền sau hoán vị đã cho Nếu tồn tại các số nguyên aj và aj+1 sao cho
aj< aj+1 và aj+1> aj+2 > > an, tức là tìm cặp số nguyên liền kề đầu tiên tính từ bên phải sang bên trái của hoán vị mà số đầu nhỏ hơn số sau Sau đó, để nhận được hoán vị liền sau ta đặt vào vị trí thứ j số nguyên nhỏ nhất trong các số lớn hơn aj của tập aj+1, aj+2, , an, rồi liệt kê theo thứ tự tăng dần của các số còn lại của aj, aj+1, aj+2, , an vào các vị trí j+1, , n Dễ thấy không có hoán
vị nào đi sau hoán vị xuất phát và đi trước hoán vị vừa tạo ra
Sinh các tổ hợp:
Làm thế nào để tạo ra tất cả các tổ hợp các phần tử của một tập hữu hạn? Vì tổ hợp chính là một tập con, nên ta có thể dùng phép tương ứng 1-1 giữa các tập con của {a1,a2, ,an} và xâu nhị phân độ dài n
Ta thấy một xâu nhị phân độ dài n cũng là khai triển nhị phân của một
số nguyên nằm giữa 0 và 2n
1 Khi đó 2n xâu nhị phân có thể liệt kê theo thứ
tự tăng dần của số nguyên trong biểu diễn nhị phân của chúng Chúng ta sẽ bắt đầu từ xâu nhị phân nhỏ nhất 00 00 (n số 0) Mỗi bước để tìm xâu liền sau ta tìm vị trí đầu tiên tính từ phải qua trái mà ở đó là số 0, sau đó thay tất
cả số 1 ở bên phải số này bằng 0 và đặt số 1 vào chính vị trí này
Trang 29procedure Xâu nhị phân liền sau (bn-1bn-2 b1b0): xâu nhị phân khác (11 11)
i:= 0
while bi = 1
begin
bi:= 0 i:= i + 1
Khái niệm mở đầu và mô hình hóa bằng hệ thức truy hồi:
Đôi khi ta rất khó định nghĩa một đối tượng một cách tường minh Nhưng có thể dễ dàng định nghĩa đối tượng này qua chính nó Kỹ thuật này được gọi là đệ quy Định nghĩa đệ quy của một dãy số định rõ giá trị của một hay nhiều hơn các số hạng đầu tiên và quy tắc xác định các số hạng tiếp theo
từ các số hạng đi trước Định nghĩa đệ quy có thể dùng để giải các bài toán đếm Khi đó quy tắc tìm các số hạng từ các số hạng đi trước được gọi là các
hệ thức truy hồi
Định nghĩa 1: Hệ thức truy hồi (hay công thức truy hồi) đối với dãy số {an}
là công thức biểu diễn an qua một hay nhiều số hạng đi trước của dãy Dãy số được gọi là lời giải hay nghiệm của hệ thức truy hồi nếu các số hạng của nó thỏa mãn hệ thức truy hồi này
Trang 30Giải các hệ thức truy hồi
Định nghĩa 2: Một hệ thức truy hồi tuyến tính thuần nhất bậc k với hệ số
hằng số là hệ thức truy hồi có dạng:
an = c1an-1 + c2an-2 + + ckan-k , trong đó c1, c2, , ck là các số thực và ck 0
Theo nguyên lý của quy nạp toán học thì dãy số thỏa mãn hệ thức truy hồi nêu trong định nghĩa được xác định duy nhất bằng hệ thức truy hồi này và
k điều kiện đầu: a0 = C0, a1 = C1, , ak-1 = Ck-1
Phương pháp cơ bản để giải hệ thức truy hồi tuyến tính thuần nhất là tìm nghiệm dưới dạng an = rn, trong đó r là hằng số Chú ý rằng an = rn là nghiệm của hệ thức truy hồi an = c1an-1 + c2an-2 + + ckan-k nếu và chỉ nếu
rn = c1rn-1 + c2rn-2 + + ckrn-k hay rk c1rk-1 c2rk-2 ck-1r – ck = 0 Phương trình này được gọi là phương trình đặc trưng của hệ thức truy hồi, nghiệm của nó gọi là nghiệm đặc trưng của hệ thức truy hồi
Mệnh đề:Cho c1, c2, , ck là các số thực Giả sử rằng phương trình đặc trưng
Trang 31lại một phần tử Một ví dụ khác là thủ tục nhân các số nguyên Thủ tục này rút gọn bài toán nhân hai số nguyên tới ba phép nhân hai số nguyên với số bit giảm đi một nửa Phép rút gọn này được dùng liên tiếp cho tới khi nhận được các số nguyên có một bit Các thủ tục này gọi là các thuật toán chia để trị
f(n) = af(n
b) + g(n)
Hệ thức này có tên là hệ thức truy hồi chia để trị
Mệnh đề 1: Giả sử f là một hàm tăng thoả mãn hệ thức truy hồi f(n) = af(n
b) + c với mọi n chia hết cho b, a 1, b là số nguyên lớn hơn 1, còn c là số thực dương
Mệnh đề 2: Giả sử f là hàm tăng thoả mãn hệ thức truy hồi f(n) = af(n
b) + cndvới mọi n = bk, trong đó k là số nguyên dương, a 1, b là số nguyên lớn hơn
1, còn c và d là các số thực dương
1.2.4 BÀI TOÁN TỐI ƢU
Phát biểu bài toán
Trong rất nhiều ứng dụng thực tế của tổ hợp các cấu hình tổ hợp còn được gán cho một giá trị bằng số đánh giá trị sử dụng của cấu hình đối với mục đích sử dụng cụ thể nào đó Khi đó xuất hiện bài toán: Hãy lựa chọn trong số các cấu hình tổ hợp chấp nhận được cấu hình sử dụng tốt nhất Các
Trang 32bài toán như vậy chúng ta sẽ gọi là bài toán tổ hợp Dưới dạng tổng quát bài toán tối ưu tổ hợp có thể phát biểu như sau:
Tìm cực tiểu (hay cực đại )của phiếu hàm
F(x) min (max) Với điều kiện
x D trong đó D là tập hữu hạn phần tử
Hàm f(x) được gọi là hàm mục tiêu của bài toán , mỗi phần tử thuộc
x D được gọi là một phương án còn tập D gọi là tập các phương án của bài toán
Thông thường tập D được mô tả như là tập các cấu hình tổ hợp thỏa mãn một số tính chất cho trước nào đó
Phương án x* D đem lại giá trị nhỏ nhất ( lớn nhất) cho hàm mục tiêu được gọi là phương án tối ưu, khi đó giá trị f*
= f(x*) được gọi là giá trị tối ưu của bài toán
Dưới đây chúng ta sẽ giới thiệu một số mô hình tối ưu hóa tổ hợp truyền thống Các mô hình này , một mặt , là những mô hình có nhiều ứng dụng thực tế, mặt khác chúng giữ vai trò quan trọng trong việc nghiên cứu và phát triển lý thuyết tối ưu hóa tổ hợp
Bài toán cái túi
Một nhà thám hiểu cần đem theo một cái túi có trọng lượng không quá
b Có n đồ vật có thể đem theo Đồ vật thứ j có trọng lượng là aj và giá trị là cj
(j = 1,2,…n)
Hỏi rằng nhà thám hiểu cần đem theo các đồ vật nào để cho tổng giá trị
sử dụng của các đồ vật đem theo là lớn nhất?