Hãy để tôi xem nếu tôi hiểu đúng, các khối được đánh dấu màu đỏ, có màu xanh và thuật toán tìm thấy hình chữ T và đánh dấu chúng màu đỏ, điều đó có đúng không? Mục tiêu của bạn là tìm ra càng nhiều hình chữ T càng tốt với các khối cùng màu, chính xác cho đến nay tôi hy vọng. Hiện tại bạn đánh dấu chúng một khi bạn tìm thấy chúng và điều đó làm giảm tính hữu dụng của thuật toán (Vì bạn có thể thiếu giải pháp tối ưu). Bạn đang lên kế hoạch tìm kiếm tất cả các hình dạng và sau đó chọn hình nào sẽ sử dụng và hình nào không sử dụng. Tôi có đúng cho đến nay? Vì bạn muốn tối đa hóa số lượng khối được chứa bên trong hình chữ T khi thuật toán được thực hiện.
Nếu tôi đúng sau đây là giải pháp tối ưu cho tình huống của bạn theo ý kiến của tôi.
Chúng tôi sẽ sử dụng lập trình tuyến tính Integer.
Tôi tin rằng tôi đã sử dụng cái này trong quá khứ:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Bạn có thể làm cho nó hoạt động với nhiều ngôn ngữ, tôi đã sử dụng nó với PHP, Java và C)
Những gì chúng ta sẽ làm là đăng ký mọi hình dạng T có thể có trên bảng và sau đó sử dụng ILP để tối đa hóa số lượng khối được bảo hiểm. ILP phức tạp theo cấp số nhân. Xem xét kích thước của bảng của bạn, đó sẽ không phải là một vấn đề. Tôi đã chạy các câu hỏi tối thiểu / tối thiểu phức tạp hơn nhiều trên các biểu đồ với ILP và chỉ mất một phần giây để hoàn thành và tối đa 30-90 giây với hàng trăm đỉnh (trong trường hợp của bạn, nó rơi vào một phần của giây).
Những gì tôi muốn giới thiệu để làm:
- Tìm tất cả các hình dạng đường có thể
- Tìm tất cả các giao điểm giữa các hình dạng đường cùng màu
- Tìm tất cả các hình dạng T có thể, tìm kiếm tất cả các giao lộ.
- Xác định một biến Boolean trong Bài toán tuyến tính cho mỗi hình dạng T (
0 <= Bi <= 1
) Vì các giá trị là số nguyên, để lại 0 hoặc 1.
- Tạo điều kiện cho mỗi cặp hình chữ T cắt nhau (
Bi + Bj <= 1
)
- Hàm mục tiêu sẽ là (tổng các khối trong Hình dạng "T" (i) * Bi)
- Chạy bộ giải và làm tối các hình dạng T trong đó Boolean (s) tương ứng của bộ giải trong đó 1 trong giải pháp tối ưu.
Đây là kiến thức có giá trị, tôi thường sử dụng bộ giải tuyến tính cho các dự án công việc.
ILP về cơ bản là một cách để giải quyết các vấn đề lựa chọn trong đó bạn muốn đạt được mức tối đa hoặc tối thiểu cho một số hàm tuyến tính.
Bạn có thể đọc thêm ở đây, sử dụng Lập trình tuyến tính Integer và Lập trình tuyến tính là giống nhau đối với người lập trình, chỉ có điều Integer phức tạp hơn nhiều đối với máy tính có thể dẫn đến thời gian chạy dài. Không phải trong trường hợp của bạn, nó rất đơn giản và chỉ mất ít hơn một phần nghìn giây trong trường hợp xấu nhất.
Tôi đoán bạn có thể đọc thêm ở đây:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Điều này giải thích nó tốt:
http://fisher.osu.edu/~croxton_4/tutorial/
Nó về cơ bản là một người giải quyết vấn đề quyết định, làm thế nào để đưa ra quyết định tối đa hóa kết quả bạn muốn. Điều này giả định hàm đánh giá kết quả là tuyến tính trong trường hợp hiện tại cụ thể của bạn. Hàm đánh giá kết quả trong trường hợp này, tổng hợp các khối cho tất cả các hình dạng T mà bạn quyết định làm tối.
Về mặt toán học, cách đặt các biến: trong trường hợp hiện tại của chúng tôi Booleans (Tôi có làm tối hình dạng T với chỉ số i hay không) thành các giá trị tối ưu để tối đa hóa kết quả mà chúng tôi muốn: làm tối càng nhiều khối càng tốt mà không làm tối các hình chữ T giao nhau. Miễn là kết quả bạn muốn có thể được tính bằng hàm tuyến tính khi bạn có tất cả các biến được đặt, nó sẽ giải quyết nó. Trong trường hợp của chúng tôi, chúng tôi kiểm tra hình chữ T nào chúng tôi làm tối và tính tổng các khối mà chúng bao phủ.
Tôi biết điều này không tầm thường nên nếu bạn chọn thực hiện bước nhảy vọt, hãy bình luận và tôi sẽ giải thích.