excel - 算法:找到两个差最小且乘积已知的正整数
问题描述
一些背景...
我目前正在构建一个宏来估算注塑工具的成本。这些工具具有填充塑料的空腔。工具的型腔数是要形成的零件数。
到目前为止,我的程序将根据客户需求确定工具可以具有的最小腔数。这个数字总是偶数。该工具应具有偶数个型腔。给定空腔的边界长度和宽度,并设置空腔在工具内可以占据多少空间的限制,我需要我的程序来计算沿长度和宽度的空腔数量的组合,它们的差异最小化,其乘积等于工具应具有的最小型腔总数。
我正在编程我的宏是 SolidWorks VBA。我首先在 Excel 中构建了这个问题并使用了求解器工具。但是,我无法找到一种方法来引用 SolidWorks 中的 Excel Solver Tool 来自动执行此优化问题。我希望能找到一组聪明的方程来为我解决这个特定的问题。但是,如果其他人对使用什么有更好的了解,那就太棒了。
以优化格式改写...
变量
- x = 沿工具宽度的型腔数
- y = 沿刀具长度的型腔数
- z = 建议的总腔数
目标函数
最小化 x - y
这样
- x * y = z
- x >= 1
- y >= 1
- x <= y
- x 是一个整数
- y 是一个整数
例子
我的宏说,为了满足需求,我们的工具至少需要有 48 个型腔。沿着工具的长度和宽度查找型腔数,以使差异最小化并且乘积等于 48。理想情况下,宏将返回 x = 6 和 y = 8。
谢谢!
解决方案
只是为了澄清一下,在这个问题中,您实际上的意思是Min y-x
而不是Min x-y
?否则,有一个天真的解决方案采取x = 1
and 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;
}
推荐阅读
- node.js - Mongoose 中的 $or 运算符
- python - 如何在 Python Panadas 中使用字符串但仅使用点?
- android - Android Studio 4.2 开始在发布版本中重命名 APK 内的资源
- c++ - 零规则如何影响具有隐藏可见性的共享库?
- https - 如何使用保存 X-XSRF-TOKEN 的 JMeter 测试脚本记录器登录 HTTPS 资源?
- python - Sympy:MatrixSymbol 的 Moore-Penrose 伪逆
- c# - C#:System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效
- swift - 添加到地图注释数组时,按标题注释排序的 MapView 发生更改
- json - 使用查询构建器和 json 数据在 laravel 急切加载上使用 whereRaw 条件
- dialogflow-cx - 自动更正拼写选项不可用