算法:找到两个正整数,其差最小化并且其乘积已知

时间:2018-10-26 18:28:16

标签: excel vba algorithm optimization solidworks

某些背景...

我目前正在建立一个宏,该宏将估计注塑工具的成本。这些工具具有填充有塑料的空腔。工具具有的型腔数量就是将要形成的零件数量。

到目前为止,我的程序将根据客户需求确定工具可具有的最小腔数。这个数字总是偶数。该工具应具有偶数个腔。给定型腔的边界长度和宽度,并设置型腔可在工具中占据的空间的限制,我需要我的程序来计算沿型腔的长度和宽度的数量之和,这些数量的差最小化并且其乘积等于该工具应具有的最小型腔总数。

我正在编程,我的宏是SolidWorks VBA。我首先在Excel中构造了此问题,然后使用了求解器工具。但是,我无法找到一种方法来引用SolidWorks中的Excel Solver工具来自动执行此优化问题。我希望找到一套可以为我解决这个特定问题的聪明方程式。但是,如果其他人对使用的方式有了更好的了解,那将很棒。

以优化格式改写...

变量

  • x =沿工具宽度的腔数
  • y =沿工具长度的腔数
  • z =建议的总腔数

目标函数

最小化x-y

就这样

  • x * y = z
  • x> = 1
  • y> = 1
  • x <= y
  • x是整数
  • y是整数

示例

我的宏说,为了满足需求,我们的工具需要至少有48个腔。找到沿工具长度和宽度的腔数,以使差异最小化并且乘积等于48。在这种情况下,理想情况下,宏将返回x = 6和y = 8。

谢谢!

3 个答案:

答案 0 :(得分:3)

只需澄清一下,在这个问题上,您实际上是对Min y-x而不是Min x-y的意思吗?否则,将采用x = 1y = z的幼稚解决方案。 Min x - y = 1-z

我不在VBA中编程,但这是个主意。

由于xy是正整数,并且乘积为zx <= 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)

我认为您可以测试一些示例。不需要花哨的算法。

如果将条件放宽为两个数字xy,其乘积为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