【发布时间】:2010-10-05 14:26:44
【问题描述】:
给定 n 个半径为 r1 ... rn 的圆,将它们定位为没有圆重叠且边界圆的半径为“小”。
程序将列表 [r1, r2, ... rn] 作为输入并输出圆心。
- 我要求“小”,因为“最小”半径将其转换为更困难的问题(最小版本已被证明是 NP 硬/完整 - 请参见问题结尾附近的脚注)。我们不需要最低限度。如果圆圈形成的形状看起来相当圆形,那就足够了。
- 如果有帮助,您可以假设 Rmax/Rmin
- 低优先级问题 - 程序应该能够处理 2000 多个圈子。一开始,100-200 圈应该没问题。
- 您可能已经猜到,圆圈不需要紧紧地挤在一起,甚至不需要相互接触。
我们的目的是对给定的圆圈进行视觉上令人愉悦的排列,这些圆圈可以放在更大的圆圈内,并且不会留下太多的空白空间。 (如color blindness test picture 中的圆圈)。
您可以使用下面的 Python 代码作为起点(此代码需要 numpy 和 matplotlib - Linux 上的“sudo apt-get install numpy matplotlib”)...
import pylab
from matplotlib.patches import Circle
from random import gauss, randint
from colorsys import hsv_to_rgb
def plotCircles(circles):
# input is list of circles
# each circle is a tuple of the form (x, y, r)
ax = pylab.figure()
bx = pylab.gca()
rs = [x[2] for x in circles]
maxr = max(rs)
minr = min(rs)
hue = lambda inc: pow(float(inc - minr)/(1.02*(maxr - minr)), 3)
for circle in circles:
circ = Circle((circle[0], circle[1]), circle[2])
color = hsv_to_rgb(hue(circle[2]), 1, 1)
circ.set_color(color)
circ.set_edgecolor(color)
bx.add_patch(circ)
pylab.axis('scaled')
pylab.show()
def positionCircles(rn):
# You need rewrite this function
# As of now, this is a dummy function
# which positions the circles randomly
maxr = int(max(rn)/2)
numc = len(rn)
scale = int(pow(numc, 0.5))
maxr = scale*maxr
circles = [(randint(-maxr, maxr), randint(-maxr, maxr), r)
for r in rn]
return circles
if __name__ == '__main__':
minrad, maxrad = (3, 5)
numCircles = 400
rn = [((maxrad-minrad)*gauss(0,1) + minrad) for x in range(numCircles)]
circles = positionCircles(rn)
plotCircles(circles)
补充说明:谷歌搜索结果中常用的圈包算法不适用于此问题。
因此,另一个“圆包装算法”的问题陈述是:给定一个复数 K(在这种情况下,图称为单纯复形,或简称为复数)和适当的边界条件,计算相应圆包装的半径K....
它基本上从一个图表开始,说明哪些圆相互接触(图的顶点表示圆,边表示圆之间的接触/切线关系)。必须找到圆的半径和位置,以满足图形表示的接触关系。
另一个问题确实有一个有趣的观察(独立于这个问题):
圆包装定理 - 每个圆包装都有一个对应的平面图(这是容易/显而易见的部分),每个平面图都有一个对应的圆包装(不太明显的部分)。图和包装是对偶的,并且是唯一的。
在我们的问题中,我们没有平面图或切线关系。
这篇论文 - Robert J. Fowler、Mike Paterson、Steven L. Tanimoto:平面中的最优包装和覆盖是 NP 完全的 - 证明了这个问题的最小版本是 NP 完全的.但是,该论文无法在线获得(至少不容易获得)。
【问题讨论】:
-
不是难题...这是我在工作中一直在努力解决的问题。我有一个基本的解决方案,但我正在寻找更好的解决方案。
-
在您发表评论后,我再次查看了我的问题,但没有看到拼图部分。请让我知道问题是否以暗示它是一个不严重的难题类型问题的方式出现。我会改写它。或者,你的意思是说这对于堆栈溢出来说太难了?
-
@Greg:我认为它非常主观。你所说的谜题有些人会称之为编程相关,而另一些人会称之为数学。对于我的一个问题,我已经经历过这种类型的争论。
-
没关系,我只有一票。
-
@Greg Hewgill:他正在寻找一个 NP 难题的近似值。如果不在编程/计算机科学问答网站上,他还应该问什么??
标签: algorithm language-agnostic geometry