Tạo các khu vực có kích thước bằng nhau trong đa giác


8

Tôi đang tìm kiếm một logic mã giả sẽ tìm thấy ncác khu vực có kích thước bằng nhau trong một đa giác nhất định. Không có không gian nên ở giữa hoặc bên ngoài các khu vực phù hợp. Trận đấu hợp lệ đầu tiên của khu vực nên được trả lại.

Giả sử sau đa giác [2,2, 3,1, 5,1, 5,4, 4,5, 2,3]làm đầu vào:

nhập mô tả hình ảnh ở đây

... và 3như một tham số, đầu ra hợp lệ có thể là [ [2,2, 3,2, 3,3, 4,3, 4,5, 2,3], [2,2, 3,1, 5,1, 4,2, 4,3, 3,3, 3,2], [4,5, 4,2, 5,1, 5,4] ]:

nhập mô tả hình ảnh ở đây

Một đầu ra hợp lệ khác với tham số 3[ [3,4, 3,3, 4,3, 4,2, 3,2, 3,1, 2,2, 2,3], [4,3, 4,2, 3,2, 3,1, 5,1, 5,3], [3,4, 3,3, 5,3, 5,4, 4,5] ]:

nhập mô tả hình ảnh ở đây

Xin lưu ý rằng các khu vực không phải chia sẻ cùng một điểm trung tâm. Một hoặc nhiều khu vực có thể xảy ra rơi ngay giữa các khu vực khác trong đa giác.

Đây là một ví dụ khác về đầu vào / đầu ra mẫu.

Giả sử sau đa giác [1,3, 1,1, 7,1, 7,2, 8,2, 8,3, 5,6, 4,6]làm đầu vào:

nhập mô tả hình ảnh ở đây

.. và 5như một tham số, đầu ra hợp lệ có thể là [ [1,3, 1,1, 3,1, 3,2, 4,3, 3,4, 3,3], [3,2, 3,1, 7,1, 7,2, 6,2, 6,3, 5,3, 5,2], [6,2, 8,2, 8,3, 6,5, 5,5, 5,4, 6,4], [1,3, 3,3, 3,4, 5,5, 6,4, 6,5, 7,5, 6,6, 5,6], [3,4, 4,3, 3,2, 5,2, 5,3, 6,3, 6,4, 5,4, 4,5] ]:

nhập mô tả hình ảnh ở đây

Các giả định sau đây được đưa ra:

  • hướng của tất cả các biên giới chia hết cho 45

  • tọa độ nguyên được sử dụng cho tất cả các đa giác

  • diện tích nguyên của đa giác đầu vào luôn chia hết cho n

  • tất cả các đa giác có thể là lồi hoặc lõm những

  • có thể giải được, có nghĩa là ncác khu vực có thể phù hợp với đa giác đã cho


1
Chia sẻ nghiên cứu của bạn giúp mọi người . Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

Bạn có nghĩa là các khu vực "có kích thước bằng nhau", không "phân bổ đều", tôi đoán?
Doc Brown

@DocBrown bạn rất đúng, tôi biết tôi sẽ nhận được một cái gì đó sai ở đây. Tôi chắc chắn có nghĩa là kích thước như nhau. Đã sửa lỗi
Serge Lukin

Các đa giác đầu vào của bạn luôn luôn lồi, như trong ví dụ của bạn?
Doc Brown

@DocBrown Bất kỳ định dạng nào cũng sẽ hoạt động thực sự, tôi chỉ chọn định dạng này vì tôi thấy nó ở đâu đó và đoán nó là định dạng chính, nhưng tôi rất thích được sửa.
Sergey Lukin

Câu trả lời:


6

Không thể giải quyết được. Tôi đã thử một số phương pháp cho đến khi tôi nhận ra nó không thể được thực hiện.

Giả sử một hình có diện tích 4, nên chia thành 2 phần với mỗi phần 2:

hình vuông

Tam giác và hình vuông ngoài cùng bên trái phải là một phần của hình 1, nhưng nó cần một hình tam giác khác. Nơi duy nhất có thể được lấy từ hình vuông bên phải, nhưng phần còn lại được chia thành hai khu vực.


2
Không thể giải quyết được nói chung tất nhiên, nhưng tôi đoán OP có thể quan tâm đến một thuật toán mà giải quyết vấn đề cho mỗi trường hợp nó có thể được giải quyết, và nếu không kết quả đầu ra rằng nó không thể được giải quyết ;-) Gave cho bạn một phiếu bầu tán thành, một trong hai.
Doc Brown

Nắm bắt tốt. Tôi đã không nghĩ về nó. Chúng ta có thể thêm một giả định rằng khu vực đó hợp lệ miễn là nó bao gồm các tọa độ đường dẫn không bị chặn bởi các khu vực khác, điều này sẽ dẫn đến việc [ [0,1, 2,1, 2,2, 3,2, 2,3, 2,2 1,2], [2,2, 2,0, 3,0, 3,2] ] chấp nhận thực tế là một ngoại lệ được ném trong trường hợp hàm lặp trên tất cả các biến thể và không tìm thấy que diêm. Bạn nghĩ sao?
Serge Lukin

Để đơn giản, tôi đã thêm một giả định rằng chỉ các biến thể có thể giải được của đa giác và số lượng các khu vực được chuyển qua làm đầu vào. Xem chỉnh sửa của tôi. Cảm ơn bạn
Serge Lukin

6

Như tôi đã nói trong nhận xét của mình với câu trả lời của Doc Browns (nếu không xuất sắc), có một sự lựa chọn về phép chia vuông-> tam giác khiến cho việc thiết lập thuật toán hơi khó hơn một chút. Ngoài ra, bạn không cần phải làm cho nó một cách thanh thản, nhưng có thể làm điều đó song song, như một số gợi ý của tôi cho thấy.

Tôi đã thực hiện một số cách tiếp cận heuristic lúc đầu.

Voronoi: Chọn N điểm (tọa độ không nguyên) trong hình dạng, tạo bản đồ voronoi. Hãy để các điểm thu hút và đẩy nhau đối với khu vực của họ (thu hút quá lớn, đẩy lùi quá nhỏ).

Hữu ích cho A / N lớn, dễ rơi vào cực đại cục bộ.

Phương pháp vòng tròn: Mục tiêu là loại bỏ các khu vực có vấn đề, và sau đó tiếp tục sử dụng phương pháp khác.

Chọn một điểm (không nguyên) trong phần bên trong và bán kính r. Phần bên trong trừ đi vòng tròn sẽ tạo ra k tiểu vùng bị ngắt kết nối. Nếu bất kỳ tiểu vùng nào có kích thước A / n, hãy loại bỏ nó. Ngoài ra, nếu có 2 * A / n, bạn có thể dễ dàng tách nó ra và loại bỏ chúng. Hạ thấp bán kính một chút và tiếp tục (có thể sử dụng một số tìm kiếm nhị phân).

Tăng trưởng điểm có vấn đề: Bắt đầu sử dụng phương pháp Doc Brown đề cập, nhưng vì có hai lựa chọn ở hầu hết các cạnh, hãy bỏ qua biểu đồ và phát triển từng vùng trên đường viền để tạo ra càng ít điểm có vấn đề mới càng tốt (chỉ có điểm có vấn đề = hình tam giác chia sẻ một cạnh với phần còn lại của hình dạng). Ví dụ: khi chọn hàng xóm mới để thêm vào, hãy thêm chúng theo thứ tự lồi (lõm = lồi âm)

Tăng trưởng ruy băng: Đối với các khu vực gần như lồi hoặc lồi. Chọn một điểm trên cạnh bên ngoài, tạo một dải ruy băng đơn vị theo cạnh bên ngoài cho đến khi nó có độ dài phù hợp, đảm bảo không bao giờ tạo điểm ngắt kết nối mới. Nếu cần thiết, bỏ qua các hình tam giác cuối cùng và làm cho nó phát triển một chút về chiều rộng. Để dải băng tiếp theo theo nơi kết thúc cuối cùng cho đến khi khu vực cuối cùng có kích thước phù hợp.

Giống như trò chơi hoặc hữu cơ: Tạo N "quốc gia". Đặt chúng vào những điểm ngẫu nhiên. Hãy để chúng phát triển hữu cơ. Khi họ gặp nhau, người có diện tích nhỏ nhất hiện tại là mạnh nhất và chiến thắng tam giác. Có lẽ dễ bị cực đại địa phương?


3

Chiến lược chung là loại bỏ phần A / n đầu tiên khỏi đa giác P0 của bạn (trong đó A là tổng diện tích), để lại cho bạn một đa giác mới P1 của khu vực AA / n. Sau đó lặp lại điều này tạo ra một đa giác P2, rồi P3 và sau n lần lặp lại, bạn có giải pháp của mình. Lưu ý rằng ở mỗi bước bạn có thể tìm thấy một phần mới như vậy trong đó các phần còn lại vẫn tạo thành một đa giác được kết nối, trong đó bạn phải quay lại một bước và cố gắng tìm một phần khác hoặc dừng thuật toán mà không có kết quả .

Để tạo một mảnh có kích thước A / n như vậy, hãy bắt đầu bằng cách chia đa giác của bạn thành "các mảnh lưới". Bất kỳ ô vuông nào bên trong đa giác đều tạo thành một mảnh như vậy, cũng như bất kỳ nửa hình vuông nào có hình tam giác trong đó đường viền của đa giác chia hình vuông thành hai nửa. Bạn có thể sử dụng phép thử đa giác điểm cho việc này, lặp lại trên tất cả các nửa hình vuông bên trong hộp giới hạn của đa giác và kiểm tra xem điểm giữa của chúng có nằm trong đa giác đã cho không (nếu cả hai nửa hình vuông được chứa, người ta có thể sử dụng thay vì hình vuông đầy đủ). Tiếp theo, bạn tạo một đồ thị phẳng, trong đó mỗi phần xác định một đỉnh (với "diện tích" hoặc "trọng lượng" là 1 hoặc 1/2). Các cạnh của đồ thị được đưa ra bởi các mảnh hàng xóm. Điều này làm giảm vấn đề hình học của bạn thành vấn đề đồ thị, trong đó bạn đang tìm kiếm một biểu đồ con được kết nối với các đỉnh có tổng trọng số A / n và biểu đồ còn lại vẫn được kết nối .

Vấn đề thứ hai có thể được giải quyết bằng cách quay lạitiếp cận. Bắt đầu với một đỉnh có thể được loại bỏ khỏi biểu đồ mà không làm cho nó không được kết nối. Bạn có thể chọn ngẫu nhiên các đỉnh, nếu bạn thích hoặc xáo trộn danh sách tất cả các đỉnh một lần ngẫu nhiên, để sử dụng lại trong các bước sau. Bây giờ hãy thử tìm một đỉnh thứ hai được kết nối với đỉnh thứ nhất, có thể được loại bỏ khỏi biểu đồ còn lại mà không phá hủy kết nối của nó. Nếu có nhiều khả năng, chọn một cách ngẫu nhiên. Đối với các đỉnh biểu thị một hình vuông, bạn cũng có thể cho phép một hoạt động biểu đồ trong đó bạn chia hình vuông thành hai hình tam giác (điều này tạo ra các đỉnh mới có trọng lượng 1/2) bằng một hoặc cách khác có thể. Điều này chỉ phức tạp hơn một chút so với việc chỉ di chuyển một đỉnh từ biểu đồ ban đầu sang biểu đồ con, nhưng nó không quá khó khăn.

Lặp lại điều đó cho đến khi sơ đồ con của bạn đạt tổng trọng lượng A / n hoặc bạn không tìm thấy một đỉnh khác. Nếu đó là trường hợp, "quay lại" một cấp và thử một đỉnh khác trước.

Có một số cách để tối ưu hóa điều này, ví dụ, bạn phải chọn kiểm tra kết nối nhanh cho biểu đồ. Tôi đoán bạn sẽ tìm thấy rất nhiều thuật toán cho vấn đề phụ này, sử dụng Google hoặc bắt đầu ở đây . Có thể đáng để tìm kiếm một thuật toán có thể nhanh chóng xác minh nếu đồ thị được kết nối vẫn được kết nối khi một đỉnh bị xóa.

Hi vọng điêu nay co ich.


Điều này nghe chính xác những gì tôi cần. Tôi đã hình dung chiến lược này trên lý thuyết và tất cả đều có ý nghĩa đối với tôi cho đến nay, giờ là lúc để tôi áp dụng nó vào thực tế. Tôi sẽ báo cáo lại khi tôi có thứ gì đó để trình bày. Cảm ơn bạn rất nhiều!
Serge Lukin

Tôi nghĩ rằng có một vấn đề nhỏ với phương pháp này. Đối với mỗi hình vuông, có hai lựa chọn có thể là hình tam giác. Để thực sự kiểm tra tất cả chúng và đảm bảo một giải pháp trong trường hợp có một, tôi đoán bạn cần phải làm điều đó cho tất cả 2 ^ n lựa chọn.
NiklasJ

@NiklasJ: bạn đã đúng, hãy xem câu trả lời được cải thiện của tôi có tính đến điều này.
Doc Brown

@SergeyLukin: Tôi đã thay đổi câu trả lời của mình một chút để đưa nhận xét của NiklasJ vào tài khoản.
Doc Brown
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.