线性规划 - 等于表达式符号的变量

时间:2014-04-01 14:03:01

标签: linear-programming divide-by-zero

我正在尝试编写一个线性程序,需要一个等于x-c符号的变量z,其中x是另一个变量,c是常量。

我考虑过z = (x-c)/|x-c|。不幸的是,如果x = c,则会创建除以0。

我不能使用z = x-c,因为我不想用x和c之间差异的大小来加权。

有没有人知道表达z的好方法,这是x-c的标志?

感谢您的任何帮助和建议!

2 个答案:

答案 0 :(得分:3)

您无法使用线性程序精确地建模z = sign(x-c)(因为LP中的约束仅限于变量的线性组合)。

但是,如果您愿意将线性程序转换为混合整数程序,则可以建模sign,您可以使用以下两个约束对其进行建模:

 L*b <= x - c <= U*(1-b)
 z = 1 - 2*b

其中b是二进制变量,LU是数量x-c的下限和上限。如果b = 0,我们有0 <= x - c <= Uz = 1。如果b = 1,我们有L <= x - c <= 0z = 1 - 2*1 = -1

您可以使用Gurobi之类的求解器来解决混合整数程序。

答案 1 :(得分:0)

对于k»1,这是符号函数的平滑近似值:

enter image description here

另外

enter image description here

当ε→0

这两个近似值没有除以0问题,但现在你必须调整一个参数。


在某些语言(例如C ++ / C)中,您可以简单地编写如下内容:

double sgn(double x)
{
  return (x > 0.0) - (x < 0.0);
}

无论如何,请考虑许多环境/语言已经具有签名功能,例如

密切关注x等于0时会发生什么(例如Fortran函数将返回1,其他语言将返回0)。