我想表达一个线性程序,其变量只能大于或等于常数c或等于0.范围] 0; c [不被允许。
您是否知道在线性程序中表达此约束的方法,可以使用未经修改的单纯形实现来解决?
例如这个约束: x1> = 4或x1 = 0.
线性程序中所有约束之间的典型关系是AND。 这是两个约束之间的OR。
注意:我需要以计算有效的方式解决具有多个这样的变量的问题。
答案 0 :(得分:4)
具有您定义的约束的数学程序不能表示为线性程序,因此无法使用未修改的单纯形实现来解决。推理很简单 - 线性程序的可行集必须是凸的。像{x = 0 or x >= 2}
这样的集合不是凸的,因为它包含点x=0
和x=2
但不包含x=1
。
结果,你将被迫使用其他数学编程技术;我想到的是混合整数线性规划(MILP)。对于具有x_i
形式约束的每个变量x_i = 0 or x_i >= c_i
,您将定义辅助变量y_i
以及以下约束:
x_i >= c_iy_i
x_i <= My_i
y_i binary
如果y_i=0
,则约束为x_i >= 0; x_i <= 0
,表示x_i=0
。如果y_i=1
,则约束为x_i >= c_i, x_i <= M
。您应该将M
设置为足够大的问题值,但请注意不要将M
设置得太大,因为这会使您的问题更难解决。
这是否在计算上易于处理取决于数学程序的大小和结构以及您使用的求解器的质量。 MILP求解器有很多选择;例如,在R中,您可以使用lpSolve
,lpSolveAPI
或Rglpk
库,或者在MATLAB中,您可以使用intlinprog
函数。一般来说,cplex和gurobi被认为是最好的MILP求解器,但两者都是商业性的,需要许可证。