给定M个多边形,每个多边形具有权重w_i,写出一个输出N个多边形的快速算法,使得: - 没有两个多边形相交 - \ sum w_i最大化
当输入多边形是轴对齐的矩形时,是否可以进行任何优化?非轴对齐矩形?
添加一些参考文献:
1. Label Placement by Maximum Independent Set in Rectangles
2. Maximum Independent Set of Rectangles
3. Finding maximum non-overlapping intervals in 1 dimension
答案 0 :(得分:2)
您可以将此问题作为图表来解决。图形节点是您的多边形,图形边缘表示"没有交叉点" - 那么你的问题就变成了最大团体问题。请参阅图here中关于派系的一般性讨论。您可以搜索"最大权重集团算法"同样。
谈论实用的方法 - 您可以尝试Boost Graph Library,它包含列出图表中所有派系的算法。
当然,这种方法要求您预先计算所有成对交叉点 。因此,问题正在减少到另一个 - 给定一组多边形,找到一种快速的方法来计算一个非交叉的"矩阵。我想,这个可以通过飞机扫地来解决。
答案 1 :(得分:0)
假设正权重,则仅考虑非相交多边形的最大子集(如果从最大子集中移除元素,则总和减少)。
您可以尝试增量方法:假设对于M个第一个多边形,您已找到非相交多边形的所有最大子集。再考虑一个多边形。您将通过考虑所有可用的子集并从中丢弃与新的子集相交的所有多边形来形成新的最大非相交子集。
示例:A,B,C,D。A和B相交,A和C相交。
从{A}开始。
添加B.表格{A,A U B}。从A B中丢弃A.您保留{A,B}。
添加C.表格{A,B,A U C,B U C}。从A U C中丢弃A并在B U C中吸收B.保留{A,B U C}。
添加D.形式{A,B U C,A U D,B U C U D}。你在B U C U D中吸收B U C并保持{A U D,B U C U D}。
解决方案是具有最大总和的最大子集。
最好通过穷举搜索(O(N ^ 2)交叉计算)或更有效的方法(可能低至O(N.Lg(N)+ K)交叉计算)预先计算交叉点。 / p>
但子集的构造可能是多边形数量的指数:(我不知道。
动态方法也可能允许您先前删除某些子集(按特定顺序处理多边形,例如通过增加或减少交叉点的数量?)。