Piecewise.java


/*版权2023,Gurobi Opt狗万app足彩imization, LLC */ /*这个例子考虑了以下可分离的凸问题:最小化f(x) - y + g(z),服从x + 2 y + 3 z <= 4 x + y >= 1 x, y, z <= 1,其中f(u) = exp(-u)和g(u) = 2u ^2 - 4u,对于所有实u。它通过用分段线性函数逼近f和g来公式和解决一个更简单的LP模型。然后,通过对对应于非凸分段线性函数的f的近似求负,将模型转换为MIP,并再次求解。*/进口gurobi.*;公共类Piecewise{私有静态双f(双u){返回Math.exp(-u);}私有静态双g(双u){返回2 * u * u - 4 * u;} public static void main(String[] args) {try{//创建环境GRBEnv env = new GRBEnv();//创建一个新模型GRBModel model = new GRBModel(env);//创建变量double lb = 0.0, ub = 1.0;GRBVar x =模型。addVar(lb, ub, 0.0, GRB。连续的," x "); GRBVar y = model.addVar(lb, ub, 0.0, GRB.CONTINUOUS, "y"); GRBVar z = model.addVar(lb, ub, 0.0, GRB.CONTINUOUS, "z"); // Set objective for y GRBLinExpr obj = new GRBLinExpr(); obj.addTerm(-1.0, y); model.setObjective(obj); // Add piecewise-linear objective functions for x and z int npts = 101; double[] ptu = new double[npts]; double[] ptf = new double[npts]; double[] ptg = new double[npts]; for (int i = 0; i < npts; i++) { ptu[i] = lb + (ub - lb) * i / (npts - 1); ptf[i] = f(ptu[i]); ptg[i] = g(ptu[i]); } model.setPWLObj(x, ptu, ptf); model.setPWLObj(z, ptu, ptg); // Add constraint: x + 2 y + 3 z <= 4 GRBLinExpr expr = new GRBLinExpr(); expr.addTerm(1.0, x); expr.addTerm(2.0, y); expr.addTerm(3.0, z); model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0"); // Add constraint: x + y >= 1 expr = new GRBLinExpr(); expr.addTerm(1.0, x); expr.addTerm(1.0, y); model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1"); // Optimize model as an LP model.optimize(); System.out.println("IsMIP: " + model.get(GRB.IntAttr.IsMIP)); System.out.println(x.get(GRB.StringAttr.VarName) + " " +x.get(GRB.DoubleAttr.X)); System.out.println(y.get(GRB.StringAttr.VarName) + " " +y.get(GRB.DoubleAttr.X)); System.out.println(z.get(GRB.StringAttr.VarName) + " " +z.get(GRB.DoubleAttr.X)); System.out.println("Obj: " + model.get(GRB.DoubleAttr.ObjVal)); System.out.println(); // Negate piecewise-linear objective function for x for (int i = 0; i < npts; i++) { ptf[i] = -ptf[i]; } model.setPWLObj(x, ptu, ptf); // Optimize model as a MIP model.optimize(); System.out.println("IsMIP: " + model.get(GRB.IntAttr.IsMIP)); System.out.println(x.get(GRB.StringAttr.VarName) + " " +x.get(GRB.DoubleAttr.X)); System.out.println(y.get(GRB.StringAttr.VarName) + " " +y.get(GRB.DoubleAttr.X)); System.out.println(z.get(GRB.StringAttr.VarName) + " " +z.get(GRB.DoubleAttr.X)); System.out.println("Obj: " + model.get(GRB.DoubleAttr.ObjVal)); // Dispose of model and environment model.dispose(); env.dispose(); } catch (GRBException e) { System.out.println("Error code: " + e.getErrorCode() + ". " + e.getMessage()); } } }