我的问题可能与this one有关,但我没有得到解决方法。所以我会试着询问我的具体问题。
我想知道2D中的一组半平面是否有空交叉点。因此,我有两个无界变量x
和y
。在C#我有
x = gModel.AddVar(-GRB.INFINITY, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "x");
y = gModel.AddVar(-GRB.INFINITY, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "y");
然后我添加约束,每个半平面一个:
gModel.AddConstr((-1.0 * x) + (0 * y) <= 100, "h10");
gModel.AddConstr((1.0 * x) + (0 * y) <= 100, "h09");
gModel.AddConstr((0 * x) + (-1.0 * y) <= 100, "h08");
gModel.AddConstr((0 * x) + (1.0 * y) <= 100, "h07");
gModel.AddConstr((1.0 * x) + (0 * y) <= -33.3333334, "h06");
gModel.AddConstr((-1.0 * x) + (0 * y) <= 77.7777778, "h05");
gModel.AddConstr((-1.0 * x) + (0 * y) <= 55.55555533333333, "h04");
gModel.AddConstr((-1.0 * x) + (0 * y) <= 48.148148155555553, "h03");
gModel.AddConstr((-1.0 * x) + (0 * y) <= 40.740740733333332, "h02");
gModel.AddConstr((-1.0 * x) + (0 * y) <= 70.370370377777789, "h01");
gModel.AddConstr((1.0 * x) + (0 * y) <= -62.962962955555561, "h00");
我用(0 * x + 0 * y,GRB.MINIMIZE)进行优化以得到结果状态,该状态表示是否存在可行解(即不是空交点),或者不是(空交点)。
问题在于,使用之前的设置,我会看到UNBOUNDED状态,而 h00 和 h02 相矛盾!怎么样?
我正在使用Gurobi 5.5。初始设置
GurobiEnv.Set(GRB.IntParam.DualReductions, 0);
有什么建议吗?
SUPPLEMENTAL:Rich创建了a gist来重现此问题。
答案 0 :(得分:0)
我想这又是一个数值问题,因为Gurobi试图从问题描述中消除零系数变量。完全为零的目标函数可能会导致不必要的后果。
实际上,我会说使用Gurobi解决这个问题太过分了。确定这些半平面是否具有共同点的简单方法是计算边界线的所有交叉点(对于n行约为n 2),然后检查它们中的每一个是否位于所有半平面中。如果确实如此,这是你的可行点。否则,没有这一点。