Tải bản đầy đủ (.doc) (20 trang)

Phương pháp nhánh và cận cài đặt trên cây nhị phân.DOC

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 (221.84 KB, 20 trang )

Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Giớ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.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
1
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Chươ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 S
i
→ 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 (A
ij
)
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.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
2

Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
- 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.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
3
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
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Chươ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.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
4
Tóm tắt luận văn

Phương pháp nhánh và cận cài đặt trên cây nhị phân
 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.
• Nhược điểm:
- 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ả
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
5
B1
Hình minh hoạ tìm kiếm theo chiều sâu
Bắt
đầu
C1

ĐICH
A
B2

C2 C3

Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
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ó.
• Ưu điểm:
- 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.
• Nhược điểm:
- 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 phù hợp vớ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 :
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
6
……
B1
Bắt đầu
C1
…….
ĐICH
A
B2
……
…….
C2 C3
……
Hình minh hoạ tìm kiếm theo chiều rộng
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Cá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.
• Thuật 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.
Trân Triệu Hùng Hà Nội 6/2000

K96B- CNTT
7
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Ta 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
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
8
S
A
13.4
B C
D E F
G
17.7
13.012.9
12.9
19.4
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
đ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.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
9
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
CHƯƠ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
}
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
10
Cây
con
Bên trái
Cây
con
Bên
phải
Gốc
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Để cho tiện thực hiện các thao tác di chuyển trên cây, người ta còn thêm

1 con trỏ trỏ đến nút cha. Tóm lại mỗi nút cây nhị phân có chứa một con
trỏ đến dữ liệu và 3 con trỏ tương ứng tới nút con trái, con phải và nút
cha.
Typedef : Struct Mot_Node
{
void *Object
Struct Mot_Node *Trai, *Phai, *Cha;
}
Đối với cây nhị phân ta cần xây dựng : Tạo lập cây, huỷ cây, đọc
nội dung của một nút, di chuyển trên cây, thêm nút mới, gỡ bỏ một nút
và duyệt cây .
- Phép xử lý tại một nút có phái sinh các nút nhánh, các nút con nên cần
phải có thủ tục ghi lại vị trí hiện hành trên cậy nhị phân và thủ tục khôi
phục lại vị trí đã ghi của nút hiện thời. Điều này là cần thiết vì để thực
hiện phép duyệt cây hoặc phân nhánh trên cây.
II. GIAO DIÊN VÀ CÁC THUẬT GIẢI CÀI ĐẶT TRÊN CÂY NHỊ PHÂN
II.1. XÂY DỰNG GIAO DIỆN:
Qua tìm hiểu cấu trúc của một cây nhị phân ta thấy chúng được
thể hiện theo một giao diện cho dưới đây:
Typedef struck Mot_Node
{Void *Object;
Struct Mot_Mod *trai, *phai, *cha;}
Struct stackNode
{Node Sview;
Struck stack *Next;}
Typedef struct Tree_Teg
{Node goc, view;
Struct strack Node *Stack;
} cay 2;
Typedef enum (goc, cha, traI, phai) huong;

Struct
{Cay2(*taolap)( );
Void (*huy)(cay2, void(*)(void*));
Int (*da co nut)(cay2, huong);
Void (*xem cay)(cay2);
Int (*di toi)(cay2, huong);
Int (*Lay ra)(cay2, void(*)(void*));
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
11
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Void (*them vao)(cay2, huong, Void);
Void (ghi_lai_view)(cay2);
Void (ghi_lai_view_huong)(cay2, huong);
Void (*view_cu)(cay2);
Void (*hien thi)(cay2, void(*), (void*));
Void (*di chuyen canh)(cay2, huong);
Void (*ghep)(cay2, cay2, huong);}
II.2).CÀI ĐẶT CÁC THUẬT GIẢI TRÊN CÂY NHI PHÂN:
II.2.1).Thao tác tạo lập 1 cây thực hiện việc khởi tạo 1 cây tức là:
Goc = view = Null; stack = Null;
II.2.2).Thao tác huỷ một nút trên cây :
+ Static void huy(cay2 r, void(*det_obj)(void*));
+ Đây là thủ tục dung để xoá khỏi cây r nút hiện thời do con trỏ
VIEW trỏ tới, xoá dữ liệu được lưu trên nút bằng thủ tục (*det_ojb)
(void*). Đồng thời giải phóng khỏi cây nút đó. Thủ tục không có giá trị
trả về.
II.2.3. Thủ tục kiểm tra sự tồn tại của 1 nút:
+ Static int daconut(cay2 r, huong d);

+ Thủ tục này cho phép kiểm tra sự tồn tại của một nút theo một
hướng nào đó. Nút hiện thời lúc này là nút VIEW, ta có thể kiểm tra các
nút theo các hướng cho bởi tham số d của nút hiện thời. Giá trị của hàm
trả về sẽ quyết định sự tồn tại hay không tồn tại của nút theo hướng đã
cho .
Hàm = 1: Cho phép kết luận tồn tại nút trên hướng đó.
Hàm = 0: Nút chưa tồn tại .
II.2.4. Thủ tục thăm một nút
+ Static int Ditoi (cay2 r,huong d)
+ Thủ tục dùng đi thăm một nút nào đó xuất phát từ nút hiện thời
VIEW theo một trong các hướng xác định bởi tham số d. Giá trị của hàm
là một số nguyên. Nếu như thăm thành công thì hàm sẽ nhận giá trị 1 còn
không hàm nhận giá trị 0. Sau mỗi lần thăm ta cần điều chỉnh lại nút hiện
thời VIEW.
II.2.5. Thủ tục thêm vào một nút:
+ Static void themvao(cay 2 r, huong, void *obj)
+ Dung để bổ xung vào cây r đã tồn tại một nút mới sao cho theo
một hướng nào của nút hiện thời. Nút mới thêm vào sẽ có trường là một
kiểu đối tượng được cho bởi Obj. Sau khi thêm nút mới sẽ được chọn
làm nút hiện thời do View trỏ tới .
II.2.6. Thủ tục gỡ bỏ một nút :
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
12
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
+ Static int layra( cay2 r,void (*det_obj)(void*))
+ Thủ tục dùng để lấy ra một nút từ cây r đã tồn tại, nút khởi đầu
là nút hiện thời. Gía trị của hàm là một số nguyên. Nếu phép lấy ra thành
công thì hàm nhận giá trị 1, ngược lại hàm nhận giá trị 0. Sau khi ta lấy

ra ta phải điều chỉnh lại nút hiện thời.
II.2.7. Thủ tục thay thế thông tin tại một nút:
+ Static void thaythe(cay2, void, void(*),(void*))
+ Thủ tục dùng để thay thế thông tin tại nút hiện thời của cây đã tồn tại.
Do thông tin tại mỗi nút là một kiểu void nên ta dung hàm con trỏ trả về
giá trị void (void(*)(void*)).
II.2.8. Thủ tục ghi lại nút hiện thời :
+ Static void Ghilai_View(cay2 r)
+ Thực hiện chức năng ghi lại vị trí của nút hiện hành (được trỏ
bởi con trỏ VIEW) và các nút hiện thời được ghi trên một STACK.
II.2.9.Thủ tục ghi lại nút hiện thời theo một hướng đã chỉ ra.
+ Static void Ghilai_View_hương(cây2 r, huong d)
+ Thực hiện chức năng ghi lại các vị trí của nút hiện thời theo
hướng nào đó
II.2.10. Thủ tục lấy ra các nút hiện thời đã được ghi trong STACK
+ Static int View_cu(cay2 r);
+ Thực hiện phép lấy ra các nút hiện thời từ trong STACK.
II.2.11. Thủ tục di chuyển một cành
+ Static void chuyencanh(Cay2 r,huong d);
+ Thủ tục thực hiện di chuyển một cành từ nút hiện thời sang một
nút khác theo một hướng cho trước. Đồng thời sau phép di chuyển ta
phải chỉnh lại nút hiện thời.
II.2.12). Thủ tục ghép cây:
+ Static void ghep(cay2 r, cay S, huong d);
+ Thực hiện phép ghép hai cây lại với nhau. Trong trường hợp này
cây đích là cây R, cây nguồn là S. Cây nguồn sẽ được ghép vào một
hướng nào đó của nút hiện thời của cây ra;
II.2.13. Thủ tục chiết cây
+Static void chet (cay2 r, huong d)
+ Thực hiện phép chiết cây từ một cây đẵ tồn tại, nút được xét là

nút hiện thời và sẽ chiết theo một hướng nào đó của nút hiện thời.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
13
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
CHƯƠNG III
THỰC HIỆN THUẬT GIẢI TÌM KIẾM NHÁNH VÀ CÂN
TRÊN CÂY NHỊ PHÂN
I. CHUYỂN CÂY TỔNG QUÁT THÀNH CÂY NHỊ PHÂN
• Cây tổng quát :
Có rất nhiều cách để biểu diễn cây tổng quát, với cây tổng quát thì
việc lưu chữ rất lớn, tốn nhiều bộ nhớ, biểu diễn khó khăn. Như với cây
cấp m thì 1 nút phải có m mối nối để trỏ tới m cây con.
Số mối nối hay số nút được trỏ đến, được tính bằng công thức:
m * n – n –1 = n( m – 1) +1
Nếu tăng theo số con mà thay đổi qua các nút thì rất phức tạp→ việc lưu
trữ, thêm bớt các nút thì rất khó khăn ⇒ Biểu diễn cây tổng quát qua cây
nhị phân để mọi việc trở nên đơn giản.
Tại vì:
Cây nhị phân:
1 nút chỉ có: 1 con trái và 1 con phải.
vì mỗi nút chỉ có 2 con nên việc lưu trữ không tốn bộ nhớ hơn.
Biểu diễn qua cây nhị phân: Mỗi nút chỉ có một con cả và một em liền
kề .Quy cách các nút giống như cây nhị phân, nhưng thay cho con trái là
con cả, thay cho con phải là em liền kề.
Từ gốc: Nút đầy tiên bên trái cho làm con cả, các nút cùng bậc liền kề
với nó cho làm em liên kề.
Ví dụ:
Trân Triệu Hùng Hà Nội 6/2000

K96B- CNTT
14
Child infor Sibling
Con cả
Em liên kề
A
C
J
I
H
GFE
B
A
B
E
F
C
G
D
D
H
J
I
Hướng dịch
chuyên của
ô trống
2 8 3

1 6 4
7 0 5

Hướng dịch
chuyên của
ô trống
2 8 3

1 6 4
0 7 5
2 8 3

1 0 4
7 6 5
Hướng dịch
chuyên của
ô trống
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
II .XÂY DỰNG CHƯƠNG TRÌNH MINH HOẠ
Với bài toán 8 số và ô trống
Trạng thái của bài toán : Là một mảng 8 số được thể hiện bằng màng
một chiều – với số 0 là ứng với ô trống đây là vị trí tại mỗi nút
Và trong không gian trạng thái ta có thể biểu diễn mỗi nút :

Biểu diễn rất trực quan nhưng khó trong lập trình nên ta có thể biểu diễn
trong không gian trạng thái dưới dạng trạng thái đơn giản hơn. Như sau:
Ví dụ:
Và ta có thể biểu diễn ngược lại.
Với bài toán ta có:
- Hương di chuyển của ô trống: Từ một trạng thái đã cho có thể di
chuyển ô trống theo 1 trong 4 hướng trái, phải, lên, xuống để chuyển
sang trạng thái mới.

Ví dụ:
Tuy nhiên tuỳ từng vị trí của ô trông mà
các phương di chuyển trên có thể
thực hiện hay không.
Ví dụ:
ở trạng thái này
thì hướng di
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
15
x1 x2 x3
x4 x5 x6 x7 x8 x9
x1 x2 x3
x4 x5 x6 x7 x8 x9
x1 x2 x3 x4 x5 x6 x7 x8 x9
2 8 3
1 6 4
7 5 0 0
2 8 3 1 6 4 7 5 0
2 8 3
1 6 4
7 5 0
1 2 3
8 0 4
7 6 5 0
Trạng thái đầu Trạng thái đích
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
chuyên xuống dưới không thực hiện được, tường tự khi ô trống ở các
biên trái, phải, trên và ở các góc.

Mặt khác để tránh quay lại trạng thái cũ vừa đi qua thì cần ghi lại hướng
di chuyển vừa mới thực hiện để không quay lại tức là quay lui về vị trí
cũ.
Tính hàm đánh giá f(n):
Ta có công thức f(n) = g(n) + h(n)
g(n): Số di chuyển hay chi phí thấm nhất để đi từ nút đầu đến nút N
h(n): Đánh giá bằng ước lượng non của chi phí con lại để tử N đến đích.
được tính ở mỗi bước phân nhánh (ở bên cạnh trong đồ thị bài toán).
- Với ước lượng càng sát thì tìm càng nhanh.

III . THỂ HIỆN THUẬT GIẢI VÀ CẬN TRÊN CÂY:
III.1. Sự lưa chọn cây nhị phân:
- Cây tổng quát nhiều nút thừa, phức tạp, khó thể hiện, khó cài đặt,
không tối ưu.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
16
2 8 3
1 6 4
7 5
2 8 3
1 6 4
7 5
0 + 4
1 + 5 1 + 3
2 8 3
1 4
7 6 5
1 + 5
2 8 3

1 6 4
7 5
2 + 3
2 8 3
1 4
7 6 5
2 + 3
2 3
1 8 4
7 6 5
2 + 4
2 8 3
1 4
7 6 5
3 + 4
3 + 4
2 3
1 8 4
7 6 5
4 + 1
1 2 3
8 4
7 6 5
1 2 3
7 8 4
6 5
2 8 3
7 1 4
6 5
3 +2

2 3
1 8 4
7 6 5
1 2 3
8 4
7 6 5
5 + 0
3 + 3
8 3
2 1 4
7 6 5
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
- Cây nhị phân đã được xây dựng hoàn chỉnh, cài đặt thuật giải trên đó,
chính xác, tối ưu.
III.2.Thủ tục phân nhánh:
+ void branching (pnut C)
+ Ý nghĩa: Ta gọi nút bước t là nút được sinh ra ở các bước phân
nhánh thứ t. Thủ tục phân nhánh thứ t sẽ bắt đầu từ một nút thứ t-1. Giả
sử bắt đầu từ nút C.
Có Step = t
Theo quy tắc tạo cây ở mục trên, nút bước t đầu tiên được sinh ra
phải là nút con trái của C. Các nút sinh ra sau đó ứng với các nhánh tiếp
theo sẽ gán là con phải của nút trước đó.
• Thuật toán:
Với C là dữ liệu trong nút bước t –1.
Having_child = 0 chưa có con hay chưa phân nhánh.
Tạo nút mới: M= (pnut)malloc(sizeof(struct nut))
Step = 0;
- Tìm hàm lượng giá

- Tìm hướng đi( trái, phải, lên trên, xuống dưới) có hàm lượng giá
cực tiểu và đi theo hướng đó.
- Nếu M là nút mới đầu tiên gán M là con trái của C.
- Ngược lại gán M là con phải của nút sinh ra trước đó.
III.2. Thủ tục tính hàm lượng giá:
+ unsigned int Cost_func
+ Thực hiện cập nhập các hàm lượng giá mỗi sau mỗi bước phân
nhánh.
Hàm lượng giá:
f(n) = g(n) + h(n)
+ g(n): Bước đã đi.
+ h(n): Số vị trí sai so với đích.
Có thể hiểu h(n) như sau:
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
17
2 8 3
1 6 4
7 5 0
1 2 3
8 0 4
7 6 5 0
Trạng thái đầu Trạng thái đích
x1 x2 x3
x4 x5 x6 x7 x8 x9
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
Như ta thấy:
- Vị trí (x1) ở trang thái đầu là số 2 còn vi trí (x1) ở trạng thái đích là 1
đấy là sai vị trí tại x1 và lúc này h(n) = 1.

- Vị trí (x2) ở trang thái đầu là số 8 còn vi trí (x2) ở ttạng thái đích là 2
đấy là sai vị trí tại x1 và lúc này h(n) = 1+1=2.
- Vị trí (x3) ở trang thái đầu là số 3 còn vi trí (x3) ở ttạng thái đích là 3
hai vị trí này là giống nhau nên không tính nên h(n) vẫn dữ nguyên.
lúc này h(n) = 1+1=2.
- Tương tự với các vị trí còn lại.
- Cuối cùng h(n) = 5. Vị trí sai của ô trống có thể tính hay không và
nếu không tính thì h(n) = 4.
- Sau mỗi lần di chuyển ô trống thì h(n) có thể thay đổi, hoặc không.
• Thuật toán:
Hàm lượng giá = bước đã đi + số ô số sai vị trí.
Kiểm tra đích:
a). Nếu đúng tới đích : Dừng.
b). Nếu chưa:
- Kiểm tra có đi sang trái, phải, lên trên, xuống dưới (các bước đi
được giải thích ở trang 44) được không và không quay lại nút
trước.
- Di chuyển theo hướng đó.
- Cập nhập lại trạng thái của cây.
III.4. Thủ tục duyệt và phân nhánh:
+ Void phannhanh()
+ Thực hiện chức năng duyệt và phân nhánh trên toàn bộ cây.
• Thuật Toán:
- Khai báo và lưu kết quả khi tới thăm cây.
- Nếu bước hiện thời có giá trị bằng bước trên cây +1
- Ghi lại hướng của nút hiện thời trên cây (T)
- Gọi thủ tục phân nhánh trên bước t
- Gọi thủ tục quay lại các vị trí của nút hiện thời;
III.5. THUẬT GIẢI CHÍNH
Tiến hành bước phân nhánh và loại bớt các nhánh thừa. Sau mỗi

bước phân nhánh phải cập nhập giá trị tốt nhất của hàm lượng giá tìm
hướng đi thích hợp với hàm lượng giá min, sau Step = t thì chính là lời
giải, nên đặt Step bằng một số nào đó đủ lớn để dừng khi quá lâu.
Bước xuất phát:
Bắt đầu từ gốc.
- Tính hàm lượng giá.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
18
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
- Kiểm tra đích
Bằng đích suy ra kết quả.
- Nếu không:
- Khỏi tại nút mới T làm gốc
T.step = 0.
T.bound = 0.
Lặp : với Step = 1 tới KT
- Duyệt cây T, loại bớt nhánh
- Tính hàm lượng giá mới
- Di chuyển và cập nhập lại trạng thái
Hết lặp
Kết thúc: Tìm thấy đích hay khi step bằng một số nào đó khi qua lâu.
KÊT QUẢ CHAY CHƯƠNG TRÌNH
Dưới dạng dẫy số:
2 8 3 1 6 4 7 5 0.
b1. 293 164 705.
b2. 283 104 165.
b3. 283 014 765.
b4. 203 184 765.

b5. 023 184 765.
b6. 123 084 765.
b7. 123 804 765.
Các phép tính bên cạnh
là hàm lượng giá f(n) = g(n) + h(n).
Hướng chính của thuật toán là đường
đi có mũi tên, những trạng thái khác
là em thêm vào để thấy rõ được sự
lựa chọn nhánh.
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
19
2 8 3
1 6 4
7 5
2 8 3
1 6 4
7 5
1 + 4
2 + 5 2 + 3
2 8 3
1 4
7 6 5
2 + 5
2 8 3
1 6 4
7 5
3 + 3
2 8 3
1 4

7 6 5
3 + 3
2 3
1 8 4
7 6 5
3 + 4
2 8 3
1 4
7 6 5
4 + 4
2 3
1 8 4
7 6 5
5 + 1
1 2 3
8 4
7 6 5
1 2 3
7 8 4
6 5
4 +2
2 3
1 8 4
7 6 5
6 + 0
2 8 3
1 6 4
7 5
1 2 3
8 4

7 6 5
0 + 5
Tóm tắt luận văn
Phương pháp nhánh và cận cài đặt trên cây nhị phân
TÀI LIỆU THAM KHẢO
1. TS-ĐỖ TRUNG TUẤN - TRÍ TUỆ NHÂN TẠO .
(Nhà xuất bản giáo dục 1998)
2. ĐỖ XUÂN LÔI - CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT .
3. PTS-NGUYỄN THANH THUÝ - TRÍ TUỆ NHÂN TẠO .
(Nhà xuất bản giáo dục 1997)
4. GS-PHAM VĂN ẤT- KỸ THẬT LẬP TRÌNH C CƠ SỞ VÀ NÂNG CAO.
(Nhà xuất bản khoa học kỹ thuật 1997).
Trân Triệu Hùng Hà Nội 6/2000
K96B- CNTT
20

×