a0012 bai giang chuyen de quy hoach dong ctdl ly thuyet do th morebook vn 7503

7 4 0
a0012 bai giang chuyen de quy hoach dong ctdl ly thuyet do th morebook vn 7503

Đang tải... (xem toàn văn)

Thông tin tài liệu

Bài tốn liệt kê \ 1[ MỤC LỤC §0 GIỚI THIỆU §1 NHẮC LẠI MỘT SỐ KIẾN THỨC ĐẠI SỐ TỔ HỢP I CHỈNH HỢP LẶP II CHỈNH HỢP KHÔNG LẶP III HOÁN VỊ IV TỔ HỢP .3 §2 PHƯƠNG PHÁP SINH (GENERATE) I SINH CÁC DÃY NHỊ PHÂN ĐỘ DÀI N .6 II LIỆT KÊ CÁC TẬP CON K PHẦN TỬ III LIỆT KÊ CÁC HOÁN VỊ .9 §3 THUẬT TOÁN QUAY LUI 12 I LIỆT KÊ CÁC DÃY NHỊ PHÂN ĐỘ DÀI N .13 II LIỆT KÊ CÁC TẬP CON K PHẦN TỬ 14 III LIỆT KÊ CÁC CHỈNH HỢP KHÔNG LẶP CHẬP K 15 IV BÀI TỐN PHÂN TÍCH SỐ .17 V BÀI TOÁN XẾP HẬU .18 §4 KỸ THUẬT NHÁNH CẬN 23 I BÀI TOÁN TỐI ƯU 23 II SỰ BÙNG NỔ TỔ HỢP .23 III MƠ HÌNH KỸ THUẬT NHÁNH CẬN 23 IV BÀI TOÁN NGƯỜI DU LỊCH 24 V DÃY ABC 26 Lê Minh Hồng Bài tốn liệt kê \ 2[ §0 GIỚI THIỆU Trong thực tế, có số toán yêu cầu rõ: tập đối tượng cho trước có đối tượng thoả mãn điều kiện định Bài tốn gọi tốn đếm cấu hình tổ hợp Trong lớp tốn đếm, có tốn cịn u cầu rõ cấu hình tìm thoả mãn điều kiện cho cấu hình Bài tốn u cầu đưa danh sách cấu hình có gọi tốn liệt kê tổ hợp Để giải toán liệt kê, cần phải xác định thuật tốn để theo xây dựng tất cấu hình quan tâm Có nhiều phương pháp liệt kê, chúng cần phải đáp ứng hai yêu cầu đây: • Khơng lặp lại cấu hình • Khơng bỏ sót cấu hình Có thể nói rằng, phương pháp liệt kê phương kế cuối để giải số toán tổ hợp Khó khăn phương pháp bùng nổ tổ hợp Để xây dựng tỷ cấu hình (con số khơng phải lớn tốn tổ hợp - Ví dụ liệt kê cách xếp n≥13 người quanh bàn tròn) giả thiết thao tác xây dựng khoảng giây, ta phải quãng 31 năm giải xong Tuy nhiên với phát triển máy tính điện tử, phương pháp liệt kê, nhiều tốn tổ hợp tìm thấy lời giải Qua đó, ta nên biết nên dùng phương pháp liệt kê khơng cịn phương pháp khác tìm lời giải Chính nỗ lực giải tốn thực tế khơng dùng phương pháp liệt kê thúc đẩy phát triển nhiều ngành toán học Cuối cùng, tên gọi sau đây, nghĩa đồng nhất, số trường hợp người ta dùng lẫn nghĩa Đó là: • Phương pháp liệt kê • Phương pháp vét cạn tập phương án • Phương pháp duyệt tồn Lê Minh Hồng Bài tốn liệt kê \ 3[ §1 NHẮC LẠI MỘT SỐ KIẾN THỨC ĐẠI SỐ TỔ HỢP Cho S tập hữu hạn gồm n phần tử k số tự nhiên Gọi X tập số nguyên dương từ đến k: X = {1, 2, , k} I CHỈNH HỢP LẶP Mỗi ánh xạ f: X → S Cho tương ứng với i ∈ X, phần tử f(i) ∈ S Được gọi chỉnh hợp lặp chập k S Nhưng X tập hữu hạn (k phần tử) nên ánh xạ f xác định qua bảng giá trị f(1), f(2), , f(k) Ví dụ: S = {A, B, C, D, E, F}; k = Một ánh xạ f cho sau: i f(i) E C E Nên người ta đồng f với dãy giá trị (f(1), f(2), , f(k)) coi dãy giá trị chỉnh hợp lặp chập k S Như ví dụ (E, C, E) chỉnh hợp lặp chập S Dễ dàng chứng minh kết sau quy nạp phương pháp đánh giá khả lựa chọn: Số chỉnh hợp lặp chập k tập gồm n phần tử: k An = nk II CHỈNH HỢP KHÔNG LẶP Khi f đơn ánh có nghĩa với ∀i, j ∈ X ta có f(i) = f(j) ⇔ i = j Nói cách dễ hiểu, dãy giá trị f(1), f(2), , f(k) gồm phần tử thuộc S khác đôi f gọi chỉnh hợp khơng lặp chập k S Ví dụ chỉnh hợp khơng lặp (C, A, E): i f(i) C A E Số chỉnh hợp không lặp chập k tập gồm n phần tử: n! A kn = n (n − 1)(n − 2) (n − k + 1) = (n − k )! III HOÁN VỊ Khi k = n Một chỉnh hợp không lặp chập n S gọi hoán vị phần tử S Ví dụ: hốn vị: (A, D, C, E, B, F) S = {A, B, C, D, E, F} i f(i) A D C E B F Để ý k = n số phần tử tập X = {1, 2, , n} số phần tử S Do tính chất đơi khác nên dãy f(1), f(2), , f(n) liệt kê hết phần tử S Như f toàn ánh Mặt khác giả thiết f chỉnh hợp khơng lặp nên f đơn ánh Ta có tương ứng 1-1 phần tử X S, f song ánh Vậy nên ta định nghĩa hoán vị S song ánh {1, 2, , n} S Số hoán vị tập gồm n phần tử = số chỉnh hợp không lặp chập n: Pn = n! IV TỔ HỢP Một tập gồm k phần tử S gọi tổ hợp chập k S Lê Minh Hoàng Lý thuyết đồ thị \ 119 [ u, v: Integer; begin v := x; while b[v] NewBase {Truy vết đường pha từ start tới đỉnh đậm x} begin u := match[v]; Mark[b[v]] := True; {Đánh dấu nhãn blossom đỉnh đường đi} Mark[b[u]] := True; v := T[u]; if b[v] NewBase then T[v] := u; {Chỉ đặt lại vết T[v] b[v] nút sở mới} end; end; begin {BlossomShrink} FillChar(Mark, SizeOf(Mark), False); NewBase := FindCommonAncestor(p, q); {Tất nhãn b[v] chưa bị đánh dấu} {xác định nút sở} {Gán lại nhãn} ResetTrace(p); ResetTrace(q); if b[p] NewBase then T[p] := q; if b[q] NewBase then T[q] := p; {Chập blossom ⇔ gán lại nhãn b[i] blossom b[i] bị đánh dấu} for i := to n if Mark[b[i]] then b[i] := NewBase; {Xét đỉnh đậm i chưa đưa vào Queue nằm Blossom mới, đẩy i Queue để chờ duyệt tiếp bước sau} for i := to n if not InQueue[i] and (b[i] = NewBase) then Push(i); end; {Thủ tục tìm đường mở} procedure FindAugmentingPath; var u, v: Integer; begin InitBFS; {Khởi tạo} repeat {BFS} u := Pop; {Xét đỉnh v chưa duyệt, kề với u, không nằm Blossom với u, dĩ nhiên T[v] = (u, v) cạnh nhạt rồi} for v := to n if (T[v] = 0) and (a[u, v]) and (b[u] b[v]) then begin if match[v] = then {Nếu v chưa ghép ghi nhận đỉnh kết thúc đường mở ngay} begin T[v] := u; finish := v; Exit; end; {Nếu v đỉnh đậm gán lại vết, chập Blossom } if (v = start) or (T[match[v]] 0) then BlossomShrink(u, v) else {Nếu khơng ghi vết đường đi, thăm v, thăm match[v] đẩy tiếp match[v] vào Queue} begin T[v] := u; Push(match[v]); end; end; until first > last; end; procedure Enlarge; var v, next: Integer; begin repeat Lê Minh Hoàng {Nới rộng ghép đường mở start, kết thúc finish} Lý thuyết đồ thị \ 120 [ v := T[finish]; next := match[v]; match[v] := finish; match[finish] := v; finish := next; until finish = 0; end; procedure Solve; {Thuật toán Edmonds} var u: Integer; begin for u := to n if match[u] = then begin start := u; {Với đỉnh chưa ghép start} FindAugmentingPath; {Tìm đường mở start} if finish then Enlarge; {Nếu thấy nới rộng ghép theo đường mở này} end; end; procedure Result; {In ghép tìm được} var u, count: Integer; f: Text; begin Assign(f, OutputFile); Rewrite(f); count := 0; for u := to n if match[u] > u then {Vừa tránh trùng lặp (u, v) (v, u), vừa loại đỉnh không ghép (match=0)} begin Inc(count); WriteLn(f, count, ') ', u, ' ', match[u]); end; Close(f); end; begin Enter; Init; Solve; Result; end V ĐỘ PHỨC TẠP TÍNH TỐN • • • Thủ tục BlossomShrink có độ phức tạp O(n) Thủ tục FindAugmentingPath cần không n lần gọi thủ tục BlossomShrink, cộng thêm chi phí thuật tốn tìm kiếm theo chiều rộng, có độ phức tạp O(n2) Phương pháp Lawler cần không n lần gọi thủ tục FindAugmentingPath nên có độ phức tạp tính tốn O(n3) Lê Minh Hoàng ... PHỨC TẠP TÍNH TỐN • • • Th? ?? tục BlossomShrink có độ phức tạp O(n) Th? ?? tục FindAugmentingPath cần không n lần gọi th? ?? tục BlossomShrink, cộng th? ?m chi phí thuật tốn tìm kiếm theo chiều rộng, có độ... u := to n if match[u] = then begin start := u; {Với đỉnh chưa ghép start} FindAugmentingPath; {Tìm đường mở start} if finish then Enlarge; {Nếu th? ??y nới rộng ghép theo đường mở này} end; end;... v := to n if (T[v] = 0) and (a[u, v]) and (b[u] b[v]) then begin if match[v] = then {Nếu v chưa ghép ghi nhận đỉnh kết th? ?c đường mở thoát ngay} begin T[v] := u; finish := v; Exit; end; {Nếu

Ngày đăng: 04/12/2022, 09:47

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan