限制在opensolver中解决的所选变量

时间:2017-01-07 15:21:38

标签: vba limit linear-programming solver linear

我有一个17个方程的线性系统,506个变量解决了总变量的最小总和。到目前为止,这种方法很好,但解决方案是19个变量组合的结果。

但最后我想将所选变量的数量限制为10,而不事先知道哪些变量是最佳变量(解算器为我计算,以及它们的比例)。

我认为如果值大于0,我可以设置boolean = 1 :(意味着选择变量),如果没有为最佳解决方案选择变量,则设置为0。

然后将布尔的总和最多为10。

然而,这看起来有点复杂,我想知道openolver中是否有内置选项,因为我认为解决带有子集的大型集合是一个非常常见的问题。

所以有人建议:

  1. 我精心设计的方式如何大幅降低性能? (*我对openolver算法没有内在的理解。)
  2. 建议更容易/在openolver期权帐户中,以满足我对max的渴望。 10个解决方案变量?
  3. 根据下面提供的信息,我首先缩小了问题的大小:

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

    W7:W23,AC7:AD23

    手动(使用:W28 = 6000, AC28=600,W29 = 1,AC29 =1),线性组合,等于/超过目标列表: EGM34:EG50

    所以我做的是将descion变量放在W28:W29, AC28:AD29中 我在求解器中添加约束W28,AC28:AD28 = integer的位置(原始的excel解算器都像在opensolver中一样)

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

    然后我有一个整数的乘法* boolean = (W7:W23 etc)

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

    为了限制所选变量的nr,除了所描述的约束之外,我还尝试用=sum(W29,AC29:AD29) to <= 10限制单元格(有效地将布尔数量设置为低于11,或者我想到了,但解决者并没有将布尔值评为布尔值。

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

    EGY34:EGY50 =>EGM34:EGM50

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

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

    的总和

    湾是否认为:“对于每一行x EGYx must be larger or equal than/to EGMx

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

    但我的主要问题是:

    在使用Evolutionary算法之后,如下面的评论中所提出的那样,对于指定为布尔值的desicion变量,它如何/为什么尝试将值设为0.99994?

1 个答案:

答案 0 :(得分:2)

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

如果确切的解决方案不可行,您可以始终使用启发式算法,例如渐进式方法。