Một số heuristic hiệu quả để tìm số lượng đường dẫn Hamilton trong một lưới hình chữ nhật là gì?


8

Một vấn đề lập trình cụ thể mà tôi đã gặp gần đây đã làm giảm việc tìm các đường hamiltonian trong một lưới hình chữ nhật trông giống như,

A  0  0  0

0  0  0  0

0  0  C  D

Một số phương pháp phỏng đoán hiệu quả có thể được áp dụng để tìm ra chúng - và đặc biệt, các kỹ thuật để cắt / loại bỏ các đường dẫn trên đường đi là gì?

Chỉnh sửa: Chỉ cần làm rõ, các cạnh được hình thành khi các yếu tố được kết nối theo chiều ngang và chiều dọc, nhưng không theo đường chéo. Vấn đề cũng nêu rõ rằng bất kỳ phần tử nào được đánh dấu 0 đều có thể được sử dụng để tạo thành một đường dẫn, nhưng các phần tử khác 0 là "chướng ngại vật" cần phải tránh.

A-0-0-0
      |
0-0-0-0
|
0-0-C D

có thể là một con đường chẳng hạn. Một cái khác có thể là,

A 0-0-0
| |   |
0 0 0-0
| | |
0-0 C D

2
Đó là các cạnh trong ví dụ của bạn?
Alexandru

1
Có phải cơ hội này đến từ trang thử thách việc làm của Quora? quora.com/challenges
majelbstoat

Câu trả lời:


3

Tôi không thấy một cách dễ dàng để đếm mà không liệt kê. Bạn có thể dễ dàng truy cập tất cả các con đường hamiltonian với một tìm kiếm sâu đầu tiên tuyệt vời với quay lui. Bạn thực sự có thể gian lận một chút, và nhận ra rằng, nếu N là số đường hamiltonian bắt đầu bằng cách đi sang phải, tổng số đường dẫn hamiltonian là 2N (do tính đối xứng nếu là lưới). Điều này không mở rộng tất cả (đối với một số đỉnh không phải tất cả các đường dẫn sẽ dẫn đến cùng một số chu kỳ, nhưng bạn có thể dễ dàng giới hạn số lượng đường hamiltonian với một đối số tương tự (với phần thưởng mà bạn có thể giải quyết chính xác các phần của nó để cải thiện ràng buộc của bạn với các đối số đối xứng). Đây là chiến lược tôi chọn.

Nhưng nếu bạn không muốn điều này, một số heuristic chung:

  • Bạn cũng có thể dễ dàng giới hạn trên số lượng đường dẫn hamiltonian là | E | chọn | V | -1 (trong đó | E | là số cạnh và | V | số đỉnh trong biểu đồ), có thể tốt hơn rất nhiều cho đồ thị thưa so với | V |! (ràng buộc ngây thơ cho rằng đồ thị đã hoàn thành).

  • Một cách dễ dàng để cải thiện giới hạn này là bằng cách cắt bớt các kết hợp đã biết xấu, bằng cách không xem xét hai cạnh từ cùng một đỉnh. Vì vậy, bạn sẽ nhận được một cái gì đó như prod_v (deg_v-1) (tôi vẫn nên giới hạn trên số lượng đường hamiltonian, vì tôi hiện đang đếm chu kỳ nhiều hơn một lần, tôi nghĩ vậy).


1
Điều này có thể không được cải thiện thành một loại lập trình động với khả năng ghi nhớ?
András Salamon
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.