Mathematica 295950 字节
注意:此版本仍待解决,解决了史蒂夫·梅里尔(Steve Merrill)提出的有关我较早尝试的问题。
尽管它是对第一个版本的改进,但是它找不到要寻找圆形而不是六角形整体形状的最密集的手柄配置。
它通过建立一个完整的内部六边形(对于n> = 6)来找到解决方案,然后检查用于完成带有其余圆的外壳的所有配置。
有趣的是,正如史蒂夫·美林(Steve Merrill)在评论中指出的那样,n+1
圆的解决方案并不总是由n个圆的解决方案组成,并添加了另一个圆。将给定的30个圆的解决方案与给定的31个圆的解决方案进行比较。(注意:有30个圈子的独特解决方案。)
m[pts_]:={Show[ConvexHullMesh[pts],Graphics[{Point/@pts,Circle[#,1/2]&/@ pts}],
ImageSize->Tiny,PlotLabel->qRow[{Length[pts]," circles"}]],
RegionMeasure[RegionBoundary[ConvexHullMesh[pts]]]};
nPoints = ((#+1)^3-#^3)&;pointsAtLevelJ[0] = {{0,0}};
pointsAtLevelJ[j_]:=RotateLeft@DeleteDuplicates@Flatten[Subdivide[#1, #2, j] &@@@
Partition[Append[(w=Table[j{Cos[k Pi/3],Sin[k Pi/3]},{k,0,5}]),
w[[1]]], 2, 1], 1];nPointsAtLevelJ[j_] := Length[pointsAtLevelJ[j]]
getNPoints[n_] := Module[{level = 0, pts = {}},While[nPoints[level]<=n,
pts=Join[pointsAtLevelJ[level],pts];level++];Join[Take[pointsAtLevelJ[level],n-Length[pts]],
pts]];ns={1,7,19,37,61,91};getLevel[n_]:=Position[Union@Append[ns,n],n][[1, 1]]-1;
getBaseN[n_] := ns[[getLevel[n]]];pack[1]=Graphics[{Point[{0,0}], Circle[{0, 0}, 1/2]},
ImageSize->Tiny];pack[n_]:=Quiet@Module[{base = getNPoints[getBaseN[n]],
outerRing = pointsAtLevelJ[getLevel[n]], ss},ss=Subsets[outerRing,{n-getBaseN[n]}];
SortBy[m[Join[base,#]]&/@ss,Last][[1]]]
一些检查需要对单个值n(包括对称性)进行十万多个案例的比较。运行了总共34个测试用例大约花费了5分钟。不用说,采用更大的n's
暴力手段很快将变得不切实际。肯定存在更有效的方法。
每个包装右边的数字是相应的蓝色凸包的周长。以下是的输出3 < n < 35
。红色圆圈是在正六边形周围添加的圆圈。