优化问题:在域内拟合六边形

Optimization Problem: Fitting Hexagons within a Domain

我有一个几何问题,我想用python来解决它(我没有什么经验)。我需要有关如何解决问题的建议。

hexagons fitting

在附件中你可以看到问题。我有一个域 L x B 并给定六边形 (Ls) 的像元大小,我发现在直线 (n) 和之字形 (m) 方向上覆盖该域并保持在其中的最大像元数。 ErrorL 和 errorB 是我在域和单元格的边界之间犯下的错误,因为我有整数个单元格要使用,应该尽量减少这个错误。

这里是简单的代码(也许可以更简单地获得它,但它有效)

from scipy import optimize
import numpy as np

#case cells in L straight (n), in B zig zag (m)

L = 500
B = 200
Ls = 10
Lz = Ls*(3**(0.5)/2)

print('Ls =', Ls)
print('Lz =', Lz)
print('-------------')

def errorL(n):
    return abs(L-(Ls*n + Ls/2))

def errorB(m):
    return abs(B-(Lz*m + Lz/3))

resultL = optimize.minimize_scalar(errorL)
resultB = optimize.minimize_scalar(errorB)

a = round(resultL.x)
b = round(resultL.x)-1
c = round(resultB.x)
d = round(resultB.x)-1

if (Ls*a + Ls/2) <= L:
    print('n =', a)
    print('errorL =', errorL(a))
else:
    print('n =', b)
    print('errorL =', errorL(b))

if (Lz*c + Lz/3) <= B:
    print('m =', c)
    print('errorB =', errorB(c))

else:
    print('m =', d)
    print('errorB =', errorB(d))

这是一个给定像元大小 Ls 的示例,现在我想找到一种方法将 Ls 保持在 [a,b] 范围内,并找到最佳的 Ls、n 和 m 以最小化 errorL 和 errorB。 errorL 和 errorB 的每个最小化都取决于两个变量,但 Ls 的选择会影响两者。 我开始用两个变量编写一个最小化问题,但我不确定如何继续考虑 errorL 和 errorB 以使用相同的变量 Ls 最小化。此外,我只想使用 n 和 m 作为整数。我该怎么做?

欢迎提出任何建议。

非常感谢

博士

在常量 Ls 下,您无需解决优化问题即可优化 mn。您可以简单地设置:

n = floor((L-Ls/2)/Ls)
m = floor((B-Lz/3)/Lz)

错误将变为:

errorL = L-(Ls*n + Ls/2)
errorB = B-(Lz*m + Lz/3)

当然 Lz 等于 sqrt(3)/2*Ls

所以,两个错误值都变成了只有一个变量的函数,即 Ls。现在您可以定义单个成本函数(例如 errorL*errorBerrorL+errorB)并将其最小化 w.r.t。 Ls.