PHƯƠNG PHÁP NHÁNH CẬN TRÊN CÂY NHỊ PHÂN 1 Sự lựa chọn cây nhị phân

Một phần của tài liệu phương pháp nhánh cận trong kỹ thuật lập trinh (Trang 46 - 49)

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. - 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.

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 đó.

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 đó.

3 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.

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. (adsbygoogle = window.adsbygoogle || []).push({});

- Di chuyển theo hướng đó. - Cập nhập lại trạng thái của cây.

4 Thủ tuc 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;

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á. - 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 quả chay chương trình Dưới dạng dẫy sè: 2 8 3 1 6 4 7 5 0. b1. 283 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

Một phần của tài liệu phương pháp nhánh cận trong kỹ thuật lập trinh (Trang 46 - 49)