Tải bản đầy đủ (.pdf) (7 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.21 MB, 7 trang )



Bài tốn liệt kê

\ 1[

MỤC LỤC
§0. GIỚI THIỆU...................................................................................................................................... 2
§1. NHẮC LẠI MỘT SỐ KIẾN THỨC ĐẠI SỐ TỔ HỢP....................................................................... 3
I. CHỈNH HỢP LẶP ...........................................................................................................................................3
II. CHỈNH HỢP KHƠNG LẶP...........................................................................................................................3
III. HỐN VỊ ......................................................................................................................................................3
IV. TỔ HỢP.........................................................................................................................................................3
§2. PHƯƠNG PHÁP SINH (GENERATE) ............................................................................................ 5
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Ử........................................................................................................7
III. LIỆT KÊ CÁC HOÁN VỊ .............................................................................................................................9
§3. THUẬT TỐ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 TỐN XẾP HẬU.................................................................................................................................18
§4. KỸ THUẬT NHÁNH CẬN.............................................................................................................. 23
I. BÀI TỐ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 Hoàng




Bài tốn liệt kê

\ 2[

§0. GIỚI THIỆU
Trong thực tế, có một số bài toán yêu cầu chỉ rõ: trong một tập các đối tượng cho trước có bao
nhiêu đối tượng thoả mãn những điều kiện nhất định. Bài tốn đó gọi là bài tốn đếm cấu hình tổ
hợp.
Trong lớp các bài tốn đếm, có những bài tốn cịn u cầu chỉ rõ những cấu hình tìm được thoả
mãn điều kiện đã cho là những cấu hình nào. Bài tốn u cầu đưa ra danh sách các cấu hình có thể
có gọi là bài toán liệt kê tổ hợp.
Để giải bài toán liệt kê, cần phải xác định được một thuật tốn để có thể theo đó lần lượt xây dựng
được tất cả các cấu hình đang quan tâm. Có nhiều phương pháp liệt kê, nhưng chúng cần phải đáp
ứng được hai u cầu dưới đây:
• Khơng được lặp lại một cấu hình
• Khơng được bỏ sót một cấu hình
Có thể nói rằng, phương pháp liệt kê là phương kế cuối cùng để giải được một số bài toán tổ hợp
hiện nay. Khó khăn chính của phương pháp này chính là sự bùng nổ tổ hợp. Để xây dựng 1 tỷ cấu
hình (con số này khơng phải là lớn đối với các bài tốn tổ hợp - Ví dụ liệt kê các cách xếp n≥13
người quanh một bàn tròn) và giả thiết rằng mỗi thao tác xây dựng mất khoảng 1 giây, ta phải mất
quãng 31 năm mới giải xong. Tuy nhiên cùng 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. Qua đó, ta cũng nên biết rằng chỉ nên dùng
phương pháp liệt kê khi không cịn một phương pháp nào khác tìm ra lời giải. Chính những nỗ
lực giải quyết các bài tốn thực tế không dùng phương pháp liệt kê đã thúc đẩy sự phát triển của
nhiều ngành toán học.
Cuối cùng, những tên gọi sau đây, tuy về nghĩa không phải đồng nhất, nhưng trong một số trường
hợp người ta có thể dùng lẫn nghĩa của nhau được. Đó là:
• Phương pháp liệt kê

• Phương pháp vét cạn trên tập phương án
• Phương pháp duyệt toàn bộ

Lê Minh Hoà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 là một tập hữu hạn gồm n phần tử và k là một số tự nhiên.
Gọi X là tập các số nguyên dương từ 1 đế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 mỗi i ∈ X, một và chỉ một phần tử f(i) ∈ S.
Được gọi là một chỉnh hợp lặp chập k của S.
Nhưng do X là tập hữu hạn (k phần tử) nên ánh xạ f có thể xác định qua bảng các giá trị f(1), f(2),
..., f(k).
Ví dụ: S = {A, B, C, D, E, F}; k = 3. Một ánh xạ f có thể cho như sau:
i
1
2
3
f(i)
E
C
E
Nên người ta đồng nhất f với dãy giá trị (f(1), f(2), ..., f(k)) và coi dãy giá trị này cũng là một
chỉnh hợp lặp chập k của S. Như ví dụ trên (E, C, E) là một chỉnh hợp lặp chập 3 của S. Dễ dàng
chứng minh được kết quả sau bằng quy nạp hoặc bằng phương pháp đánh giá khả năng lựa chọn:

Số chỉnh hợp lặp chập k của tập gồm n phần tử:
k

An = nk
II. CHỈNH HỢP KHƠNG LẶP
Khi f là đơn ánh có nghĩa là với ∀i, j ∈ X ta có f(i) = f(j) ⇔ i = j. Nói một cách dễ hiểu, khi dãy giá
trị f(1), f(2), ..., f(k) gồm các phần tử thuộc S khác nhau đơi một thì f được gọi là một chỉnh hợp
khơng lặp chập k của S. Ví dụ một chỉnh hợp không lặp (C, A, E):
i
1
2
3
f(i)
C
A
E
Số chỉnh hợp không lặp chập k của 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 của S được gọi là một hoán vị các phần tử của S.
Ví dụ: một hốn vị: (A, D, C, E, B, F) của S = {A, B, C, D, E, F}
i
1
2
3
4
5
6

f(i)
A
D
C
E
B
F
Để ý rằng khi k = n thì số phần tử của tập X = {1, 2, .., n} đúng bằng số phần tử của S. Do tính chất
đơi một khác nhau nên dãy f(1), f(2), ..., f(n) sẽ liệt kê được hết các phần tử trong S. Như vậy f là
toàn ánh. Mặt khác do giả thiết f là chỉnh hợp khơng lặp nên f là đơn ánh. Ta có tương ứng 1-1 giữa
các phần tử của X và S, do đó f là song ánh. Vậy nên ta có thể định nghĩa một hoán vị của S là một
song ánh giữa {1, 2, ..., n} và S.
Số hoán vị của 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 con gồm k phần tử của S được gọi là một tổ hợp chập k của S.
Lê Minh Hoàng


Lý thuyết đồ thị

\ 119 [

u, v: Integer;
begin
v := x;
while b[v] <> NewBase do
{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 của các đỉnh trên đườ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] nếu b[v] không phải nút cơ sở mới}
end;
end;
begin
{BlossomShrink}
FillChar(Mark, SizeOf(Mark), False);
NewBase := FindCommonAncestor(p, q);

{Tất cả các nhãn b[v] đều chưa bị đánh dấu}
{xác định nút cơ 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 các nhãn b[i] nếu blossom b[i] bị đánh dấu}

for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xét những đỉnh đậm i chưa được đưa vào Queue nằm trong Blossom mới, đẩy i và Queue để chờ duyệt tiếp tại các bước sau}

for i := 1 to n do
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ững đỉnh v chưa duyệt, kề với u, không nằm cùng Blossom với u, dĩ nhiên T[v] = 0 thì (u, v) là cạnh nhạt rồi}

for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then
{Nếu v chưa ghép thì ghi nhận đỉnh kết thúc đường mở và thoát ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nếu v là đỉnh đậm thì 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 thì ghi vết đường đi, thăm v, thăm luôn cả match[v] 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 bộ ghép bởi đường mở bắt đầu từ 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 := 1 to n do
if match[u] = 0 then
begin
start := u;
{Với mỗi đỉnh chưa ghép start}
FindAugmentingPath; {Tìm đường mở bắt đầu từ start}
if finish <> 0 then Enlarge; {Nếu thấy thì nới rộng bộ ghép theo đường mở này}
end;
end;
procedure Result;
{In bộ ghép tìm được}
var
u, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
count := 0;
for u := 1 to n do
if match[u] > u then {Vừa tránh sự trùng lặp (u, v) và (v, u), vừa loại những đỉnh không ghép được (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 quá n lần gọi thủ tục BlossomShrink, cộng thêm chi
phí của 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 quá n lần gọi thủ tục FindAugmentingPath nên có độ phức tạp
tính tốn là O(n3)

Lê Minh Hồng



×