我目前正在建立一个宏,该宏将估计注塑工具的成本。这些工具具有填充有塑料的空腔。工具具有的型腔数量就是将要形成的零件数量。
到目前为止,我的程序将根据客户需求确定工具可具有的最小腔数。这个数字总是偶数。该工具应具有偶数个腔。给定型腔的边界长度和宽度,并设置型腔可在工具中占据的空间的限制,我需要我的程序来计算沿型腔的长度和宽度的数量之和,这些数量的差最小化并且其乘积等于该工具应具有的最小型腔总数。
我正在编程,我的宏是SolidWorks VBA。我首先在Excel中构造了此问题,然后使用了求解器工具。但是,我无法找到一种方法来引用SolidWorks中的Excel Solver工具来自动执行此优化问题。我希望找到一套可以为我解决这个特定问题的聪明方程式。但是,如果其他人对使用的方式有了更好的了解,那将很棒。
最小化x-y
我的宏说,为了满足需求,我们的工具需要至少有48个腔。找到沿工具长度和宽度的腔数,以使差异最小化并且乘积等于48。在这种情况下,理想情况下,宏将返回x = 6和y = 8。
谢谢!
答案 0 :(得分:3)
只需澄清一下,在这个问题上,您实际上是对Min y-x
而不是Min x-y
的意思吗?否则,将采用x = 1
和y = z
的幼稚解决方案。 Min x - y = 1-z
。
我不在VBA中编程,但这是个主意。
由于x
和y
是正整数,并且乘积为z
和x <= y
。您基本上可以从x = floor(sqrt(z))
开始,然后递减直到x = 1
。
对于每个x
,检查是否存在整数y
,使得x * y = z
。如果有,请打破循环,这就是您要寻找的那对。否则继续进行,直到x = 1
如果需要任何伪代码,则可以将其转换为VBA。在这里
int x, y;
for (x = floor(sqrt(z)); x >= 1; --x)
{
y = z / x;
if (x * y == z)
break;
}
答案 1 :(得分:1)
我认为您可以测试一些示例。不需要花哨的算法。
如果将条件放宽为两个数字x
和y
,其乘积为z
且相差最小,则答案为SQRT(z)
。 / p>
这不是一个可以满足您需求的整数(通常)。但是,您可以尝试在平方根周围进行整数运算,以查看整数是否除以z
。您命中的第一个(即与SQRT(z)
的最小差)应该具有最小的差。
如果放松条件以使|z - x * y|
最小,那么我建议测试sqrt(z)
附近的数字。您需要检查两种情况-平方根的地板和天花板(以及其他适当的数字)。
答案 2 :(得分:0)
以防万一将来有人需要与此类似的东西,但无法弄清楚我继续编写的伪代码。我不确定如何将其输出为两个值,所以我只是将它们作为字符串扔给用户看。
Option Explicit
Function Factors(ByVal Test As Long) As String
Dim Val As Long
Dim i As Long
Val = Test
i = Int(Sqr(Val))
While Val / i >= 2
If Int(Val / i) * i = Val Then
Factors = i & " & " & Val / i
Exit Function
End If
i = i - 1
Wend
End Function