簡體   English   中英

包含笛卡爾表面項的算法

[英]Containing algorithm for cartesian surface items

是否有任何算法可以幫助最佳地找到最小數量的矩形,以包含遍布笛卡爾表面的一定數量的項目(每個項目是帶有x和y坐標的點)? 矩形必須與Ox軸正交並且底部段在Ox軸上,並且每個矩形的面積必須<小於給定值M.

不是一個完整的解決方案,而是問題的簡化:假設所有點P都處於一般位置並且在x坐標上排序。

然后通過找到將P分成不相交集的F垂直柵欄(形式為x >= fx )來形成解。

然后可以用軸對齊的矩形覆蓋每個集合,其中集合中的第一個和最后一個點確定矩形的寬度,並且具有最高y坐標的集合中的點確定高度,從而確定表面大小的矩形。

顯然,現在的訣竅是選擇圍欄,使圍欄的數量(以及矩形的數量)最小化,同時將所有矩形的總表面尺寸保持在允許的最大值以下。

編輯
可能將殲柵欄的問題 可以使用動態規划來解決。 這是我到目前為止所提出的:

如果是這樣,最多有| P | -1個圍欄位置; 這些可能會成為動態編程表中的列。 動態編程表中的每一行都應該表示使用額外的柵欄(記住,我們試圖找到柵欄數最少的結果)。 然后,每個單元格(X,Y)將代表在前X個可用位置上精確分配Y柵欄的最佳解決方案(就總矩形大小而言)。 但是,我在查看表格的相鄰單元格如何(或者是否)可以幫助確定特定單元格的值時遇到了一些問題。

編輯2 :忘掉這一點,我認為動態編程方法是不可能的。 這是因為我認為不可能逐步構建最優解決方案(最佳解決方案配置可能會通過添加另一個點或圍欄來完全改變)。 這也排除了一種貪婪的方法。

我能想到的唯一想法,雖然從算法的角度來看稍微不那么明顯,但是是一種隨機方法,例如用於分布柵欄的模擬退火 它並不能保證最佳解決方案,但你應該能夠得到相當接近它。

編輯3 :為了回應這篇文章中的反應,我們不一定需要最好的解決方案,而是尋求一個“非常好”的解決方案,並應用你現在正在學習的東西。

無論如何,您可能需要從左到右對所有點進行排序。

一個貪婪的解決方案可能是定義第一個矩形,使其包含最左邊的點。 接下來,展開矩形,使其包含右側的點。 繼續添加下一個點,直到矩形超過其最大大小。 在這種情況下,從一個新的矩形開始,然后再次開始添加點等。

獲得解決方案的分而治之的方法可以從覆蓋所有點的矩形開始。 顯然,這個矩形超過了最大尺寸M,因此根據一些啟發式(正好在中間,或者在兩個后續點相距最遠的點),將它垂直分割成2個較小的矩形M1和Mr。 以相同的方式遞歸地處理M1和Mr,或者再次分割矩形或者如果<= M則將找到的矩形報告為結果的一部分。

請注意,對於這兩種方法,對於某些人為的配置,結果可能是任意不好的,但一般來說解決方案應該是“好的”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM