Vba 在opensolver中解决的限制所选变量
我有一个由17个方程组成的线性系统,506个变量,求出了总变量的最小和。到目前为止,这很好,但解决方案是由19个变量组合而成的 但最后,我想将所选变量的数量限制在10个,而不事先知道哪些变量是最佳变量(解算器会为我算出,以及它们的比率) 我想如果值大于0,我可以设置一个布尔值=1:(意味着变量被选中),如果变量没有被选中以获得最佳解决方案,则可以设置为0 然后让布尔数之和最多为10 然而,这似乎有点复杂,我想知道opensolver中是否有内置选项,因为我认为用子集求解大型集合是一个非常常见的问题 那么,是否有人对以下方面提出建议:Vba 在opensolver中解决的限制所选变量,vba,limit,linear-programming,solver,Vba,Limit,Linear Programming,Solver,我有一个由17个方程组成的线性系统,506个变量,求出了总变量的最小和。到目前为止,这很好,但解决方案是由19个变量组合而成的 但最后,我想将所选变量的数量限制在10个,而不事先知道哪些变量是最佳变量(解算器会为我算出,以及它们的比率) 我想如果值大于0,我可以设置一个布尔值=1:(意味着变量被选中),如果变量没有被选中以获得最佳解决方案,则可以设置为0 然后让布尔数之和最多为10 然而,这似乎有点复杂,我想知道opensolver中是否有内置选项,因为我认为用子集求解大型集合是一个非常常见的问
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)这根本没有意义。右手边可以移到左边,而且你关于整数的陈述完全是错误的。我建议你和你的教授坐下来,让他/她更详细地解释事情。谢谢你的建议,我尝试通过进化来解决它