首页 > 解决方案 > 算法:找到两个差最小且乘积已知的正整数

问题描述

一些背景...

我目前正在构建一个宏来估算注塑工具的成本。这些工具具有填充塑料的空腔。工具的型腔数是要形成的零件数。

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

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

以优化格式改写...

变量

目标函数

最小化 x - y

这样

例子

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

谢谢!

标签: excelvbaalgorithmoptimizationsolidworks

解决方案


只是为了澄清一下,在这个问题中,您实际上的意思是Min y-x而不是Min x-y?否则,有一个天真的解决方案采取x = 1and y = zMin x - y = 1-z.

我不在 VBA 中编程,但这是我的想法。

因为xy是正整数,所以产品是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;
}

推荐阅读