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

Vba 在opensolver中解决的限制所选变量,vba,limit,linear-programming,solver,Vba,Limit,Linear Programming,Solver,我有一个由17个方程组成的线性系统,506个变量,求出了总变量的最小和。到目前为止,这很好,但解决方案是由19个变量组合而成的 但最后,我想将所选变量的数量限制在10个,而不事先知道哪些变量是最佳变量(解算器会为我算出,以及它们的比率) 我想如果值大于0,我可以设置一个布尔值=1:(意味着变量被选中),如果变量没有被选中以获得最佳解决方案,则可以设置为0 然后让布尔数之和最多为10 然而,这似乎有点复杂,我想知道opensolver中是否有内置选项,因为我认为用子集求解大型集合是一个非常常见的问

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

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

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

然后让布尔数之和最多为10

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

那么,是否有人对以下方面提出建议:

  • 我精心设计的方式是如何大幅降低性能的?(*我还没有对opensolver算法的内在理解。)
  • 建议更容易/在opensolver选项中说明我最多需要10个解决方案变量
  • 根据下面提供的信息,我首先缩小了问题的规模:

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

    W7:W23,AC7:AD23

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

    因此,我所做的是将描述变量放入
    W28:W29,AC28:AD29
    其中,我在解算器中添加了约束
    W28,AC28:AD28=integer
    (与opensolver中的原始excel解算器相同)

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

    然后我得到整数*布尔值的乘法=上述列表在
    (W7:W23等)


    为了限制所选变量的nr,除了所描述的约束外,我还尝试将
    =sum(W29,AC29:AD29)的单元格限制为,引入二进制变量确实是实现此类约束的标准方法。不幸的是,它将问题从一个线性规划问题转化为一个混合整数线性规划问题。解决此类问题的标准方法是。这是Excel的内置解算器似乎使用的,我不确定您正在使用的开放解算器。在最好的情况下(有很多边界),它会运行得相当快,即使有你这样大的问题。在最坏的情况下,对于您的问题,它可能比运行单纯形算法
    C(506,10)=2.8 x 10^20
    次(每个可能的10个决策变量集一次)得到的结果要好一些。换句话说,这可能是不可行的。整数规划是众所周知的NP难问题


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

    引入二进制变量确实是实现此类约束的标准方法。不幸的是,它将问题从一个线性规划问题转化为一个混合整数线性规划问题。解决此类问题的标准方法是。这是Excel的内置解算器似乎使用的,我不确定您正在使用的开放解算器。在最好的情况下(有很多边界),它会运行得相当快,即使有你这样大的问题。在最坏的情况下,对于您的问题,它可能比运行单纯形算法
    C(506,10)=2.8 x 10^20
    次(每个可能的10个决策变量集一次)得到的结果要好一些。换句话说,这可能是不可行的。整数规划是众所周知的NP难问题


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

    对不起。这通常被称为“基数约束”。没有办法绕过额外的二进制变量来计算非零解的值。是的,它预计会减慢解的时间-很可能是很多:(@ErwinKalvelagen谢谢!我觉得很奇妙,每当我似乎偶然发现一个问题时,它实际上有一个名称,以及一种在实践中处理它的方法。我将查找基数约束,并试图了解它与我的问题的关系。我不完全理解你在做什么,但当我们想知道的时候大多数
    N
    x(i)>=0
    为非零,我们可以引入一个二进制变量
    b(i)
    并添加约束
    x(i)这完全没有道理。右手边可以移到左边,而且你关于整数的陈述完全是错误的。我建议你和你的教授坐下来,让他/她更详细地解释事情。对不起,这通常被称为“基数约束”.没有办法绕过额外的二进制变量来计算非零解的值。是的,它预计会减慢解的时间-很可能是很多:(@ErwinKalvelagen谢谢!我觉得很奇妙,每当我似乎偶然发现一个问题时,它实际上有一个名称,以及一种在实践中处理它的方法。我将查找基数约束,并试图了解它与我的问题的关系。我不完全理解你在做什么,但当我们想知道的时候大多数
    N
    x(i)>=0
    为非零,我们可以引入一个二进制变量
    b(i)
    并添加约束
    x(i)这根本没有意义。右手边可以移到左边,而且你关于整数的陈述完全是错误的。我建议你和你的教授坐下来,让他/她更详细地解释事情。谢谢你的建议,我尝试通过进化来解决它