Nguyên lý Dirichlet

Một phần của tài liệu Giáo trình toán rời rạc (Trang 47)

3.2.1. Phát biểu nguyên lý

Giả sử có một đ{n chim bồ c}u bay v{o chuồng. Nếu số chim nhiều hơn số ngăn chuồng thì ít nhất trong một ngăn có nhiều hơn một con chim. Nguyên lý n{y dĩ nhiên l{ có thể |p dụng cho c|c đối tượng không phải l{ chim bồ c}u v{ chuồng chim.

Nguyên lý.Nếu có k+1 (hoặc nhiều hơn) đồ vật được đặt v{o trong k hộp thì tồn tại một hộp có ít nhất hai đồ vật.

Chứng minh. Chúng ta sử dụng phương ph|p phản chứng. Giả sử rằng mỗi hộp

chứa tối đa l{ 1 đồ vật. Ta có k hộp, nghĩa l{ có k đồ vật. Điều n{y tr|i với giả thiết có k+1 đồ vật.

Các ví dụ

Ví dụ 1. Trong bất kỳ một nhóm 367 người thế n{o cũng có ít nhất hai người có ng{y

sinh nhật giống nhau bởi vì chỉ có tất cả 366 ng{y sinh nhật kh|c nhau.

Ví dụ 2. Trong kỳ thi học sinh giỏi, điểm b{i thi được đ|nh gi| bởi một số nguyên

trong khoảng từ 0 đến 100. Hỏi rằng ít nhất có bao nhiêu học sinh dự thi để cho chắc chắn tìm được hai học sinh có kết quả thi như nhau? Theo nguyên lý Dirichlet, số học sinh cần tìm l{ 102, vì ta có 101 kết quả điểm thi kh|c nhau.

3.2.2. Nguyên lý Dirichlet tổng quát

Nguyên lý.Nếu có N đồ vật được đặt vào trong k hộp thì sẽ tồn tại một hộp chứa ít nhất ⌈ ⌉ đồ vật. Trong đó, h{m ⌈ ⌉ dùng để lấy trần của một số (nghĩa l{ số nguyên cận trên đúng của nó).

Cần lưu ý rằng, trong c|c phép to|n l{m tròn số, ta có

, - - Phép lấy phần nguyên.

⌈ ⌉ - Phép làm tròn lên (hay phép lấy trần) hay hàm ().

CHƯƠNG 3. BÀI TOÁN TỒN TẠI

47

Các ví dụ

Ví dụ 1. Trong 100 người, có ít nhất 9 người sinh cùng một th|ng.

Xếp những người sinh cùng th|ng v{o một nhóm. Một năm có 12 th|ng. Vậy theo nguyên lý Dirichlet, tồn tại một nhóm có ít nhất ⌈ ⌉ ⌈ ⌉ người.

Ví dụ 2. Có năm loại học bổng kh|c nhau. Hỏi rằng phải có ít nhất bao nhiêu sinh

viên để chắc chắn rằng có ít ra l{ 6 người cùng nhận học bổng như nhau.

Gọi N là số sinh viên, khi đó ⌈ ⌉ khi v{ chỉ khi 5 < N div 5  6 hay 25 < N  30. C|c số thỏa m~n điều kiện n{y bao gồm 26, 27, 28, 29 v{ 30. Nhưng yêu cầu tìm số sinh viên ít nhất, do đó số N cần tìm l{ 26.

Tổng quát: Nếu cần tìm nhỏ nhất, sao cho ⌈ ⌉ thì ( )

Ví dụ 3. Trong một hình vuông cạnh 1. H~y chứng tỏ rằng nếu gieo v{o đó 5 điểm thì

có ít nhất hai điểm có khoảng c|ch nhỏ hơn √ .

Nếu ta chia hình vuông cạnh 1 th{nh 4 hình vuông con. Thì khoảng c|ch tối đa của hai điểm trong một hình vuông nhỏ không vượt qu| độ d{i của đường chéo l{ √ . Nếu ta gieo v{o 5 điểm trong hình vuông, thì sẽ có ít nhất ⌈ ⌉ điểm nằm trong một hình vuông nhỏ. Suy ra, sẽ luôn tồn tại hai điểm có khoảng c|ch nhỏ hơn √ .

Ví dụ 4. Cho hình thang c}n, có đ|y lớn l{ 2, đ|y bé l{ 1, chiều cao l{ 1. Người ta gieo

v{o đó 13 điểm. H~y chứng minh rằng, luôn tồn tại ít nhất 3 điểm m{ diện tích của hình tạo bởi ba điểm đó nhỏ hơn ¼.

Dễ d{ng chứng tỏ được rằng mỗi phần được chia như trên có diện tích ¼. Khi gieo v{o 13 điểm, sẽ có ít nhất

⌈ ⌉ điểm nằm trong 1 phần. Suy ra 3 điểm nằm trong một vùng diện tích ¼ thì diện tích tạo bởi chúng nhỏ hơn ¼. (adsbygoogle = window.adsbygoogle || []).push({});

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ 4.1. Giới thiệu bài toán

Bài toán đưa ra danh s|ch tất cả cá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. Khác với b{i to|n đếm là tìm kiếm một công thức cho lời giải, bài toán liệt kê lại cần x|c định một thuật to|n để theo đó có thể xây dựng được lần lượt tất cả các cấu hình cần quan tâm. Một thuật toán liệt kê phải đảm bảo hai nguyên tắc:

 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

Ví dụ 1. Cho tập hợp các số a1, a2,.., an và số M. Hãy tìm tất cả các tập con k phần tử của dãy số {an} sao cho tổng số các phần tử trong tập con đó đúng bằng M.

Giải. Như chúng ta đ~ biết, số các tập con k phần tử của tập gồm n phần tử là . Như vậy chúng ta cần phải duyệt trong số tập k phần tử để lấy ra những tập có tổng các phần tử đúng bằng M. Vì không thể x|c định được có bao nhiêu tập k phần tử từ tập n phần tử có tổng các phần tử đúng bằng M nên chúng ta chỉ còn cách liệt kê các cấu hình thoả m~n điều kiện đ~ cho.

Ví dụ 2. Một thương nh}n đi b|n h{ng tại tám thành phố. Chị ta có thể bắt đầu hành

trình của mình tại một thành phố n{o đó nhưng phải qua 7 thành phố kia theo bất kỳ thứ tự nào mà chị ta muốn. Hãy chỉ ra lộ trình ngắn nhất mà chị ta có thể đi.

Giải. Vì thành phố xuất ph|t đ~ được x|c định. Do vậy thương nh}n có thể chọn tuỳ ý

7 thành phố còn lại để h{nh trình. Như vậy, tất cả số hành trình của thương nh}n có thể đi qua l{ 7! = 5040 cách. Tuy nhiên trong 5040 cách chúng ta phải duyệt toàn bộ để chỉ ra một hành trình là ngẵn nhất.

Có thể nói phương ph|p liệt kê l{ biện ph|p cuối cùng nhưng cũng l{ biện ph|p phổ dụng nhất để giải quyết c|c b{i to|n tổ hợp. Khó khăn chính của 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, giả sử cần 1 gi}y để liệt kê một cấu hình thì chúng ta cũng cần 31 năm mới giải quyết xong. Tuy nhiên với sự ph|t triển nhanh chóng của m|y tính, bằng phương ph|p liệt kê, nhiều b{i to|n khó của lý

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ

49

thuyết tổ hợp đ~ được giải quyết v{ góp phần thúc đẩy sự ph|t triển của nhiều ng{nh to|n học.

4.2.Thuật toán quay lui

Để giải quyết những bài toán tổ hợp phức tạp, người ta thường dùng thuật toán quay lui (Back Track) sẽ được trình b{y dưới đ}y.

Nội dung chính của thuật toán này là 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ả sử cần phải tìm một cấu hình của bài toán x = (x1, x2,.., xn) mà i-1 thành phần x1, x2,.., xi-1 đ~ được x|c định, bây giờ ta x|c định thành phần thứ i của cấu hình bằng cách duyệt tất cả các khả năng có thể có v{ đ|nh số các khả năng từ 1..ni. Với mỗi khả năng j, kiểm tra xem j có chấp nhận được hay không. Khi đó có thể xảy ra hai trường hợp:

 Nếu chấp nhận j thì x|c định xi theo j, nếu i=n thì ta được một cấu hình cần tìm, ngược lại x|c định tiếp thành phần xi+1.

 Nếu thử tất cả các khả năng m{ không có khả năng n{o được chấp nhận thì quay lại bước trước đó để x|c định lại xi-1.

Điểm quan trọng nhất của thuật to|n l{ phải ghi nhớ lại mỗi bước đ~ đi qua, những khả năng n{o đ~ được thử để tr|nh sự trùng lặp. Để nhớ lại những bước duyệt trước đó, chương trình cần phải được tổ chức theo cơ chế ngăn xếp (Last in first out). Vì vậy, thuật to|n quay lui rất phù hợp với những phép gọi đệ qui. Thuật to|n quay lui x|c định th{nh phần thứ i có thể được mô tả bằng thủ tục Try(i) như sau:

void Try( int i ) { int j; for ( j = 1; j < ni; j ++) { if ( <Chấp nhận j >) { <Xác định xi theo j> if (i==n) <Ghi nhận cấu hình>;

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ

50

else Try(i+1); }

}

Có thể mô tả quá trình tìm kiếm lời giải theo thuật toán quay lui bằng cây tìm kiếm lời giải sau:

Hình 4.1 – C}y tìm kiếm thuật to|n quay lùi Bài tập áp dụng

Ví dụ 1. Liệt kê các xâu nhị ph}n độ dài n.

Giải. Biểu diễn c|c x}u nhị ph}n dưới dạng b1, b2,..., bn, trong đó bi {0, 1 }. Thủ tục đệ qui Try(i) x|c định bi với c|c gi| trị đề cử cho bi là 0 và 1. Chẳng hạn với n =3, c}y tìm kiếm lời giải được thể hiện như sau.

Hình 4.2 – C}y tìm kiếm x}u nhị ph}n độ d{i 3 (adsbygoogle = window.adsbygoogle || []).push({});

Gốc 0 0 0 1 1 0 1 1 0 0 1 1 0 1 Gốc Khả năng chọn x1 Khả năng chọn x2 Khả năng chọn x3 Khả năng chọn x4

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ

51

Ví dụ 2. Liệt kê các tập con k phần tử của tập n phần tử.

Giải. Biểu diễn tập con k phần tử dưới dạng c1, c2,.., ck, trong đó 1< c1<c2..≤n. Từ đó suy ra các giá trị đề cử cho ci là từ ci-1 + 1 cho đến n - k + i. Cần thêm vào c0 = 0.

C}y tìm kiếm lời giải b{i to|n liệt kê tập con k phần tử của tập n phần tử với n=5, k=3 được thể hiện như dưới đ}y.

Hình 4.3 – C}y tìm kiếm c|c tập con 3 phần tử của tập 5 phần tử

Ví dụ 4. Bài toán Xếp Hậu. Liệt kê tất cả các cách xếp n quân hậu trên bàn cờ

sao cho chúng không ăn được nhau.

Giải. Bàn cờ có n h{ng được đ|nh số từ 0 đến n-1, n cột được đ|nh số từ 0 đến n-1;

Bàn cờ có n*2 -1 đường chéo xuôi được đ|nh số từ 0 đến 2*n -2, 2 *n -1 đường chéo ngược được đ|nh số từ 2*n -2. Ví dụ: với bàn cờ 8 x 8, chúng ta có 8 h{ng được đ|nh số từ 0 đến 7, 8 cột được đ|nh số từ 0 đến 7, 15 đường chéo xuôi, 15 đường chéo ngược được đ|nh số từ 0..15.

Vì trên mỗi hàng chỉ xếp được đúng một quân hậu, nên chúng ta chỉ cần quan tâm đến quân hậu được xếp ở cột nào. Từ đó dẫn đến việc x|c định bộ n thành phần x1, x2,.., xn, trong đó xi = j được hiểu là quân hậu tại dòng i xếp vào cột thứ j. Giá trị của i được nhận từ 0 đến n-1; giá trị của j cũng được nhận từ 0 đến n-1, nhưng thoả mãn điều kiện ô (i,j) chưa bị quân hậu khác chiếu đến theo cột, đường chéo xuôi, đường chéo ngược.

Gốc 1 2 3 4 5 3 4 5 4 5 2 3 4 5 4 5 3 4 5

CHƯƠNG 4. BÀI TOÁN LIỆT KÊ

52

Việc kiểm so|t theo h{ng ngang l{ không cần thiết vì trên mỗi h{ng chỉ xếp đúng một qu}n hậu. Việc kiểm so|t theo cột được ghi nhận nhờ d~y biến logic aj với qui ước aj=1 nếu cột j còn trống, cột aj=0 nếu cột j không còn trống. Để ghi nhận đường chéo xuôi v{ đường chéo ngược có chiếu tới ô (i,j) hay không, ta sử dụng phương trình i + j = const và i - j = const, đường chéo thứ nhất được ghi nhận bởi d~y biến bj, đường chéo thứ 2 được ghi nhận bởi d~y biến cj với qui ước nếu đường chéo n{o còn trống thì gi| trị tương ứng của nó l{ 1 ngược lại l{ 0. Như vậy, cột j được chấp nhận khi cả 3 biến aj, bi+j, ci+j đều có gi| trị 1. C|c biến n{y phải được khởi đầu gi| trị 1 trước đó, g|n lại gi| trị 0 khi xếp xong qu}n hậu thứ i v{ trả lại gi| trị 1 khi đưa ra kết quả.

Dưới đ}y l{ số cách xếp hậu ứng với n.

n 4 7 8 9 10 11 12 13 14

CHƯƠNG 5. BÀI TOÁN TỐI ƯU

CHƯƠNG 5. BÀI TOÁN TỐI ƯU 5.1. Phát biểu bài toán

Trong tất cả các cấu hình tổ hợp chấp nhận được của một bài toán tổ hợp, hãy tìm cấu hình tổ hợp có giá trị sử dụng tốt nhất (theo một mục đích nào đó)”.

B{i to|n ta vừa nêu l{ b{i to|n tối ưu tổ hợp. Tối ưu tổ hợp cũng l{ một ph}n ng{nh của Tối ưu hóa v{ cũng l{ một ph}n ng{nh của To|n rời rạc. B{i to|n tối ưu tổ hợp có thể ph|t biểu tổng qu|t như sau: Tìm cực tiểu (hay cực đại) của h{m: f(x) min (hoặc max), với 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ử 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. Phần tử xD m{ với phần tử n{y, h{m mục tiêu đạt gi| trị tối ưu được gọi l{ phương |n tối ưu.

5.2. Thuật toán nhánh và cận

5.2.1. Bài toán

Tìm min{f(x) : xD} với D l{ tập hữu hạn phần tử. Giả sử D được mô tả như sau:

D = {x = (x1, x2, … ,xn)  A1A2 … An: x thoả m~n tính chất P},

với A1A2 … An l{ c|c tập hữu hạn, còn P l{ tính chất cho trên tích Đềc|c A1A2 … An .

Thuật to|n nh|nh v{ cận có thể giải b{i to|n n{y nếu như có thể tìm được một h{m g thoả m~n bất đẳng thức sau:

g(a1,a2,…,ak)  min{f(x) : xD, xi = ai, i = 1,2,…,k}, với k = 1,2,… (adsbygoogle = window.adsbygoogle || []).push({});

5.2.2. Thuật toán nhánh và cận

void Try(k) {

CHƯƠNG 5. BÀI TOÁN TỐI ƯU 54 if <chấp nhận ak> { xk = ak; if (k==n) <Cập nhật kỷ lục>; else Try(k+1); } } void Nhanh_can() { f = +; Try(1);

if ( f < +) <f là giá trị tối ưu, x là phương án tối ưu>; else <Bài toán không có phương án>;

}

5.2.3. Ví dụ

a. Bài toán cái túi

Phát biểu. Có n loại đồ vật, đồ vật thứ j có trọng lượng aj và giá trị sử dụng là

( ). Cần chất c|c đồ vật n{y v{o một c|i túi có khả năng chứa trọng lượng tối đa là b sao cho tổng giá trị sử dụng của c|c đồ vật chất trong túi là lớn nhất.

Mô hình toán. Giả sử rằng ( ) là vector trạng thái của c|c đồ vật. Thành phần có khả năng nhận một trong hai giá trị là 0 hoặc 1. Nếu nhận giá trị 0, có nghĩa l{ vật thứ j sẽ không có trong túi, ngược lại nhận giá trị 1, có nghĩa l{ vật thứ j sẽ có trong túi. Nếu nhận một giá trị lớn hơn 1, có nghĩa l{ đồ vật thứ sẽ chứa nhiều hơn 1 lần trong túi.

CHƯƠNG 5. BÀI TOÁN TỐI ƯU

55

( ) ∑

H{m n{y được gọi là hàm mục tiêu.

Trọng lượng của c|c đồ vật có trong túi là

Theo yêu cầu của bài toán, ta cần tìm bộ ( ) sao cho hàm ( ) .

Do đó, mô hình to|n của bài toán cái túi nhận được là

{ ( ) ∑ ( ) ∑ , -

Có nhiều phương ph|p để giải bài toán cái túi: phương ph|p lặp đơn hình (Simplex method), giải thuật tham lam (greedy approximation algorithm)... Tuy nhiên, trong chương n{y, chúng ta chỉ nghiên cứu phương ph|p nh|nh cận.

Phương pháp giải. Ta cần tìm hàm ( ) sao cho

{ ( ) ∑ ( ) ∑ ( )

Kí hiệu M là tập c|c phương |n của bài toán (1).

Không giảm tổng quát ta giả thiết rằng c|c đồ vật được đ|nh số sao cho bất đẳng thức sau được thoả mãn:

( )

Để xây dựng hàm tính cận dưới, cùng với bài toán cái túi (1), ta xét bài toán cái túi biến liên tục sau:

CHƯƠNG 5. BÀI TOÁN TỐI ƯU 56 { ( ) ∑ ( ) ∑ ( )

Lưu ý. Tập là tập số nguyên dương (không chứa số 0), tập l{ tập số tự nhiên (chứa số 0).

Mệnh đề. Phương án tối ưu của bài toán (3) là vectơ x(x1,x2,...,xn ) với các thành phần được xác định bởi công thức: (adsbygoogle = window.adsbygoogle || []).push({});

0 ... , 2 3 1 1  xx  xna b x

và giá trị tối ưu là g* = .

Giả sử ta có phương |n bộ phận cấp k là ̅ ( ̅ ̅̅̅ ̅̅̅). Khi đó gi| trị sử dụng của c|c đồ vật đang có trong túi l{:

∑ ̅

và trọng lượng còn lại của cái túi là:

∑ ̅

Khi đó, công thức (3) có thể viết lại như sau:

( ) {∑ ∑ , -} {∑ ∑ ∑ ∑ , -}

Một phần của tài liệu Giáo trình toán rời rạc (Trang 47)