1. Trang chủ
  2. » Giáo án - Bài giảng

Gián án vet can

44 372 2

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 828,5 KB

Nội dung

Vấn đề trong vét cạn và giải pháp Ngày gửi bài: 24/12/2008 Số lượt đọc: 562 Vét cạn theo nghĩa thông thường là xét hết mọi đối tượng hay mọi trường hợp. Trong lập trình, vét cạn là phương pháp được dùng khi không còn phương pháp nào hiệu quả hơn có thể sử dụng được. 1. Phương pháp vét cạn Vét cạn theo nghĩa thông thường là xét hết mọi đối tượng hay mọi trường hợp. Trong lập trình, vét cạn là phương pháp được dùng khi không còn phương pháp nào hiệu quả hơn có thể sử dụng được. Phương pháp vét cạn được mô tả chung như sau: Bài toán: Có một tập Ccác ứng viên và một hàm f để đánh giá/cho điểm các ứng viên. Hãy tìm ứng viên được đánh giá/có điểm cao nhất. Phương pháp giải: Duyệt tất cả các ứng viên, tính điểm cho từng ứng viên, sau đó lấy ứng viên có điểm cao nhất. Chúng ta xét một ví dụ đơn giản. Bài toán: Cho tập Cgồm n số nguyên dương. Hãy tìm số chính phương lớn nhất trong Cbiết rằng số chính phương là số bằng bình phương của một số nguyên khác. Lời giải của bài toán bằng phương pháp vét cạn: Tập các ứng viên: C = {c 1 , c 2 , …, c n } Hàm đánh giá ứng viên: f(c i ) = 0 nếu c i không là số chính phương, f(c i ) = c i nếu c i là số chính phương. Thủ tục vét cạn: ungvienDuocChon := 0 diemCaonhat := 0 for i := 1 to n m := f(c i ) If m > diemCaonhat then diemCaonhat:= m ungvienDuocChon := c i 2. Vấn đề của vét cạn: Liệt kê các ứng viên Phương pháp vét cạn tưởng rằng tầm thường nhưng thực sự không tầm thường chút nào bởi vì không phải trong trường hợp nào các ứng viên cũng dễ nhận thấy và đã “sếp hàng” sẵn để được duyệt như trong ví dụ đơn giản nêu trên. Nghĩa là, vấn đề trong phương pháp vét cạn là làm sao để liệt kê được tất cả các ứng viên. Một khi đã liệt kê được các ứng viên, việc chấm điểm cho từng ứng viên và chọn ra ứng viên có điểm cao nhất chỉ còn là việc làm đơn giản. Một phương pháp hay được dùng để liệt kê các ứng viên là tổ chức không gian ứng viên theo một cấu trúc cây, mỗi ứng viên trên một nút (thường là lá) của cây. Đặc điểm của cây biểu diễn không gian ứng viên là các ứng viên trên các nút có quan hệ cha-con hoặc anh-em giống nhau ở một bộ phận nào đó. Một khi cấu trúc cây biểu diễn không gian ứng viên được thiết lập, chúng ta có thể áp dụng thủ tục duyệt cây (theo chiều rộng hoặc theo chiều sâu) để liệt kê các ứng viên. Cây biểu diễn không gian ứng viên có thể rất lớn và sẽ mất nhiều thời gian để tạo cũng như yêu cầu nhiều không gian để lưu trữ. Tuy nhiên, cây này chỉ mang tính trừu tượng, làm cơ sở cho việc duyệt (chọn nút tiếp theo được thăm), mà không phải được tạo ra và lưu trữ tất cả. Các bước thiết lập cây biểu diễn không gian ứng viên được mô tả chung như sau: 1.Xác định các tính chất của ứng viên dùng để phân loại ứng viên. 2.Với tính chất thứ nhất, phân hoạch các ứng viên theo tính chất này, nghĩa là chia tập ứng viên thành các tập con theo đó các phần tử thuộc cùng một tập con giống nhau ở tính chất thứ nhất, hai phần tử thuộc hai tập con khác nhau sẽ khác nhau ở tính chất thứ nhất. Tạo các cây con từ gốc, mỗi cây con tương ứng với một tập con vừa nhận được. 3.Với mỗi tập con, sử dụng tính chất thứ hai để phân hoạch tập con này. Kết quả thu được là các tập con nhỏ hơn. Từ gốc của cây con tương ứng với tập con đang xét, tạo các nhánh tương ứng với các tập con nhỏ hơn. 4.Quá trình cứ tiếp tục như vậy cho đến khi chúng ta xét hết các tính chất của ứng viên và thu được một cây biểu diễn không gian ứng viên. Chúng ta xét một số ví dụ trong Mục 3 sau đây. 3. Một số ví dụ Ví dụ 1. Cái giá (còn có tên là Knapsack 0/1) Bài toán: Cho n đồ vật có khối lượng lần lượt là w 1 , w 2 , …, w n và một cái giá chịu khối lượng tối đa là W.Hãy để các đồ vật lên giá sao cho tổng khối lượng các đồ vật được để trên giá là lớn nhất có thể. Ví dụ với 3 vật có khối lượng lần lượt là 6, 4, 3 và một cái giá có thể chịu khối lượng tối đa là 8, phương án tốt nhất là để hai vật có khối lượng 4 và 3 lên giá. Để giải bài toán này bằng phương pháp vét cạn, trước hết chúng ta phải xác định dạng của ứng viên và hàm đánh giá ứng viên. Mỗi một tập con (bao gồm các vật được chọn để đặt lên giá) của tập tất cả các vật là một ứng viên. Ta có thể biểu diễn mỗi ứng viên bằng một xâu nhị phân c = x 1 x 2 …x n với ý nghĩa vật thứ i được để trên giá nếu x i = 1 và không được để trên giá nếu x i = 0. Hàm đánh giá ứng viên được xác định như sau: Trong ví dụ trên, tập các ứng viên là C= {000, 001, 010, 011, 100, 101,110, 111}; điểm đánh giá các ứng viên lần lượt là 0, 3, 4, 7, 6, 0, 0, và 0; ứng viên được chọn là 011. Tiếp theo, chúng ta cần thiết lập cây biểu diễn không gian ứng viên. Chúng ta sử dụng n tính chất để phân hoạch các ứng viên đó là: vật thứ nhất được đưa lên giá (x 1 =1), vật thứ hai được đưa lên giá (x 2 =1), …, vật thứ n được đưa lên giá (x n =1). Với n tính chất này, thực hiện thủ tục thiết lập cây biểu diễn không gian ứng viên được mô tả ở trên, chúng ta thu được một cây nhị phân đầy đủ có chiều cao n, bao gồm 2 n lá, mỗi lá biểu diễn một ứng viên. Trong ví dụ trên, cây biểu diễn không gian ứng viên có dạng như sau: Hình 1. Cây biểu diễn không gian ứng viên của bài toán Cái giá với n =3. Cuối cùng, chúng ta áp dụng thủ tục duyệt cây theo chiều sâu (không nên sử dụng duyệt theo chiều rộng trong trường hợp này vì phải lưu trữ nhiều thông tin đồng thời) để tìm ứng viên tốt nhất (phương án đặt vật lên giá tốt nhất). Thủ tục duyệt được mô tả đệ quy như sau: ungvienDuocChon := ‘0….0’ diemCaonhat := 0 duyet(1, ‘’) procedure duyet(i, c) if i = n+1 then m := f(c) ifm >diemCaonhat then diemCaonhat := m ungvienDuocChon := c else duyet(i+1, c & ‘1’) duyet(i+1, c & ‘0’) Ví dụ 2. Tìm đường đi dài nhất Bài toán: Cho một lưới các ô vuông, mỗi ô được tô một màu: tím hoặc vàng. Hai ô được gọi là liền kề nếu chúng có chung cạnh. Một đường đi trong lưới là một dãy liên tiếp các ô vàng trong đó hai ô liên tiếp bất kỳ liền kề với nhau và không có ô nào xuất hiện trong dãy quá một lần. Hãy tìm đường đi dài nhất (có nhiều ô nhất) xuất phát từ ô ở góc trên trái và kết thúc tại ô ở góc dưới phải. Hình 2 cho chúng ta một ví dụ về lưới và đường đi dài nhất xuất phát từ ô ở góc trên trái và kết thúc tại ô ở góc dưới phải. Hình 2. Một đường đi dài nhất trên lưới. Cũng như trên, để giải bài toán này bằng phương pháp vét cạn, trước hết chúng ta phải xác định dạng của ứng viên và hàm đánh giá ứng viên. Mỗi ứng viên là một đường đi xuất phát từ ô ở góc trên trái và kết thúc tại ô ở góc dưới phải. Chúng ta sẽ biểu diễn mỗi ứng viên c bằng một lưới kích thước m×n như lưới ban đầu trong đó các ô trên đường đi được đánh số thứ tự liên tiếp bắt đầu từ ô xuất phát. Hàm đánh giá ứng viên được xác định là f(c) = c(m, n) (giá trị ô (m, n)). Hình 3. Biểu diễn một ứng viên có điểm đánh giá f(c) = 9. Để phân loại ứng viên, chúng ta sử dụng hướng đi tại mỗi ô được định nghĩa như sau: Với (i, j) là một ô thuộc đường đi, đường đi được gọi là hướng xuống tại (i, j) nếu ô kế tiếp trên đường đi là (i+1, j), là hướng lên tại (i, j) nếu ô kế tiếp trên đường đi là (i-1, j), là hướng trái tại (i, j) nếu ô kế tiếp trên đường đi là (i, j-1), là hướng phải tại (i, j) nếu ô kế tiếp trên đường đi là (i, j+1). Với các hướng đi được định nghĩa như vậy, thực hiện thủ tục thiết lập cây biểu diễn không gian ứng viên, chúng ta thu được một cây tứ phân. Hình 4 cho chúng ta một ví dụ về cây biểu diễn không gian ứng viên với lưới được vẽ trong Hình 2. Hình 4. Một cây biểu diễn không gian ứng viên của bài toán Tìm đường đi dài nhất. Ký hi.ệu (i) m×n là lưới kích thước m×n với các ô vàng có giá trị bằng i, các ô màu tím có giá trị bằng -1. Thủ tục duyệt cây biểu diễn không gian ứng viên được mô tả như sau: ungvienDuocChon := c := (0) m×n c(1, 1) = 1 duyet(1, 1) procedure duyet(i, j) if i=m and j=n then if c(m, n) > ungvienDuocChon(m, n) then ungvienDuocChon := c else if c(i+1, j) = 0 and i < m then ‘Đi xuống c(i+1, j) := c(i, j) + 1 duyet(i+1, j) c(i+1, j) := 0 if c(i-1, j) = 0 and i > 1 then ‘Đi lên c(i-1, j) := c(i, j) + 1 duyet(i-1, j) c(i-1, j) := 0 if c(i, j+1) = 0 and j < n then ‘Sang phải c(i, j+1) := c(i, j) + 1 duyet(i, j+1) c(i, j+1) := 0 if c(i, j-1) = 0 and j > 1 then ‘Sang trái c(i, j-1) := c(i, j) + 1 duyet(i, j-1) c(i, j-1) := 0 4. Kết luận Vấn đề chính trong sử dụng phương pháp vét cạn để giải toán là liệt kê các ứng viên. Một phương pháp hay được sử dụng là thiết lập cây biểu diễn không gian ứng viên rồi áp dụng một thủ tục duyệt cây để liệt kê các ứng viên. Bài viết đã đưa ra một phương pháp chung để thiết lập cây biểu diễn không gian ứng viên. Phương pháp này gợi ý cho chúng ta sử dụng một số tính chất để phân loại ứng viên và thủ tục thiết lập cây biểu diễn không gian ứng viên. Vét cạn là cơ sở cho hai phương pháp khác là quay lui và nhánh cận. Cả vét cạn, quay lui và nhánh cận đều thực hiện duyệt cấu trúc cây biểu diễn không gian ứng viên. Điểm phân biệt giữa vét cạn, quay lui và nhánh cận là trong quá trình duyệt (theo chiều sâu) cây, phương pháp quay lui sử dụng một hàm điều kiện, tại mỗi nút nếu hàm điều kiện không thỏa mãn, toàn bộ cây con có gốc tại nút hiện tại được bỏ qua; phương pháp nhánh cận sử dụng một hàm tính cận để tính trước điểm tối đa (cận) có thể đạt được đối với các ứng viên thuộc cây con có gốc tại nút hiện tại, nếu cận này không cao hơn điểm của ứng viên đã biết thì toàn bộ cây con có gốc tại nút hiện tại được bỏ qua. Có thể tóm tắt hai phương pháp quay lui và nhánh cận theo các công thức: Vét cạn + Hàm điều kiện = Quay lui, Vét cạn + Hàm tính cận = Nhánh cận. Như vậy, vấn đề chúng ta đã xét trong vét cạn cũng là vấn đề của hai phương pháp quay lui và nhánh cận. Thuật toán đệ quy Ngày gửi bài: 12/09/2008 Số lượt đọc: 916 1. Định nghĩa Ta nói một đối tượng là đệ quy nếu nó được định nghĩa qua chính nó hoặc một đối tượng khác cùng dạng với chính nó bằng quy nạp. Nếu lời giải của một bài toán T được thực hiện bằng lời giải của bài toán T’ có dạng giống T thì đó là một lời giải đệ quy. Giải thuật tương ứng với lời giải như vậy được gọi là giải thuật đệ quy. Chú ý, T’ có dạng giống T nhưng theo một nghĩa nào đó thì T’ phải “nhỏ” hơn T, dễ giải hơn T và việc giải T’ không phụ thuộc vào T. Ta đã biết đến khá nhiều ví dụ nổi tiếng về bài toán đệ quy và lời giải của nó như : bài toán tháp Hà Nội, số Fibonacci … Định nghĩa một hàm đệ quy như sau: -Phần neo: Phần này sẽ được thực hiện khi công việc quá đơn giản, có thể giải trực tiếp, nhanh chóng mà không cần nhờ đến một bài toán con nào. [...]...-Phần đệ quy: Thực hiện khi bài toán phức tạp hơn, chưa thể giải được bằng phần neo, ta xác định những bài toán con và đệ quy để giải những bài đó Khi đã có lời giải của những bài toán con rồi thì phối hợp lại để giải bài toán gốc Phần đệ quy thể hiện tính quy nạp của thuật toán đệ quy Vì mỗi lần gọi đệ quy bộ nhớ sẽ cần 1 lưu trữ 1 vùng nhớ mới trong khi... toán đệ quy là một thuật toán lập trình khá đơn giản, khá dễ dàng áp dụng cho các bài toán, nhưng khi lập trình các bạn nên lưu ý đến dung lượng bộ nhớ Chúc các bạn thành công ! Sellsort – mở rộng của phương pháp sắp xếp chèn Ngày gửi bài: 22/07/2008 Số lượt đọc: 757 Như chúng ta đã biết, chèn là một trong những phương pháp sắp xếp cơ bản Chèn là một thuật toán gần như đơn giản ngang với thuật toán... không tránh khỏi các sai sót, rất mong nhận được sự đóng góp ý kiến của các bạn độc giả Mọi góp ý, thắc mắc xin gửi về địa chỉ email: tuannhtn@yahoo.com Quy hoạch động và ứng dụng Ngày gửi bài: 24/03/2010 Số lượt đọc: 278 Đối với nhiều thuật toán nguyên lý “chia để trị” thường đóng vai trò chủ đạo trong việc thiết kế thuật toán: để giải quyết một bài toán lớn, chúng ta chia nó thành nhiều bài toán con... nhiên chúng ta có thể chọn một thuật toán sắp xếp có độ phức tạp hoặc Tóm lại là thuật toán sẽ có độ phức tạp là Nếu như các phần tử không phải là phân biệt, thì sau khi sắp xếp xong chúng ta có thể sửa đổi đôi chút để thuật toán trên vẫn có thể làm việc được trong cả trường hợp này (phần này sẽ dành cho các bạn như là một bài tập nhỏ) Chú ý là trong thuật toán trên chúng ta đã sử dụng ≤ z thì agv(x,... bài toán) Lời giải đơn giản cho bài toán có độ phức tạp là với lời phát biểu của bài toán: , lời giải này hoàn toàn trực tiếp đối Vòng lặp kiểm tra tồn tại j và k cần N*N bước thực hiện (cần kiểm tra tất cả các cặp để xem a[i] có là trung bình cộng của cặp đó không) Do đó độ phức tạp của thuật toán sẽ là Lời giải này có thể qua được khoảng 30% số test của bài toán, đo điều kiện về biến N Tuy nhiên... nguyên lý này được đẩy đến cực độ: khi không biết chắc cần giải quyết bài toán con nào, chúng ta giải quyết tất cả những bài toán con và lưu trữ những lời giải này với mục đích sử dụng lại chúng theo một sự phối hợp nào đó để giải quyết các bài toán tổng quát hơn Thuật ngữ “ quy hoạch” ở đây ngụ ý nói đến quá trình đưa bài toán ban đầu về một dạng nào đó có thể áp dụng phương pháp này để giải Đó là... phương pháp quy hoạch động để giải quyết vấn đề, ta có thể gặp phải hai khó khăn sau: - Một là, không phải lúc nào sự kết hợp lời giải của bài toán con cũng cho ra lời giải bài toán lớn hơn - Hai là, số lượng các bài toán con cần giải quyết và lưu trữ đáp án có thể rất lớn, không thể chấp nhận được Cho đến nay, chưa ai xác định được một cách chính xác những bài nào có thể được giải quyết hiệu quả bằng... sinh ra một dãy con tồi ứng với một giá trị N nào đó Mô tả trên về độ hiệu quả của Shellsort là không chính xác bởi vì không có ai có thể phân tích thuật toán Điều này dẫn đến khó khăn không những khi đánh giá các dãy tăng khác nhau mà cả khi so sánh Shellsort với các phương pháp khác về mặt giải tích Thậm chí dạng hàm của thời gian chạy cả thời gian chạy cho Shellsort cũng không biết được (Hơn thế... phương pháp hiệu quả hơn nhưng có lẽ chỉ nhanh hơn hai lần ngoại trừ N lớn, và tất nhiên là chúng phức tạp hơn đáng kể Tóm lại, nếu bạn có một bài toán sắp xếp, thì hãy thử dùng chương trình trên, sau đó xác định xem khi nào việc bỏ công sức ra để thay nó bằng một phương pháp tinh vi hơn là đáng để làm Học thuật toán qua các bài toán Ngày gửi bài: 20/05/2008 Số lượt đọc: 1063 Học tập thuật toán... xong: đây là Shellsort Hình ảnh dưới đây sẽ cho thấy thao tác của Shellsort trên tập tin ví dụ ứng dụng với các bước 13, 4, 1 Trong lần lặp đầu tiên, A ở vị trí 1 được so sánh với L ở vị trí 14, sau đó S ở vị trí 2 được so sánh (và hoán vị) với E ở vị trí 15 Trong lần lặp thứ hai, A T E P ở vị trí 1, 5, 9 và 13 được sắp xếp lại để đặt A E P T vào các vị trí đó, và tương tự cho các vị trí 1, 6, 10 và 14, . tả chung như sau: Bài toán: Có một tập Ccác ứng viên và một hàm f để đánh giá/cho điểm các ứng viên. Hãy tìm ứng viên được đánh giá/có điểm cao nhất nhánh cận. Cả vét cạn, quay lui và nhánh cận đều thực hiện duyệt cấu trúc cây biểu diễn không gian ứng viên. Điểm phân biệt giữa vét cạn, quay lui và nhánh

Ngày đăng: 27/11/2013, 02:11

Xem thêm

TỪ KHÓA LIÊN QUAN

w