我正在创建一个模型来优化采购订单。
订购金额必须大于500或等于零。
如何在规划求解中定义这样的约束?
我尝试了二元约束,也尝试了几种不同的公式,但似乎没有任何效果。
基本上,我需要能够OR
在 Solver 中表达,我该怎么做?
编辑:在以下链接中您可以看到我正在使用的 Excel 文件: 点击这里
答案1
那么 0 是允许的,1 是不允许的,499 是不允许的,而 501 是允许的?看起来像是一个不连续的区域。所以这不是一个纯粹的优化问题,而是一种组合问题。恐怕 Solver 无法处理这个问题。
您应该分别分析两个用例:
- 金额为零(固定值,简单计算);
- 数量为 500 或更大(使用约束 >=500 在规划求解中进行优化);
然后使用 IF 公式比较这两种情况。
编辑:
我尝试按照卡尔的建议使用“二进制”和“整数”约束,但它们不起作用。
- 创建一个二进制变量 0-1 和一个连续变量 >=500,然后使用 IF 复制连续变量或将 0 写入购买值
- 创建一个二进制变量 0-1 和一个连续变量 >=500,然后将购买量计算为它们的乘积
- 创建一个整数变量 >=499,然后使用 IF 将 499 替换为 0 作为购买值
在所有情况下,结果通常都是错误的,并且取决于初始条件。显然,求解器不喜欢这样的事情。
然后我想到将上述建议应用于所有六个购买值,并独立优化它们,例如,通过优化所有月份的成本总和。但事实证明它们并不独立:期初库存取决于上个月,一个月的最佳购买取决于上个月是否进行了购买。因此,不可能为每个月添加一个简单的 IF。
我能做的最好的事情如下。
我添加了一个二进制变量 0-1 和一个连续变量 >=500,并使用 IF 计算了每个月的购买量。但我仅使用 Solver 优化了连续变量。二进制变量是一个参数。也就是说,我们选择进行购买的月份,然后使用 Solver 计算这些购买的价值,然后记下最终的总成本。
对所有购买和非购买的组合都应重复此操作。这些组合的数量为 2 6 =64。但实际上,如果您在一月份没有购买任何东西,那么您最终会得到负的期末库存,这是不允许的。因此只有 32 个有效组合。我添加了公式来计算组合索引中的二进制值,迭代索引 32 次,每次手动启动求解器并为每个组合复制结果“仅作为值”。
结果是最低成本为 4 625,00 €,并且有两种组合可以达到该值。
这是上传到 Google Docs 的文件,其中包含求解器屏幕截图。
手动多次启动求解器很繁琐,我相信可以使用宏来实现自动化。