Multiobj.java


/*版权2023,Gurobi Opt狗万app足彩imization, LLC */ /*想要覆盖三个不同的集合,但受允许使用的元素的共同预算的约束。但是,这些集合有不同的优先次序;我们通过多目标优化来解决这个问题。*/导入gurobi.*;公共类Multiobj{公共静态void main(String[] args) {try{//样本数据int groundSetSize = 20;int nSubsets = 4;int预算= 12;双组[][]= new双[][]{{1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1},{0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,1,1,0,0},{0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0}};int SetObjPriority[] = new int[] {3,2,2,1};double SetObjWeight[] = new double[] {1.0, 0.25, 1.25, 1.0}; int e, i, status, nSolutions; // Create environment GRBEnv env = new GRBEnv("Multiobj.log"); // Create initial model GRBModel model = new GRBModel(env); model.set(GRB.StringAttr.ModelName, "Multiobj"); // Initialize decision variables for ground set: // x[e] == 1 if element e is chosen for the covering. GRBVar[] Elem = model.addVars(groundSetSize, GRB.BINARY); for (e = 0; e < groundSetSize; e++) { String vname = "El" + String.valueOf(e); Elem[e].set(GRB.StringAttr.VarName, vname); } // Constraint: limit total number of elements to be picked to be at most // Budget GRBLinExpr lhs = new GRBLinExpr(); for (e = 0; e < groundSetSize; e++) { lhs.addTerm(1.0, Elem[e]); } model.addConstr(lhs, GRB.LESS_EQUAL, Budget, "Budget"); // Set global sense for ALL objectives model.set(GRB.IntAttr.ModelSense, GRB.MAXIMIZE); // Limit how many solutions to collect model.set(GRB.IntParam.PoolSolutions, 100); // Set and configure i-th objective for (i = 0; i < nSubsets; i++) { GRBLinExpr objn = new GRBLinExpr(); String vname = "Set" + String.valueOf(i); for (e = 0; e < groundSetSize; e++) objn.addTerm(Set[i][e], Elem[e]); model.setObjectiveN(objn, i, SetObjPriority[i], SetObjWeight[i], 1.0 + i, 0.01, vname); } // Save problem model.write("Multiobj.lp"); // Optimize model.optimize(); // Status checking status = model.get(GRB.IntAttr.Status); if (status == GRB.INF_OR_UNBD || status == GRB.INFEASIBLE || status == GRB.UNBOUNDED ) { System.out.println("The model cannot be solved " + "because it is infeasible or unbounded"); System.exit(1); } if (status != GRB.OPTIMAL) { System.out.println("Optimization was stopped with status " + status); System.exit(1); } // Print best selected set System.out.println("Selected elements in best solution:"); System.out.println("\t"); for (e = 0; e < groundSetSize; e++) { if (Elem[e].get(GRB.DoubleAttr.X) < .9) continue; System.out.print(" El" + e); } System.out.println(); // Print number of solutions stored nSolutions = model.get(GRB.IntAttr.SolCount); System.out.println("Number of solutions found: " + nSolutions); // Print objective values of solutions if (nSolutions > 10) nSolutions = 10; System.out.println("Objective values for first " + nSolutions); System.out.println(" solutions:"); for (i = 0; i < nSubsets; i++) { model.set(GRB.IntParam.ObjNumber, i); System.out.print("\tSet" + i); for (e = 0; e < nSolutions; e++) { System.out.print(" "); model.set(GRB.IntParam.SolutionNumber, e); double val = model.get(GRB.DoubleAttr.ObjNVal); System.out.print(" " + val); } System.out.println(); } model.dispose(); env.dispose(); } catch (GRBException e) { System.out.println("Error code = " + e.getErrorCode()); System.out.println(e.getMessage()); } } }