Bài toán duyệt từ 2 phía

5 152 0
Bài toán duyệt từ 2 phía

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

Thông tin tài liệu

Duyệt từ hai phía Lưu Tuấn Anh Duyệt từ phía cách duyệt toàn có tốc độ chấp nhận Duyệt từ phía ứng dụng số toán biến đổi, cho trạng thái đầu cuối tập biến đổi Yêu cầu sử dụng phép biến đổi để chuyển trạng thái đầu trạng thái cuối Phương pháp: sử dụng phép biến đổi, biến đổi trạng thái đầu để tạo tất khả có sau số bước (có thể khai báo CONST tính toán chương trình tuỳ thuộc vào nhớ chủ yếu), lưu lại tất trạng thái Sử dụng phép biến đôỉ ngược lại biến đổi trạng thái đích ngược trở lại Được trạng thái so sánh với trạng thái lưu Phân tích thuật toán: Ta vào trường hợp đặc biệt, giả sử biến đổi nhị phân đầy đủ hoàn chỉnh Các nút đôi khác Như sau 2*N bước biến đôỉ, ta số trạng thái sinh (các trạng thái lá) 2^(2N) Bây ta xét phương pháp duyệt từ phía: Tối ưu ta duỵêt N bước biến đổi Vậy số trạng thái (số nút lá) 2^N Lưu lại tất trạng thái Duỵêt ngược lại từ trạng thái đích: thêm 2^N trạng thái Duỵêt lần 2, ta cài Stack (tự quản lí hay đệ qui được) So sánh trạng thái với nhau, có thuật toán so sánh tốt, ta cần độ phức tạp tính toán 2^(N+1), độ phức tạp nhớ (2^N + N) Còn thuật toán ban đầu 2^(2N) cho độ phức tạp thuật toán, 2N cho độ phức tạp nhớ Các phương pháp so sánh : nói trên, toán khó phải sử dụng nhiếu kiến thức từ mảng khác Tin học Chủ yếu phần so sánh trạng thái Nếu ta thuật toán so sánh tốt phài so sánh toàn bộ.Độ phức tạp so sánh lúc 2^N Độ phức tạp lúc 2^N*2^N=2^(2N) thuật toán ban đầu Sau số phương pháp so sánh tốt: sử dụng tìm kiếm nhị phân kết hợp với phương pháp mã hoá Các bước thực hiện: tìm mã hoá trạng thái với giá trị nguyên A Các trạng thái mã hoá xếp lại theo giá trị khoá Khi ta có trạng thái ngược ( trạng thái sinh sau ta sinh ngược từ giá trị đích) ta mã hoá số B Sau tìm kiêm giá trị B xem xuất chưa Ở đây, có tìm là:1 Nếu max(A) nhỏ, ta dùng xử lí bít để đánh dấu, sau tìm phép kiểm tra Độ phức tạp cho phép kiểm tra O(1).2 Nếu max(A) lớn, ta sort lại giá trị khoá A theo giá trị (thực cách khác sort lại trạng thái mà không cần mã hoá Thường sort theo thứ tự từ điển) Sau ta dùng phương pháp tìm kiếm nhị phân để tìm dãy khoá sort Độ phức tạp O(lg(2^N)=N) Như độ phức tạp dùng cách (2^N)*N nhỏ so với 2^(2N) Các phương pháp mã hoá: Các phương pháp mã hoá thường phải thoả mãn số tính chất sau đây: Tính nhất: (điều kiện bắt buộc) Với trạng thái sinh khoá với khoá cho trạng thái Tính đơn giản (không bắt buộc): Cách mã hoá phải đơn giản tốt 3 Tính suy ngược (không bắt buộc): Với khoá ta tính trạng thái Nói cụ thể phương pháp mã hoá cần viết khác đầy đủ Bạn tham khảo số báo trước cách nén liệu.Sau nói đến vài ví dụ đơn giản để bạn dễ hình dung Mã hoá xâu nhị phân Mã hoá Hoán vị Mã hoá tổ hợp Mã hoá chỉnh hợp… Sau toán phân tích thuật toán để làm rõ thêm pp Duyệt từ phía ĐẨY QUÂN Tên chương trình:MOVE.PAS Trò chơi Dao Jeff Pickering Ben van Burkirk đề xuất năm 1999 Đó trò chơi người Ở xét phương án cải tiến thành trò người chơi Xét bảng kích thước 4x4 ô, có quân cờ trắng quân cờ đen Ban đầu quân cờ đặt cách ngẫu nhiên Người chơi phải đưa bảng quân cờ trạng thái cuối cho trước theo quy tắc di chuyển sau: • Đi quân trắng- quân đen, quân trắng, • Quân theo hàng ngang, hàng dọc chéo bị chặn quân có hay mép bàn cờ, không ăn nhảy qua quân khác, • Ở bước phải di chuyển quân màu tương ứng, không bỏ qua nước Ví dụ, nước sau hợp lệ: Trong trường hợp này, nước thực Tuy vậy, ta nhận kết cuối với nước đi: Yêu cầu: Cho trạng thái đầu cuối bàn cờ Hãy xác định số bước tối thiểu để từ trạng thái đầu nhận trạng thái cuối Dữ liệu:Vào từ file văn MOVE.INP: • Dòng chứa số nguyên t - số lượng Tests, • Thông tin Test đưa dòng, dòng đầu mô tả trạng thái đầu bảng, dòng sau – mô tả trạng thái cuối Các bảng mô tả theo dòng, từ xuống dưới, dòng mô tả xâu ký tự, w quân trắng, b – quân đen * - vị trí trống Kết quả: Đưa file văn MOVE.OUT đưa số lượng bước tối thiểu cho Test, kết đưa dòng Ví dụ: Phương pháp không nói lại cụ thể, phân tích chỗ cần thiết để làm rõ thêm Các phép biến đổi: Biến đổi xuôi: Người chơi phải đưa bảng quân cờ trạng thái cuối cho trước theo quy tắc di chuyển sau: • Đi quân trắng- quân đen, quân trắng, • Quân theo hàng ngang, hàng dọc chéo bị chặn quân có hay mép bàn cờ, không ăn nhảy qua quân khác, • Ở bước phải di chuyển quân màu tương ứng, không bỏ qua nước Từ qui tắc biến đổi ta suy qui tắc biến đổi ngược lại: Tại lượt phải kiểm tra xem bước quân đen hay quân trắng Y qui tắc trên, người không hiểu ngược lại lại giống trên, xem lại ví dụ kiểm tra ngược lại xem: Ngoài bước không theo qui tắc, lại theo qui tắc Do trạng thái ta lưu lại có sau số phép biến đổi không bước nên qui tắc Qui tắc tương tự Như ta xây dựng xong qui tắc biến đổi ngược lại Phương pháp mã hoá: Ta dùng phương pháp gần mã hoá tổ hợp Tổng số lượng trạng thái sinh tổ hợp chập 16 nhân với tổ hợp chập 12 16!/(4!4!8!)=900900 làm theo cách (khai báo động kết hợp xử lí bit- nói turbo pascal) Ta xét thêm cách lưu lại giá trị sau xếp lại, may mắn giá trị phạm vi Longint Khi cho trạng thái ví dụ: Chúng ta thực sau: Lọc ô trắng ra, ghi lại toạ độ ô đó, toạ độ ghi từ 16 ta có dãy 1, 6, 11, 16 Tính gía trị tổ hợp dãy trên, Gọi A Lọc ô đen ra, làm tính từ 12 bỏ qua ô trắng, ta có dãy 3,5,8,10 Tính giá trị tổ hợp dãy trên, gọi B Mặc dù lúc tính số lượng cấu hình, ta dùng phép nhân giá trị A*B tính giá trị cấu hình ta nhân Lí ta nhân ta không đảm bảo giá trị Ví dụ : 6*8=12*4 Để giả chỗ này, ta làm sau: Đặt giá trị Const M=495 giá trị max B Khi nhận số A,B ta tính giá trị X cấu sau: X=(A-1)*M+(B-1); Giá trị đảm bảo Như vậy, cho giá trị X ta làm sau: A:=(X div M) +1; B:=(X mod M) +1; Từ A,B ta suy cấu hình Từ A suy ô màu trắng, Từ B suy ô màu đen tính trạng thái phải bỏ ô màu trắng Như giải xong phần mã hoá liệu Khi tính X ta đánh đấu Bit Nói tổng quát hơn, ta coi đánh dấu Khi ta sinh tập hợp khoá Sắp xếp khoá Có thể có số khoá lặp Nhưng ta không cần quan tâm Sau xin giới thiệu cách sử dụng để sinh tập khoá const max = {tuỳ bạn }; type ar = array[0 max] of longint; var save : ar; temp : ^ar; qua_gioi_han : boolean; procedure Bien_doi(K: Longint); var i:longint; begin trangthai(k); {thủ tục từ khoá k sinh trạng thái tương ứng với khoá đó} while Con_bien_doi_thuan_duoc begin Bien_doi_thuan; inc(save[0]); save[0]:=mahoa; if save[0]>max then begin qua_gioi_han:=true; exit; end; end; end; procedure DFS; var i : integer; begin while true begin for i:=1 to temp^[0] begin Bien_doi(temp^[i]); if qua_gioi_han then break; end; if not qua_gioi_han then temp^:=save; end; save:=temp^; end; Với chương trình trên, bạn lưu lại khoảng max khoá ... Mã hoá xâu nhị phân Mã hoá Hoán vị Mã hoá tổ hợp Mã hoá chỉnh hợp… Sau toán phân tích thuật toán để làm rõ thêm pp Duyệt từ phía ĐẨY QUÂN Tên chương trình:MOVE.PAS Trò chơi Dao Jeff Pickering Ben... sau: Lọc ô trắng ra, ghi lại toạ độ ô đó, toạ độ ghi từ 16 ta có dãy 1, 6, 11, 16 Tính gía trị tổ hợp dãy trên, Gọi A Lọc ô đen ra, làm tính từ 12 bỏ qua ô trắng, ta có dãy 3,5,8,10 Tính giá trị... bảo Như vậy, cho giá trị X ta làm sau: A:=(X div M) +1; B:=(X mod M) +1; Từ A,B ta suy cấu hình Từ A suy ô màu trắng, Từ B suy ô màu đen tính trạng thái phải bỏ ô màu trắng Như giải xong phần

Ngày đăng: 06/07/2017, 14:15

Mục lục

  • Duyệt từ hai phía

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan