GCPWL.java


/ * 2023年版权,Gurobi优狗万app足彩化,LLC这个例子中制定和解决以下简单的模型PWL约束:最大化和c [j] * x [j]受总和(i, j) * x [j] < i = 0 = 0,,…m - 1和y [j] < = 3 y [j] = pwl (x [j]), j = 0,…,n - 1 x [j]自由,y [j] > = 0, j = 0,…,n - 1 pwl (x) = 0,如果x = 0 = 1 + x | |,如果x = 0注1。pwl总和(x [j]) < = b是绑定x向量和支持稀疏的向量。b = 3意味着最多两个x [j]可以非零,如果两个,然后x [j] < = 1和2。pwl (x)跳从1到0,从0到1,如果x从- 0到0,然后积极0,所以我们需要三个点x = 0。x无限边界两边,定义了两个点(1,2)和(0,1)可以扩展x无限。总体我们可以用5分(1、2),(0,1),(0,0)、(0,1)和(1、2)来定义y = pwl (x) * /进口gurobi。*;进口java.util。*;公开课GCPWL{公共静态空main (String [] args){尝试{int n = 5;int m = 5; double c[] = { 0.5, 0.8, 0.5, 0.1, -1 }; double A[][] = { {0, 0, 0, 1, -1}, {0, 0, 1, 1, -1}, {1, 1, 0, 0, -1}, {1, 0, 1, 0, -1}, {1, 0, 0, 1, -1} }; double xpts[] = {-1, 0, 0, 0, 1}; double ypts[] = {2, 1, 0, 1, 2}; // Env and model GRBEnv env = new GRBEnv(); GRBModel model = new GRBModel(env); model.set(GRB.StringAttr.ModelName, "GCPWL"); // Add variables, set bounds and obj coefficients GRBVar[] x = model.addVars(n, GRB.CONTINUOUS); for (int i = 0; i < n; i++) { x[i].set(GRB.DoubleAttr.LB, -GRB.INFINITY); x[i].set(GRB.DoubleAttr.Obj, c[i]); } GRBVar[] y = model.addVars(n, GRB.CONTINUOUS); // Set objective to maximize model.set(GRB.IntAttr.ModelSense, GRB.MAXIMIZE); // Add linear constraints for (int i = 0; i < m; i++) { GRBLinExpr le = new GRBLinExpr(); for (int j = 0; j < n; j++) { le.addTerm(A[i][j], x[j]); } model.addConstr(le, GRB.LESS_EQUAL, 0, "cx" + i); } GRBLinExpr le1 = new GRBLinExpr(); for (int j = 0; j < n; j++) { le1.addTerm(1.0, y[j]); } model.addConstr(le1, GRB.LESS_EQUAL, 3, "cy"); // Add piecewise constraints for (int j = 0; j < n; j++) { model.addGenConstrPWL(x[j], y[j], xpts, ypts, "pwl" + j); } // Optimize model model.optimize(); for (int j = 0; j < n; j++) { System.out.println("x[" + j + "] = " + x[j].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()); } } }