Thuật toán: Tìm đường đi ngắn nhất qua ngục tối trong trò chơi


8

Lý lịch

Tôi đã chơi PC-Game "Darkest Dungeon" gần đây. Trong trò chơi, bạn phải khám phá các hầm ngục, bao gồm các phòng được kết nối như trong hình dưới đây. Darkest_Dungeon_Minimap

Đây là các quy tắc:

  • Bạn bắt đầu trong phòng cố định (Lối vào). Bạn không thể chọn nơi bắt đầu.
  • Mục tiêu là đến thăm mỗi phòng ít nhất một lần
  • Khoảng cách giữa các phòng liền kề là giống nhau cho tất cả các phòng.
  • Bạn có thể ghé thăm phòng và đi bộ thường xuyên như bạn muốn

Câu hỏi

Con đường ngắn nhất từ ​​lối vào thăm mỗi phòng ít nhất một lần là gì?

Câu hỏi phụ:

  • Thuật toán nào có thể được sử dụng để giải quyết vấn đề này?
  • Có triển khai miễn phí (và khá đơn giản) để sử dụng cho người như tôi không?

Những gì tôi đã cố gắng

Tôi đã tìm thấy những câu hỏi khác như thế này hay thế này mà không tìm được câu trả lời. Tôi quen thuộc với TSP (cơ bản) và có thể viết mã và giải các TSP đơn giản. Đường dẫn Hamilton không giải quyết được vấn đề của tôi, vì nó không cho phép nhiều lượt truy cập. Các vấn đề đưa thư Trung Quốc không cũng không áp dụng ở đây trong hình thức cơ bản của nó bởi vì tôi không phải đến thăm mỗi cạnh.

Cập nhật

Như tôi đã nêu trong các bình luận, tôi không phải là nhà khoa học máy tính và không quan tâm đến việc chứng minh một báo cáo toán học (có thể tôi sẽ đăng câu hỏi này lên stackoverflow ở giai đoạn sau). Ngoài ra, tôi không phải là lập trình viên và cơ hội để tôi có thể tự viết mã cho một giải pháp là khá mong manh. Nhưng tôi nghi ngờ tôi không phải là người đầu tiên xử lý một vấn đề thuộc về bản chất đó.

Theo @Shreesh và @Dib, quy trình sau đây có thể được áp dụng:

  1. Tạo một ma trận khoảng cách cặp với tất cả các phòng, do đó thêm các cạnh giữa tất cả các phòng.
  2. Giải quyết TSP bằng cách sử dụng một bộ giải tiêu chuẩn (ví dụ: concorde)
  3. Bắt đầu từ Lối vào, tham quan tất cả các phòng theo giải pháp. Đối với các phòng không liền kề, thay thế khoảng cách ngắn nhất giữa các phòng đó.

Thủ tục này sẽ cung cấp câu trả lời cho vấn đề?


6
Vấn đề của bạn dường như là một trường hợp đặc biệt của TSP. Trong nhiều trường hợp đặc biệt, bạn có thể làm tốt hơn trường hợp chung. Bạn đã nhìn vào hướng này?
Yuval Filmus

@YuvalFilmus Cảm ơn bình luận của bạn. Tôi đã cố gắng googling câu hỏi này nhưng không thể tìm thấy một giải pháp thẳng. Vì tôi không phải là nhà khoa học máy tính, các bài báo học thuật hầu hết vượt quá mức hiểu biết của tôi. Tôi hy vọng rằng biến thể TSP này là nổi tiếng và có lẽ một giải pháp đã tồn tại. Tôi có thể sẽ yêu cầu người điều hành chuyển câu hỏi này sang stackoverflow ở giai đoạn sau. Cảm ơn một lần nữa vì sự giúp đỡ của bạn.
COOLSerdash

Cảm ơn tất cả các ý kiến, COOLSerdash. Tôi nghĩ sẽ hữu ích khi chỉnh sửa câu hỏi của bạn để bao gồm tất cả thông tin bạn đã cung cấp trong các nhận xét, ở dạng tóm tắt.
DW

1
Có thể dễ dàng có nhiều hơn một "con đường ngắn nhất từ ​​... ít nhất một lần", nhưng 1.2.3. sẽ cung cấp một "con đường ngắn nhất từ ... ít nhất một lần".

Câu trả lời:


3

Vấn đề nhân viên bán hàng du lịch, ngay cả khi bạn cho phép lặp lại các nút là NP-hard. Xem Độ phức tạp tính toán của TSP .

Umans và Lenhart hiển thị kết quả độ cứng cho Đồ thị Hamilton trong Đồ thị Lưới Rắn, 1997 .

TSP cho trường hợp Euclid (hoặc đồ thị có bất đẳng thức tam giác) cũng ngụ ý độ cứng NP của TSP với sự lặp lại nút. TSP thậm chí cho khoảng cách manhattanL1 (hoặc là L) số liệu là NP-hoàn thành. Xem bài viết gốc của Papadimitriou về chủ đề này .

Bạn có thể chứng minh độ cứng NP của TSP cho trường hợp của bạn bằng cách thêm cung vào các nút có khoảng cách tương ứng là độ dài của đường đi ngắn nhất giữa các nút sẽ mô phỏng sự lặp lại của các nút. TSP cho trường hợp đặc biệt của bạn trông giống như một vấn đề hoàn chỉnh NP.

Vì vậy, hãy viết một nhánh hàm mũ và thuật toán ràng buộc đủ tốt (thuật toán heuristic) để tính toán một chuyến tham quan ngắn nhất (có thể không hiệu quả, nếu đồ thị của bạn nhỏ), hoặc quên tối ưu hóa và tính xấp xỉ đủ tốt.


Cảm ơn câu trả lời của bạn, Shreesh. Thật không may, tôi không phải là nhà khoa học máy tính và không quan tâm đến việc chứng minh một báo cáo toán học (có thể tôi sẽ đăng câu hỏi này lên stackoverflow ở giai đoạn sau). Ngoài ra, tôi không phải là lập trình viên và cơ hội để tôi có thể tự viết mã cho một giải pháp là khá mong manh. Nhưng tôi nghi ngờ tôi không phải là người đầu tiên xử lý một vấn đề thuộc về bản chất đó. Cảm ơn một lần nữa.
COOLSerdash

Một cách dễ dàng để làm điều này là thêm nC2các cạnh tương ứng với các đường dẫn ngắn nhất và sau đó giải TSP bằng bất kỳ thuật toán hiện có nào. Như bạn đã biết Concorde, nó sẽ dễ dàng.
Shreesh

1
Chúng tôi có một biểu đồ lưới với trọng lượng đơn vị ở đây. Là nghi ngờ rằng vấn đề là nhiều dễ dàng hơn thậm chí TSP Euclide. (cc @COOLSerdash)
Raphael

Không, nếu lưới thưa thớt, về cơ bản chúng ta có TSP với các đỉnh tại các điểm hợp lý và L1Hệ mét. Tuy nhiên, nếu Lưới của bạn dày đặc, tức là về cơ bản bạn phải truy cập gần như mọi điểm của lưới, không, bạn truy cập vào mọi điểm của lưới, thì có một điều rất tốt ~n2con đường. Xem ở đâyở đây .
Shreesh

2

Bạn có thể coi vấn đề này giống như một vấn đề lập kế hoạch bảo hiểm đường dẫn đã sửa đổi mà bạn có thể giải quyết trong một vài bước đơn giản:

1) Xây dựng một đồ thị vô hướng không có trọng số từ các phòng lưới, các đường nối là các nút và cạnh các đường dẫn giữa các nút đó.

2) Tìm cây bao trùm tối thiểu từ điểm bắt đầu của bạn bằng cách sử dụng tìm kiếm sâu đầu tiên.

3) "Chia nhỏ" lưới bên dưới để cây bao trùm tối thiểu của bạn tạo ra hai "làn".

4) Từ điểm bắt đầu của bạn đi theo chiều kim đồng hồ trong làn bên phải từ nút này sang nút khác cho đến khi bạn quay lại điểm bắt đầu trong làn đường bổ sung.

Điều này sẽ cung cấp cho bạn một chuyến tham quan tối thiểu các phòng, theo thời gian tỷ lệ thuận với số lượng gạch trong ngục tối, và về cơ bản là thuật toán lập kế hoạch đường đi của Spanning Tree Coan áp dụng cho cài đặt giảm. (Cf. "Xoắn ốc-stc: thuật toán bao phủ trực tuyến của môi trường lưới bởi một robot di động")


Bạn có thể giải thích ý nghĩa của việc chia nhỏ lưới? Điều gì xảy ra nếu đồ thị của tôi không nằm trên lưới? tức là imgur.com/a/KlnPO
jdelman

1

Ngoài câu trả lời trên, tôi sẽ chỉ ra một số bộ giải TSP đã có sẵn.

  1. Bộ giải TSP
  2. Người giải TSP được cung cấp bởi Đại học Stony Brooks
  3. Trình giải TSP sử dụng Google Direction API
  4. Và nhiều hơn nữa .

Cảm ơn câu trả lời của bạn. Nhưng như tôi đã nói, tôi đã biết cách giải quyết TSP bằng cách sử dụng concorde. Vì vấn đề của tôi không phù hợp trực tiếp với TSP ban đầu, hiện tại tôi không biết điều đó sẽ giúp tôi như thế nào.
COOLSerdash

Con đường ngắn nhất sẽ là con đường ghé thăm mỗi phòng chính xác một lần. Bây giờ bằng cách thêm các nút bổ sung, bạn có thể giảm vấn đề của mình thành vấn đề TSP mà câu trả lời sẽ trực tiếp đưa ra câu trả lời cho câu hỏi của bạn.
Dib
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.