Algorithm 单位立方体的边长,给定需要使用N个单位立方体来平铺/填充给定尺寸的3D空间

Algorithm 单位立方体的边长,给定需要使用N个单位立方体来平铺/填充给定尺寸的3D空间,algorithm,math,tiling,Algorithm,Math,Tiling,一个具有矩形棱镜三维空间,例如{xmin,xmax},{ymin,ymax},{zmin,zmax}。目标是使用最多N个立方体的预定义“网格”最大限度地平铺三维空间。如果N个立方体不能均匀地平铺到空间中,则它将使用不超过N个立方体。注:立方体位于立方体中心点(即,它是一个网格),而不是立方体边缘 例如,在N=30和{0,3},{0,3},{0,3}的简单情况下。正确的答案是使用边长为1的立方体,在这种情况下,27个立方体将在3行3列3个堆栈中使用 在N=1000和{0,100},{0,0},{0

一个具有矩形棱镜三维空间,例如{xmin,xmax},{ymin,ymax},{zmin,zmax}。目标是使用最多N个立方体的预定义“网格”最大限度地平铺三维空间。如果N个立方体不能均匀地平铺到空间中,则它将使用不超过N个立方体。注:立方体位于立方体中心点(即,它是一个网格),而不是立方体边缘

例如,在N=30和{0,3},{0,3},{0,3}的简单情况下。正确的答案是使用边长为1的立方体,在这种情况下,27个立方体将在3行3列3个堆栈中使用

在N=1000和{0,100},{0,0},{0,50}的更困难的情况下,显然y维只使用一行立方体(它不能再使用了),因此z和x维必须使用按2:1的比率排列的1000个立方体。100/L*50/L=1000。因此,边长可能在2.2361左右,因为22 x 1 x 45=990是最接近1000的距离(或者,我们已经最小化了无法用立方体中心覆盖的面积)。当然,边必须是立方体的整数


我正试图建立一个方程组来解决这个问题,但我有一种奇怪的感觉,这是一个满足(最小化)问题,因此需要一些迭代。。。下面是对方程组的一次尝试:

L, xe, ye, ze ∊ Positive Reals
N, x, y, z ∊ Natural Numbers
x*y*z ≤ N
(x-1)*L ≤ xe
(y-1)*L ≤ ye
(z-1)*L ≤ ze
x,y,z ≥ 1
L = min(i) { (xe*ye*ze) - ((x-1)*i*(y-1)*i*(z-1)*i) }
我这样做是为了它是x-1,y-1等等,这意味着它们可以超出宽度,精确地,最多1个立方体大小。我无法决定在所有维度中这样做是否正确,或者指定它必须在最多一个维度(最小的维度?)中向外延伸。

总体思路 这里的直觉是,每个方向上立方体的数量将与该方向上空间的大小成正比,因为立方体是规则的。另一个提示是,“每个方向上有多少个立方体”问题的解决方案只取决于大小之间的比率,而不取决于它们的实际值:如果用相同的膨胀因子乘以每个维度,则解决方案仍然相同

简化问题 假设您的空间大小为
dx、dy、dz
,均为非零,并且您希望使用最多
N
个立方体

让我们将我们的限制表述为:

查找Nx、Ny、Nz、L,以便
-Nx*Ny*Nz≤ N
-Nx*L≤ dx
-纽约*L≤ dy
-新西兰*L≤ dz
最小化“丢失的音量”:
(dx*dy*dz-L^3*Nx*Ny*Nz)

您可能希望最大化
Nx*Ny*Nz
。还要注意,最小化未平铺的卷等于最大化
L^3*Nx*Ny*Nz

最后一个观察结果是,如果您的解决方案在任何方面都是最优的(立方体数或平铺体积),则至少有一个维度将具有相等的
N@*L==d@
,否则我们可能会增加
L

让我们假设
dx
是这个维度,并将所有长度除以
dx
,因此
a=d@/dx
y
z
(以及
ax=1
,如果需要)。然后我们可以重写问题:

查找Nx、Ny、Nz、L,以便
-Nx*Ny*Nz≤ N
-Nx=dx/L
-纽约/纽约州≤ 是
-新西兰/新西兰≤ az
最大化立方体的体积:
dx^3*(Ny/Nx)*(Nz/Nx)

因此,您的问题是如何在保持
Nx*Ny*Nz的同时,使每侧立方体的数量比尽可能接近大小比≤ N
——就像你本能地接近你的
N=1000
案例一样

算法建议:例如,您可以迭代增加
Nx
并为@in{y,z}设置
N@=floor(a@*Nx)
,而
Nx*Ny*Nz≤ N
,保留最佳解决方案

最优解 请注意,如果您的比率
ay
az
是合理的,就像在您的示例中一样,可能很容易找到最小化的精确解决方案

让我们为@in{y,z}写
a@=n@/m@
,然后我们可以通过设置
Nx=lcm(my,mz)
-分母的最小公倍数来找到精确解。注意,在
dx,dy,dz
都是整数的情况下,这意味着
Nx=dx/gcd(dx,dy,dz)

因此,如果
Nx^3*ax*ay=lcm(my,mz)^3*ny*nz/(my*mz)≤ N
,此解决方案也符合
N
的约束条件。要完整地写出来:

Nx = lcm(my, mz)
L  = dx / Nx
Ny = Nx * ay
Nz = Nx * az
在您的示例中,对于3D情况,您有
ay=az=1
Nx=Ny=Nz=1
的解决方案,而对于2D情况,我们只有
az=1/2
的尺寸x和z,您有
Nx=2
Nz=1

现在您可以添加更多的立方体,因为
Nx*Ny*Nz中有很多空闲空间≤ N
约束。特别是,您可以将每个坐标乘以
floor(cbrt(N/(Nx*Ny*Nz))
,在第一种情况下,它是
floor(cbrt(30/1))=3
,在2D情况下是
floor(sqrt(1000/2))=22

将结果总结到您的示例中:

空格={3,3,3}N=30:Nx=3,Ny=3,Nz=3,L=1
空格={100,50}N=1000:Nx=44,Nz=22,L=2.7272

启发式 如果我们找不到确切的答案,我们可以做出有根据的猜测。为了避免迭代
Nx
值,或者只是为了进行合理的初始猜测

请注意,分母越大,具有相同分母的两个分数之间的间隔越小。这并不意味着给定一个你想要近似的实数,你的近似精度与分母的大小成正比,但是当近似许多实数时,平均精度会更好
Nx = floor(crbt(N / (ay * az)))
L  = dx / Nx
Ny = floor(Nx * ay)
Nz = floor(Nx * az)
Nx = floor(crbt(N * dx * dx / (dy * dz)))
L  = dx / Nx
Ny = floor(dy / L)
Nz = floor(dz / L)