优化问题:在域内拟合六边形
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
下,您无需解决优化问题即可优化 m
和 n
。您可以简单地设置:
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*errorB
或 errorL+errorB
)并将其最小化 w.r.t。 Ls
.
我有一个几何问题,我想用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
下,您无需解决优化问题即可优化 m
和 n
。您可以简单地设置:
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*errorB
或 errorL+errorB
)并将其最小化 w.r.t。 Ls
.