我正在尝试编写一个线性程序,需要一个等于x-c符号的变量z,其中x是另一个变量,c是常量。
我考虑过z = (x-c)/|x-c|
。不幸的是,如果x = c,则会创建除以0。
我不能使用z = x-c,因为我不想用x和c之间差异的大小来加权。
有没有人知道表达z的好方法,这是x-c的标志?
感谢您的任何帮助和建议!
答案 0 :(得分:3)
您无法使用线性程序精确地建模z = sign(x-c)
(因为LP中的约束仅限于变量的线性组合)。
但是,如果您愿意将线性程序转换为混合整数程序,则可以建模sign
,您可以使用以下两个约束对其进行建模:
L*b <= x - c <= U*(1-b)
z = 1 - 2*b
其中b
是二进制变量,L
和U
是数量x-c
的下限和上限。如果b = 0
,我们有0 <= x - c <= U
和z = 1
。如果b = 1
,我们有L <= x - c <= 0
和z = 1 - 2*1 = -1
。
您可以使用Gurobi之类的求解器来解决混合整数程序。
答案 1 :(得分:0)
对于k»1,这是符号函数的平滑近似值:
另外
当ε→0
时这两个近似值没有除以0问题,但现在你必须调整一个参数。
在某些语言(例如C ++ / C)中,您可以简单地编写如下内容:
double sgn(double x)
{
return (x > 0.0) - (x < 0.0);
}
无论如何,请考虑许多环境/语言已经具有签名功能,例如
密切关注x等于0时会发生什么(例如Fortran函数将返回1,其他语言将返回0)。