Excel 算法:找到两个差最小且乘积已知的正整数 一些背景。。。

Excel 算法:找到两个差最小且乘积已知的正整数 一些背景。。。,excel,vba,algorithm,optimization,solidworks,Excel,Vba,Algorithm,Optimization,Solidworks,我目前正在建立一个宏,将估计一个注塑模具的成本。这些工具有用塑料填充的空腔。工具的型腔数是将形成的零件数 到目前为止,我的程序将根据客户需求确定工具可以具有的最小型腔数。这个数字总是偶数。工具应具有偶数个空腔。给定型腔的边界长度和宽度,并设置型腔在工具内可以占据的空间限制,我需要我的程序计算沿长度和宽度的型腔数量组合,其差值最小,其乘积等于工具应具有的最小型腔总数 我正在编程我的宏是SolidWorks VBA。我首先在Excel中构建了这个问题,并使用了求解工具。但是,我无法找到一种方法来引用

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

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

我正在编程我的宏是SolidWorks VBA。我首先在Excel中构建了这个问题,并使用了求解工具。但是,我无法找到一种方法来引用SolidWorks中的Excel解算器工具来自动化此优化问题。我希望能找到一套聪明的方程式,为我解决这个具体问题。但是如果其他人对使用什么有更好的想法,那就太棒了

以优化格式重新表述。。。 变量
  • x=沿刀具宽度的型腔数
  • y=沿刀具长度的型腔数
  • z=建议的总空腔数
目标函数 最小化x-y

以致
  • x*y=z
  • x>=1
  • y>=1

  • x只是澄清一下,在这个问题上,你实际上是想
    miny-x
    而不是
    minx-y
    ?否则,采用
    x=1
    y=z
    是一种幼稚的解决方案<代码>最小x-y=1-z

    我不使用VBA编程,但这里是我的想法


    由于
    x
    y
    是正整数,并且有
    z
    的乘积,我想你可以用
    x测试几个例子。不需要花哨的算法

    如果将条件放宽为2个数,
    x
    y
    ,其乘积为
    z
    ,且差值最小,则答案为
    SQRT(z)

    这不是一个满足您需求的整数(通常)。但是,您可以尝试平方根周围的整数,查看它们是否除以
    z
    。您点击的第一个按钮(即与
    SQRT(z)
    的最小差值)应具有最小差值


    如果您放宽条件,使
    |z-x*y |
    最小化,那么我建议测试
    sqrt(z)
    周围的数字。你需要检查两种情况——平方根的下限和上限(以及相应的其他数字)。

    以防万一将来有人需要类似的东西,但无法找出我编写的伪代码。我不确定如何将其输出为两个值,所以我只是将它们作为字符串放在一起,供用户查看

    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
    

    您能给我们宏的代码并告诉我们问题的确切位置吗?我担心这个问题对于堆栈溢出来说太广泛了-请将您的问题缩小到一个问题,以便我们可以帮助您。x的答案是z到sqrt(z)的最接近的除数。所以从sqrt(z)迭代到1,如果这个数除以z,那么x就是这个数,z/x就是y@Joe . . . 48是相当“没有废话”。42的结果会是什么?@juvian我意识到我的错误-我现在明白了:)是的,我应该有Min y-x。抢手货这是一个很好的解决方案。我可以很容易地用vba编写代码。谢谢
    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