【问题标题】:What does Big M method do in constraints when converting nonlinear programming into linear programming?将非线性规划转换为线性规划时,Big M方法在约束中做了什么?
【发布时间】:2020-06-04 00:01:01
【问题描述】:

我在论文中收到了有关此限制的问题。这篇论文说它使用大 M 方法来将非线性规划模型变成 LP。我得到那个大数字 M1 是一个巨大的数字,但我不知道大数字 M1 对约束的真正作用。你们能给我一些关于在这个约束中使用大 M 的见解吗? 下面是大号 M1 的约束。

论文说这些限制是 当 K[m][i] = p[i]*x[m][i],

maximize sum(m in M, i in I) (K[m][i]-c[i]*x[m][i]     
K[m][i]-M[1]*(1-x[m][i]) <= p[i]
K[m][i]+M[1]*(1-x[m][i]) >= p[i]
K[m][i]-M[1]*x[m][i] <= 0

它最初在非线性规划中看起来像这样

maximize sum(m in M, i in I)(p[i]-c[i])*x[m][i]

因此,基本上,将非线性规划转换为线性规划会导致一些决策变量和 3 个带有大数 M 的附加约束发生一些变化。

这是另一个包含大数 M 的约束。

sum (j in J) b[i][j]*p[j]-p[i]<= M[1]*y[i]

原来的样子

p[i]<sum (j in J) b[i][j]*p[j], if y[i]==1

这是最后一个大数 M 的约束

(r[m][j]=p[j])*b[i][j]*x[m][i] >= -y[i]*m[1]

这是

(r[m][j]-p[j])*b[i][j]*x[m][i](1-y[i])>=0 

在非线性程序中。

我很想知道大M在模型中做了什么。 如果有人能给我一些见解,将不胜感激。

谢谢。

【问题讨论】:

  • 另一件事 - 你提到'那个大数字 M1 是一个巨大的数字'。它真的不应该是一个巨大的数字。它需要尽可能小并且仍然可以工作,因此通常可以从已知数据中选择它。尝试使用一个比该表达式中其他术语中可能出现的最大值大的值。对 M 使用太大的值会导致数值问题和不稳定。
  • 这里显示了一个稍微好一点的公式:stackoverflow.com/questions/62140335/…

标签: linear-programming cplex opl


【解决方案1】:

如你所说,big-M 用于建模非线性约束

K[m][i] = p[i] * x[m][i]

如果x 是二进制变量。假设MK[m][i] 的上限,K[m][i] 是非负变量,即0 &lt;= K[m][i] &lt;= Mp 也被假定为非负数。

由于x[m][i] 是二进制的,我们可以在可行的解决方案中有两种情况:

  1. x[m][i] = 0。在这种情况下,乘积 p[i] * x[m][i] 为 0,因此 K[m][i] 也应为零。这是由约束K[m][i] - M * x[m][i] &lt;= 0 强制执行的,在这种情况下它变成了K[m][i] &lt;= 0。在这种情况下,涉及M 的另外两个约束变得多余。例如,第一个约束减少到 K[m][i] &lt;= p[i] + M,这始终是正确的,因为 MK[m][i] 的上限,而 p 是非负数。
  2. x[m][i] = 1。在这种情况下,乘积p[i] * x[m][i] 只是p[i],涉及M 的前两个约束变为K[m][i] &lt;= p[i]K[m][i] &gt;= p[i](相当于K[m][i] = p[i])。涉及M 的最后一个约束变为K[m][i] &lt;= M,这是多余的,因为MK[m][i] 的上限。

所以M 的作用是根据x 的值“启用/禁用”某些约束。

【讨论】:

    【解决方案2】:

    要对逻辑约束建模,您可以使用逻辑约束或依赖大 M

    https://www.ibm.com/support/pages/difference-between-using-indicator-constraints-and-big-m-formulation

    我倾向于建议将逻辑约束作为默认选择。

    https://www.linkedin.com/pulse/how-opl-alex-fleischer/

    让我分享一个例子

    How to multiply a decision variable by a boolean decision variable in CPLEX ?

    // suppose we want b * x <= 7 
    
        dvar int x in 2..10;
        dvar boolean b;
    
        dvar int bx;
    
        maximize x;
        subject to
        {
    
        // Linearization  
        bx<=7;
    
    
    
        2*b<=bx;
        bx<=10*b;
    
        bx<=x-2*(1-b);
        bx>=x-10*(1-b);
    
        // if we use CP we could write directly
        // b*x<=7
    
        // or rely on logical constraints within CPLEX
        // (b==1) => (bx==x);
        // (b==0) => (bx==0);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多