Phương pháp nhánh và cận cài đặt trên cây nhị phân.DOC tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập...
Trang 1Giới thiệu chung
I Đặt vấn đề:
Để tìm kiếm lời giải của một bài toán ta có nhiều phương pháp khác nhau Nếu thể hiện bài toán dưới dạng đồ thị trong không gian trạng thái thì việc tìm lời giải cho bài toán là tìm đường đi trên bản đồ từ nút xuất phát đã cho đến một đích đích xác định
Có nhiều thuật giải tìm kiếm trên đồ thị đã được xây dựng, từ
những thuật giải vét cạn đơn giản như tìm theo chiều sâu, tìm theo chiều
rộng cho đến những thuật giải cải tiến ưu việt hơn, tập trung vào những
đường đi nhiều triển vọng hơn cả Trong bản luân văn này em xin được
trình bầy một trong những phương pháp đó là “phương pháp nhánh và
cận” Phương pháp nhánh cận là phương pháp tìm kiếm tối ưu mà không
tốn nhiều công sức và còn hoàn thiện hơn khi được cài đặt trên “cây nhị
phân” Việc triển khai tìm kiếm trên cây nhị phân là một cấu trúc dữ liệu
quen thuộc được xây dựng hoàn chỉnh sẽ là một thử nghiệm lý thú nên xem xét
I.2 ý tưởng:
Phương pháp tìm kiếm nhánh và cận là một phương pháp tìm kiếm tối ưu, bản thân cây nhị phân là một cấu trúc dữ liệu rất quen thuộc
và tìm kiếm trên đó là một việc đơn giản nhánh chóng, tìm kiếm trên cây nhị phân là phương pháp tìm kiếm nhanh nhất chưa có phương pháp nào nhanh hơn chính vì tại so ta không kếy hợp 2 phương pháp này để có thể đưa ra 1 phương pháp tìm kiếm hay hơn, nhanh hơn ,tối ưu hơn đó chính
là ý tưởng để em làm bản luân văn nay
Để có được những kết quả trong luân văn sinh viên đã nhận được
sự hướng dẫn tận tình của thầyd giáo TS Nguyễn Đình Hoá - Em xin chân thành cám ơn sự hướng dẫn của thầy trong những bước đầu nhgiên cứu
Bản luận văn này đã được hoàn thành nhưng với trình độ kiến thức và kinh nhiệm còn hạn chế nên không thể tránh khỏi những thiếu sót nên em rất mong được sự chỉ bảo của các thầy cô và đóng góp ý kiến
để em có thể hoàn thiện về mặt kiến thúc và tiếp tục nghiên cứu phát triển bản luận văn này được hoàn thiện hơn
Bản luân văn bày dài 87 trang, Ngoài phụ lục thì bao gồm ba chương Sau đây là tóm tắt nội dung chính của luân văn
Trang 2Chương I
Phương pháp tìm kiếm nhánh và cận
I Biểu diễn bài toán trong không gian trạng thái
I.1 Không gian trạng thái:
Để biểu diễn đầy đủ một bài toán trong phép biểu diễn không gian trạng thái cần phải xác định 4 yếu tố:
- Trạng thái ban đầu
- Các toán tử chuyển trạng thái: Từ một trạng thái đã cho đến một trạng thái kế tiếp
- Trạng thái đích
- Chi phí kèm theo mỗi toán tử chuyển trạng thái (có thể có)
Toán tử : phép biến đổi trạng thái được biểu diễn hoặc coi như hàm,
ánh xạ từ không gian trạng thái vào chính nó Hoặc các quy tắc sản xuất(Production rules) dưới dạng Si→ S j
Ví dụ: Đánh cờ có rất nhiều toán tử chuyển trạng thái vì nhiều quân, nhiều cách đi
Mô tả các trạng thái: Các xâu ký hiệu, véctơ, mảng một chiều, hai chiêu, cây, danh sách
Ví dụ:
Bài toán 8 ô chữ số: Mỗi trạng thái là một ma trận (Aij)3*3
Bài toán người bán hàng: Trạng thái là xâu ký hiệu, dẫy liên tiếp các phố
đã qua
Một cách hình thức có thể biểu diễn bài toán như sau:
Prob(S, O, So, Sđ)
S : (States) Không gian trạng thái bằng tất cả các trạng thái có thể có của bài toán
O : Các toán tử chuyển trạng thái
So : Trạng thái đầu
Sđ : Trạng thái đích
Biểu diễn bằng đồ thị:
Cho đồ thị G=(N,A) :
N: Nút (node)
A : Là cung (a,b) có hướng
Ta có thể hiểu:
Nút : là các trạng thái
Cung : Toán tử chuyển trạng thái (Cha chuyển sang con)
Nếu trạng thái đầu là gốc của cây thì lời giải là một đường đi từ gốc n đến nút đích
Trang 3- Bài toán 8 số, 9 ô.
Toán tử truyển trạng thái là di chuyển ô trống
Giải bài toán : là tìm đường đi từ trạng thái đầu đến đích
2 8 3
1 6 4
7 5
2 8 3
1 6 4
7 5
2 8 3
1 4
7 6 5
2 8 3
1 6 4
7 5
2 8 3
1 4
7 6 5
2 3
1 8 4
7 6 5
2 8 3
1 4
7 6 5
8 3
2 1 4
7 6 5
2 8 3
7 1 4
6 5
2 3
1 8 4
7 6 5
2 3
1 8 4
7 6 5
1 2 3
8 4
7 6 5
1 2 3
7 8 4
6 5
1 2 3
8 4
7 6 5
Trang 4Chương 2
I PHƯỜNG PHÁP TÌM KIẾM LỜI GIẢI:
II.1.MÔ HÌNH TRÊN ĐỒ THỊ:
Nếu biểu diễn bài toàn thành đồ thị trong không gian thạng thái lời giải của bài toán là tìm đương đi trên một đồ thị, từ một điểm xuất phát ứng với trạng thái đầu đến một điểm đích, ứng với trạng thái kết thúc của bài toán
Mỗi nút → 1 trạng thái của bài toán
Tuy nhiên tại mỗi nút còn cần có nhiều thông tin khác nữa thể hiện quan
hệ cha, con độ sâu, chi phí (path cost), trong khi trạng thái không thể hiện rõ những điều đó
Các cung là một phép toán, một quan hệ để chuyển từ trạng thái này sang trạng thái khác
• Thuật giải tổng quát:
Xuất phát từ nút trạng thái ban đầu:
Lặp:
- Nếu không có nút để triển khai tiếp → thất bại (vô nghiệm)
- Trái lại: Chọn nút để triển khai tiếp theo một quy tắc bằng một chiến lược nào đó để tìm ra đích (nếu có):
- Kiểm tra trạng thái đích chưa:
- Đúng → lời giải
- Sai : Khai triển nút và thêm các nút mới vào cây tìm kiếm
Hết lặp.
• Các chiến lược tìm kiếm
Được quyết định bởi:
- Quy tắc xác định thứ tự các nút sẽ tạo mới
- Quy tắc xắp xếp các nút con của nút đang xét vào danh sách chờ
• Đánh giá một chiến lược tìm kiếm
Các chỉ tiêu để xét một chiến lược tìm kiếm:
• Thành công: Có cho phép tìm ra đích không (nếu có đích).
• Độ phức tạp thời gian: Số nút cần phải tao mới, sinh ra.
• Độ phức tạp không gian: Số nút cần phải ghi nhớ trong bộ nhớ để
thực hiện vào việc tìm kiếm
Trang 5 Tối ưu: Có cho phép tìm ra được đường đi ngắn nhất từ gốc đến
đích hay không ⇔ lời giải tối ưu
Tổng quan hơn, nếu mỗi cung có một trong số là chi phí thì có tìm ra
đường đi (lời giải) với chi phí là min.
II.2 CÁC PHƯƠNG PHÁP TÌM KIẾM LỜI GIẢI:
Tìm kiếm theo chiều sâu trong không gian bài toán được bắt đầu
từ một nút rồi tiếp tục cho đến khi hoặc đến ngõ cụt, hoặc đến đích Nếu không đi tiếp được, gọi là đến gõ cụt, hệ thông quay lại một mức trên
cây và tìm theo hương khác Hành động này gọi là quay lui
Quá trình duyệt cây đi theo các nhánh cho đến nút lá nào
đó, sau đó quay lui về một đỉnh nào đó để sang nhánh khác
Đường đi không nhất thiết là ngắn nhất
- Không quay về trạng thái trước đó để tránh vòng xoay
vô hạn
Ưu điểm:
- Lời giải được đảm bảo :
Khai thác tận cùng không gian bài toán để tìm lời giải Sẽ tìm ra được lời giải nếu có
- Nhanh đến lời giải :
Lời giải ở rất sâu →tiết kiệm thời gian
- Luôn tập trung vào đích
- Cứng nhắc Nếu chọn nút ban đầu không thích hợp sẽ không dẫn đến
đích của bài toán.
- Không phù hợp với không gian bài toán lớn: Với bài toán có không
gian lời giải lớn Có thể không đến lời giải trong thời gian vừa phải Cho dù khi ta giới hạn độ sâu là D, thuật toán luôn dừng, nhưng với các đỉch ĐICH có độ sâu lớn hơn D thì nó đưa ra thông báo “không thành công” mà điều đó ta không mong muốn
- Không hiệu quả với các bài toán tầm thường: Đi theo một nhánh để
nhận được lời giải không mấy giá trị thì đó là không hiệu quả
B1
Hình minh hoạ tìm kiếm theo chiều sâu
Bắt
đầu
C1
ĐICH
A
B2
Trang 6
II.2.2.TÌM KIẾM THEO CHIỀU RỘNG:
Là tìm kiếm lời giải trên tất cả các nút của một mức trong không gian bài toán trước khi chuyển sang các nút ở mức tiếp theo
Được bắt đầu từ mức thứ nhất trong bài toán nếu không tìm thấy lời giải ở mức này nó chuyển xuống mức tiếp theo Đến khi định vị được lời giải, nếu có
- Giải được: vét cạn không gian bài toán→ tìm thấy lời giải nếu có
- Không bỏ qua các lời giải tầm thường, dễ thấy
- Thực hiện theo một thuật toán đã định trước Máy móc không có thông tin hỗ trợ
→ sẽ không nhận
ra ngay lời giải
→ dễ bỏ qua mất lời giải
không gian bài toán kích thước lớn: không đủ thời gian để vét cạn
các lời giải Nó phải đối diện với nhu cầu:
- Cần nhiều bộ nhớ, theo số nút cần lưu trữ
- Cần nhiều công xử lý các nút, nhất khi các nhánh cây dài, số nút tăng
- Dễ thực hiện các thao tác không thích hợp, thừa
- Không hiệu quả với lời giải ở sâu:
- Giao diện với người dùng không thân thiện
II.2.3) PHƯƠNG PHÁP BEST-FIRST SEARCH:
Các phương pháp tìm kiếm trên là những phương pháp tìm kiếm không
có thông tin bổ xung hay là tìm kiếm một cách mù quáng và chỉ dùng thông tin có từ ban đầu Đối lập với các phương pháp trên là những phương pháp tìm kiếm có xét đoán Ta xét hai phương pháp sau
Best-First search
Tư tưởng thuật toán :
……
B1
Bắt đầu
C1
…….
ĐICH
A
B2
……
…….
……
Hình minh hoạ tìm kiếm theo chiều rộng
Trang 7Các phương pháp đã xét trên thực chất là tìm kiếm vét cạn không gian bài toán và dừng khi đã tìm thấy đích
Mục đích của chúng ta là:
- Tìm ra lời giải = đến đích
- Nhanh nhất = đường ngắn nhất
Theo ngôn ngữ đồ thị bài toán trong không gian trang thái có nghĩa là:
Tìm đường đi ngắn nhất(rẻ nhất) từ nút đầu đến nút đích.
Ta có thể hiểu:
Best-First search = Xét đoán để đi theo nhánh nào nhiều triển vọng đến
đích hơn cả
- Xây dựng hàm đánh giá, gắn cho mỗi nút một trọng số
- Chọn nút nào có triển vọng lớn nhất (hoặc chi phí bé nhất) để khai triển tiếp
- Chọn nút có triển vọng nhất (hay chi phí nhỏ nhất)
- Xếp hàng nút con có trọng số lớn nhất vào đầu danh sách đợi
Nghĩa là: chiến lược xếp hàng có ưu tiên “triển vọng” chứ không phải
theo vị trí của nút trong cây đồ thị của bài toán
Hàm đánh giá thô sơ nhất
Xét nút “có vẻ” triển vọng nhất
Hàm đánh giá = hàm chi phí
II.3) PHƯƠNG PHÁP TÌM KIẾM NHÁNH VÀ CẬN
Một cách cho phép tìm kiếm các đường tối ưu mà không tốn nhiều công sức là dùng phương pháp tìm kiếm nhánh và biên Tìm kiếm nhánh và biên cho phép mởi rộng đường biên có giá trị thấp Nội dung đơn giản
Thủ tục tìm kiếm nhánh và biên:
1 Tạo hàng đợi có một phần tử là nút gốc, có độ dài bằng 0
2 Cho đến khi đương đầu tiên trong hàng đợi kết thúc tại nút đích hay hàng đợi rỗng, thực hiện:
•Rút đường đầu tiên ra khỏi hàng đợi; tạo các đường mới bằng cách nới đường đầu tiên về phía lân cận của nút đích.
•Bỏ đi các đường xoay vòng.
•Bổ sung các đường mới còn lại, nếu có, vào hàng đợi.
•Sắp xếp lại bộ hàng đợi theo độ dài đường đi, các đường giá rẻ lên trước
3 Nếu thấy nút đích thông báo hoàn thành, nếu không thì thông báo thất bại
Tuy các số tìm kiếm không ít nhưng thủ tục này tránh được việc vét cạn không gian lời giải
Trang 8Ta có thể bổ sung các đánh giá để tăng hiệu quả tìm kiếm: Ta có thể
thêm ước đoán về đoạn đương còn lại, chưa đi cũng như khoảng cách
đã đi được
Nhìn tổng thể:
Đánh gía cả con đường(e) = độ dài đoan đã đi(d) + đánh giá đoàn con lại(e’)
Việc đánh giá của phần còn lại không dễ dàng, đánh giá càng chính xác thì càng nhận định đúng về đương tối ưu, nhưng thường thì không hoàn hảo, và việc đánh giá cao hơn bước thực sẽ làm ta bỏ qua đưòng đi tốt hơn Nên ta dùng đánh giá thấp hơn giá thực tế để không bị bỏ mất đường đi
Đánh giá thấp con đường(u) = độ dài đoạn đã đi(d) + đánh giá thấp đoạn còn lại(u’)
Nếu người ta phát hiện con đường do phát triển các nút theo đánh giá thấp, không phảỉ xét các đường có đánh giá cao hơn đường này, nếu tất các đoạn còn lại có thể đánh giá thấp thì không thể sai lầm được
Ví dụ: Đường đi từ S đến A được đánh giá là 13.4….
Với đường SA có đánh giá cao hơn đường SD(13.4 > 12.9) vậy D được chọn để phát triển …, chọn
E để phát triển …, chọn F để phát triển
Vậy qua giải pháp vừa rồi ta tiết kiệm được nhiều công sức ta viết lại thủ tục Nhánh và Biên với nội dung cải tiến là dòng in đậm
Thủ tục tìm kiếm nhánh và biên(cải biến):
1 Tạo hàng đợi có một phần tử là nút gốc, có độ dài bằng 0
2 Cho đến khi đường đầu tiên trong hàng đợi kết thúc tại nút đích hay hàng đợi rỗng, thực hiện:
• Rút đường đầu tiên ra khỏi hàng đợi; tạo các đường mới bằng cách nới đường đầu tiên về phía lân cận của nút đích.
• Bỏ đi các đường xoay vòng.
• Bổ sung các đường mới còn lại, nếu có, vào hàng đợi.
• Sắp xếp lại toàn bộ hành đợi theo tổng độ dài đường đi và đánh giá biên thấp đối với đánh giá đoạn đường còn lại, các đoạn
đường giá rẻ lên trước
3 Nếu thấy nút đích thông báo hoàn thành, nếu không thì thông báo thất bại
Việc đánh giá chính xác được khoảng cách đoạn đương còn lại là thuận lợi cho thủ tục Tuy nhiên, vì không phải bao giờ cũng thực hiện được
S
A
G 17.7
13.0 12.9
12.9
19.4
Trang 9điều mong muốn nên người ta mới phải dùng đánh giá thấp hơn để thay thế, việc đưa ra đánh giá biên thấp còn tốt hơn là không đưa ra đánh giá nào mà cho tất cả các ước lượng các đoạn đường chưa đi là 0
nguyên tắc quy hoạch động :
Giả sử đường đi từ nút bắt đầu là S qua nút trung gian I không ảnh hưởng gì đến việc chọn các đường từ I đến đích G và ta thấy:
Khoảng cách tối thiểu (S→I→G) = khoảnh cách tối thiểu (S→I) +
khoảnh cách tối thiểu ( I→G)
Nguyên tắc quy hoach động nói rằng: “ Khi tìm đường tốt nhất từ S đến
G có thể bỏ qua các đường từ S đên nút trung gian I, mà chỉ giữ lại một đường có độ dài nhỏ nhất”
Nguyên tắc quy hoach động:
“Cách tốt nhất qua một nơi trung gian là đường tốt nhất tới nó kể từ nơi xuất phát, nối với đường tốt nhất từ nó tới đích, không cần thiết tìm các đường khác đến nơi trung gian ấy
Thủ tục tìm kiếm nhánh và cận:
1 Tạo hàng đợi có một phần tử là nút gốc, có độ dài bằng 0
2 Cho đến khi đường đầu tiên trong hàng đợi kết thúc tại nút đích hay hàng đợi rỗng, thực hiện:
• Rút đường đầu tiên ra khỏi hàng đợi; tạo các đường mới bằng cách nới đường đầu tiên về phía lân cận của nút đích.
• Bỏ đi các đường xoay vòng.
• Bổ sung các đường mới còn lại, nếu có, vào hàng đợi.
• Nếu hai hay nhiều đương gặp nút chung, xoa tất cả các đường này và chỉ để lại đường gặp nút chung với đánh giá tối thiểu Sắp xếp lại bộ hàng đợi theo độ dài đường đi, các đường giá rẻ lên trước.
3 Nếu thấy nút đích thông báo hoàn thành, nếu không thì thông báo thất bại
Trang 10CHƯƠNG II CÂY NHỊ PHÂN-THIẾT KẾ VÀ CÀI ĐẶT I.PHÂN TÍCH THIẾT KẾ CÂY NHỊ PHÂN
I.1.PHÂN TÍCH CẤU TRÚC DỮ LIỆU
Mô đun cây nhị phân trong phần này sẽ cài đặt và định nghĩa theo ngôn ngữ lập trình Turbo C Yêu cầu đặt ra là phải thiết kế tính đầy đủ không thừa, tức là mỗi thành phần của một nút đều phải có ý nghĩa quyết định nào đó Để làm được điều này ta phải có sự phân tích đúng và chính xác
Định nghĩa cây: Cây là 1 đồ thị không có chu trình, trong đó chọn ra 1
đỉnh gọi là gốc hay cây là 1 tập hợp các đỉnh trong đó có 1 đỉnh đặc biệt gọi là gốc, các đỉnh còn lại có quan hệ "cha con" Mỗi nút không có quá
2 con
Cây nhị phân còn được định nghĩa
theo kiểu đệ quy như sau:
Cây nhị Phân = Cây rỗng
Object = Dưliệu
Cây nhị phân : Cây con trái Cây nhị phân : Cây con phải
Cây rỗng là cây không chứa nút nào và biểu thị bằng một đối tượng đặc biệt NULL của ngôn ngữ
→ Cấu trúc của mỗi nút gồm ba trường, một trường dữ liệu và hai trường là con trỏ trái và con trỏ phải trường dữ liệu là một trường kiểu
con trỏ void.
Như vậy cấu trúc tối thiểu mỗi nút sẽ được mô tả như sau:
Struct Node
{
Node *Left Node *Right
Void *Object
}
Cây con Bên trái
Cây con Bên phải Gốc