32

Tôi tiếp tục đọc khoảng làm sâu sắc lặp lại, nhưng tôi không hiểu nó khác với tìm kiếm theo chiều sâu theo chiều sâu.Làm sâu sắc lặp lại và tìm kiếm theo chiều sâu

Tôi hiểu rằng tìm kiếm theo chiều sâu sẽ tiếp tục đi sâu hơn và sâu hơn.

Khi làm sâu thêm lặp, bạn thiết lập giá trị của một mức, nếu không có giải pháp ở cấp đó, bạn tăng giá trị đó và bắt đầu lại từ đầu (gốc).

Điều này có giống với tìm kiếm theo chiều sâu không?

Tôi có nghĩa là bạn sẽ tiếp tục tăng và tăng dần, đi sâu hơn cho đến khi bạn tìm thấy giải pháp. Tôi thấy điều này giống như vậy! Tôi sẽ đi xuống cùng một chi nhánh, bởi vì nếu tôi bắt đầu lại từ đầu tôi sẽ đi xuống cùng nhánh như trước.

+1

Trong tìm kiếm theo chiều sâu, bạn khám phá từng chi nhánh bạn nhập hoàn toàn trước khi quay lại từ nó và chuyển sang bước tiếp theo. Trong việc làm sâu lặp đi lặp lại, bạn không đi sâu dưới độ sâu hiện tại, và do đó không khám phá từng chi nhánh bạn truy cập hoàn toàn trước khi quay lại. – HelloGoodbye

Trả lời

74

Trong tìm kiếm theo chiều sâu, bạn bắt đầu tại một số nút trong biểu đồ và liên tục khám phá sâu hơn vào biểu đồ trong khi bạn có thể tìm thấy các nút mới mà bạn chưa đạt đến (hoặc cho đến khi tìm thấy giải pháp). Bất cứ lúc nào DFS chạy ra khỏi di chuyển, nó quay trở lại điểm mới nhất, nơi nó có thể đưa ra một lựa chọn khác, sau đó khám phá ra từ đó. Đây có thể là một vấn đề nghiêm trọng nếu biểu đồ của bạn cực kỳ lớn và chỉ có một giải pháp, vì bạn có thể kết thúc khám phá toàn bộ biểu đồ dọc theo một đường dẫn DFS chỉ để tìm giải pháp sau khi xem từng nút. Tồi tệ hơn, nếu biểu đồ là vô hạn (có lẽ đồ thị của bạn bao gồm tất cả các số, ví dụ), tìm kiếm có thể không chấm dứt. Hơn nữa, khi bạn tìm thấy nút bạn đang tìm kiếm, bạn có thể không có đường dẫn tối ưu cho nó (bạn có thể đã lặp lại tất cả đồ thị tìm giải pháp mặc dù nó nằm ngay bên cạnh nút bắt đầu!)

Một giải pháp tiềm năng cho vấn đề này là giới hạn độ sâu của bất kỳ đường dẫn nào do DFS thực hiện. Ví dụ, chúng ta có thể thực hiện tìm kiếm DFS, nhưng dừng tìm kiếm nếu chúng ta có một chiều dài lớn hơn 5. Điều này đảm bảo rằng chúng ta không bao giờ khám phá bất kỳ nút nào có khoảng cách lớn hơn năm từ nút bắt đầu, có nghĩa là chúng ta không bao giờ khám phá ra vô hạn hoặc (trừ khi đồ thị cực kỳ dày đặc), chúng tôi không tìm kiếm toàn bộ biểu đồ. Tuy nhiên, điều này có nghĩa là chúng tôi có thể không tìm thấy nút mà chúng tôi đang tìm kiếm vì chúng tôi không nhất thiết phải khám phá toàn bộ biểu đồ.

Ý tưởng đằng sau việc làm sâu lặp lại là sử dụng phương pháp thứ hai này nhưng để tiếp tục tăng chiều sâu ở mỗi cấp. Nói cách khác, chúng ta có thể thử khám phá bằng cách sử dụng tất cả các đường dẫn có chiều dài một, sau đó tất cả các đường dẫn có chiều dài hai, sau đó là chiều dài ba, v.v. cho đến khi chúng ta tìm thấy nút đang được đề cập đến. Điều này có nghĩa rằng chúng ta không bao giờ kết thúc khám phá dọc theo các đường dẫn chết vô hạn, vì chiều dài của mỗi đường dẫn bị giới hạn bởi một số chiều dài ở mỗi bước. Nó cũng có nghĩa là chúng ta tìm đường dẫn ngắn nhất có thể đến nút đích, vì nếu chúng ta không tìm thấy nút ở độ sâu d nhưng đã tìm thấy nó ở độ sâu d + 1, không thể có đường dẫn dài d (hoặc chúng ta đã có thể lấy nó), do đó, đường dẫn của chiều dài d + 1 thực sự là tối ưu.

Lý do điều này khác với DFS là nó không bao giờ chạy vào trường hợp phải mất một đường dẫn rất dài và mạch quanh biểu đồ mà không bao giờ chấm dứt. Độ dài của đường dẫn luôn bị giới hạn, vì vậy chúng tôi không bao giờ kết thúc việc khám phá các nhánh không cần thiết.

Lý do điều này khác với BFS là trong BFS, bạn phải giữ tất cả các nút rìa trong bộ nhớ cùng một lúc. Điều này có bộ nhớ O (b d), trong đó b là hệ số phân nhánh. So sánh điều này với việc sử dụng bộ nhớ O (d) từ làm sâu lặp lại (để giữ trạng thái cho mỗi nút d trong đường dẫn hiện tại). Tất nhiên, BFS không bao giờ khám phá cùng một đường dẫn nhiều lần, trong khi làm sâu lặp lại có thể khám phá bất kỳ đường dẫn nào nhiều lần vì nó làm tăng giới hạn độ sâu.Tuy nhiên, tiệm cận hai có cùng thời gian chạy. BFS kết thúc bằng O (b d) các bước sau khi xem xét tất cả các nút O (b d) ở khoảng cách d. Độ sâu lặp đi lặp lại sử dụng O (b d) thời gian cho mỗi cấp độ, tổng lên tới tổng thể O (b d), nhưng với một hệ số không đổi cao hơn.

Nói tóm lại:

  • DFS không được bảo đảm để tìm một con đường tối ưu; lặp lại sâu sắc là.
  • DFS có thể khám phá toàn bộ biểu đồ trước khi tìm nút đích; làm sâu lặp đi lặp lại chỉ thực hiện điều này nếu khoảng cách giữa nút bắt đầu và nút kết thúc là mức tối đa trong biểu đồ.
  • BFS và làm sâu lặp lại cả hai chạy trong O (b d), nhưng làm sâu lặp lại có hệ số cố định cao hơn.
  • BFS sử dụng bộ nhớ O (b d), trong khi làm sâu lặp lại chỉ sử dụng O (d).

Hope this helps!

+1

Cảm ơn bạn! Tôi đã bỏ lỡ khái niệm rằng làm sâu sắc lặp đi lặp lại sẽ xem xét TẤT CẢ các đường dẫn của chiều dài x. – bb2

+4

Một điểm nhỏ là mặc dù IDDFS thực hiện mở rộng nút nhiều hơn, nó thậm chí có thể nhanh hơn BFS vì sử dụng ít bộ nhớ hơn có nghĩa là địa phương và bộ nhớ cache kết hợp tốt hơn. –

+0

Cảm ơn câu trả lời chi tiết này. Nhưng sẽ không làm sâu sắc lặp đi lặp lại chỉ được tối ưu nếu chi phí liên quan đến mỗi con đường là như nhau. Và do đó không tối ưu khi chi phí khác nhau? Trong trường hợp đó, có một thuật toán liên quan đến việc làm sâu lặp đi lặp lại luôn luôn tối ưu? Ví dụ, đối với BFS, chúng tôi đã tìm kiếm chi phí đồng nhất. –

2

Có một trang phù hợp trên wikipedia về điều này.

Ý tưởng cơ bản mà tôi cho rằng bạn đã bỏ lỡ là việc làm sâu lặp lại chủ yếu là số heuristic. Khi một giải pháp có khả năng được tìm thấy gần với gốc làm sâu sắc lặp đi lặp lại sẽ tìm thấy nó tương đối nhanh trong khi tìm kiếm chiều sâu thẳng đứng đầu tiên có thể đưa ra quyết định "sai" và dành nhiều thời gian cho một nhánh sâu không kết quả.

(Điều này đặc biệt quan trọng khi cây tìm kiếm có thể vô hạn. Trong trường hợp này, họ thậm chí còn ít tương đương từ DFS có thể gặp khó khăn mãi mãi trong khi BFS hoặc chiều sâu lặp đi lặp lại chắc chắn sẽ tìm ra câu trả lời một ngày nào đó nếu nó tồn tại)

1

Chỉ cần thêm những gì đã có ở đây, nhưng đây là một số video từ Phòng thí nghiệm di chuyển của trường đại học Denver cho thấy sự khác biệt.

http://movingai.com/dfid.html

Bạn có thể thấy trong các ví dụ của họ lặp đi lặp lại chiến thắng sâu sắc khi mục tiêu là nông cạn (giải pháp chiều sâu 3, độ sâu cây) và các giải pháp là phải, nhưng DFS thắng không có vấn đề gì nếu dung dịch ở hàng cuối cùng.

Tôi đã đọc phần này về lập trình cờ, tiếp theo là tôi nghĩ về việc quiescence search kiểm tra xem bạn có muốn biết thêm về chiến lược tìm kiếm cho lập trình AI không.

Các vấn đề liên quan