限制在 opensolver 中求解的选定变量

Limiting chosen variables solved for in opensolver

我有一个包含 17 个方程、506 个变量的线性系统,求解总变量的最小总和。到目前为止,这工作正常,但解决方案是 19 个变量组合的结果。

但最后我想将所选变量的数量限制为 10 个,而无需事先知道哪些是最佳变量(求解器为我计算出这一点,以及它们的比率)。

我想如果值变得大于 0,我可以设置一个布尔值 = 1:(意味着选择了变量),如果没有选择变量以获得最佳解决方案,则设置为 0。

然后布尔值之和最多为10。

然而,这似乎有点复杂,我想知道 opensolver 中是否有内置选项,因为我认为用子集求解大型集合是一个很常见的问题。

那么大家有什么建议吗:

  1. 我精心设计的方法如何显着降低性能? (*我对 opensolver 算法还没有内在的理解。)
  2. 关于更多 easily/within opensolver 选项的建议可以满足我对 max 的需求。 10 个解决方案变量?

根据下面提供的信息,我首先缩小了问题的规模:

我有三个数据列表,列中有 18 个条目:

W7:W23,AC7:AD23

其中手动(with:W28 = 6000, AC28=600,W29 = 1,AC29 =1),线性组合,equal/exceed目标列表: EGM34:EG50

所以我所做的就是将 descion 变量放入 W28:W29, AC28:AD29 我在求解器中添加约束 W28,AC28:AD28 = integer 的地方(原始 excel 求解器与 opensolver 一样)

并且我在求解器中添加了约束 W29,AC29:AD29 = Boolean(原始的 excel 求解器与 opensolver 一样)

然后我对整数*布尔值进行乘法运算 = (W7:W23 etc)

中上述列表的实际乘法因子

为了限制所选变量的数量,除了所描述的约束之外,我还尝试使用 =sum(W29,AC29:AD29) to <= 10 来限制单元格(有效地将设置为 true 的布尔值数量减少到 11 以下,或者所以我想,但是布尔值没有被求解器评估为布尔值)。

这些新的相乘列表放在W34:W50,AC34:AD50中,求和位于:EGY34:EGY50因此最后的检查作为约束添加为:

EGY34:EGY50 =>EGM34:EGM50

我有一个关于线性求解器如何评估这些约束的问题,是吗:

一个。想想 EGY34:EGY50 must be larger or equal than/to EGM34:EGM50

的总和

b。它认为:“对于每一行 x EGYx must be larger or equal than/to EGMx

到目前为止我已经注意到 b。但我想确认一下。

但我的主要问题是:

在使用下面评论中善意建议的进化算法后,how/why它是否尝试将指定为布尔值的决策变量的值设置为 0.99994?

二进制变量的引入确实是实现此类约束的标准方式。不幸的是,它将问题从线性规划问题转变为 integer programming problem (specifically a mixed integer linear programming problem). A standard approach to such problems is the branch and bound algorithm。这就是 Excel 的内置求解器似乎使用的,我不确定您正在使用的开放式求解器。在最好的情况下(有很多边界)它会 运行 相当快,即使你的尺寸有问题。在最坏的情况下,对于您的问题,它可能比您通过 运行 将单纯形算法 C(506,10) = 2.8 x 10^20 次(每组 10 个决策变量可能一次)得到的结果好一点。换句话说,这可能是不可行的。已知整数规划是 NP 难的。

如果精确解不可行,您始终可以使用启发式算法,例如进化方法。