genconstr_c + + . cpp


/ * 2023年版权,Gurobi优狗万app足彩化,LLC * / / *在这个例子中,我们展示了使用通用约束建模*一些常见的表达式。我们使用作为一个例子一个sat问题*想看看是否有可能满足至少四个逻辑的(或全部)条款* * * L = (x0或~ x1和x2)和(x1 ~ x2或x3)和* (x2 ~ x3或x0)和(x3 ~ x0或x1)和* (~ x0或~ x1和x2)和(~ ~ x1和x2或x3)和* (x2 ~ ~ x3或x0)和(~ x3 ~ x0或x1) * *我们通过引入两个变量为每个文字(本身及其*否定价值),一个变量对于每一个条款,然后两个*变量指示如果我们能满足四个,而另一个识别*的最低条款(如果它,我们可以满足所有条款)*,把这两个变量的目的。*即目标函数将* *最大化Obj0 +其中Obj1 * * Obj0 = MIN (Clause1,……Clause8) *其中Obj1 = 1 - > Clause1 +……+ Clause8 > = 4 * *因此,客观价值将两个当且仅当我们可以满足所有*条款;当且仅当一个至少有四个条款可以满意,否则* 0。* / # include“gurobi_c + +。h”# include < sstream > # include < iomanip >使用名称空间性病;#定义n 4 # define NLITERALS 4 / /一样n # define NCLAUSES 8 # define NOBJ 2 int主要(void) {GRBEnv * env = 0;尝试{/ /数据/ /如例子。{0 n + 1 2}意味着条款(x0或~ x1和x2) const int[]条款[3]= {{0 n + 1 2}, {1, n + 2, 3}, {2, n + 3, 0}, {3 n + 0,1}, {n + 0, n + 1, 2}, {n + 1, n + 2, 3}, {n + 2, + 3, 0}, {n + 3, n + 0,1}}; int i, status; // Create environment env = new GRBEnv("genconstr_c++.log"); // Create initial model GRBModel model = GRBModel(*env); model.set(GRB_StringAttr_ModelName, "genconstr_c++"); // Initialize decision variables and objective GRBVar Lit[NLITERALS]; GRBVar NotLit[NLITERALS]; for (i = 0; i < NLITERALS; i++) { ostringstream vname; vname << "X" << i; Lit[i] = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, vname.str()); vname.str(""); vname << "notX" << i; NotLit[i] = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, vname.str()); } GRBVar Cla[NCLAUSES]; for (i = 0; i < NCLAUSES; i++) { ostringstream vname; vname << "Clause" << i; Cla[i] = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, vname.str()); } GRBVar Obj[NOBJ]; for (i = 0; i < NOBJ; i++) { ostringstream vname; vname << "Obj" << i; Obj[i] = model.addVar(0.0, 1.0, 1.0, GRB_BINARY, vname.str()); } // Link Xi and notXi GRBLinExpr lhs; for (i = 0; i < NLITERALS; i++) { ostringstream cname; cname << "CNSTR_X" << i; lhs = 0; lhs += Lit[i]; lhs += NotLit[i]; model.addConstr(lhs == 1.0, cname.str()); } // Link clauses and literals GRBVar clause[3]; for (i = 0; i < NCLAUSES; i++) { for (int j = 0; j < 3; j++) { if (Clauses[i][j] >= n) clause[j] = NotLit[Clauses[i][j]-n]; else clause[j] = Lit[Clauses[i][j]]; } ostringstream cname; cname << "CNSTR_Clause" << i; model.addGenConstrOr(Cla[i], clause, 3, cname.str()); } // Link objs with clauses model.addGenConstrMin(Obj[0], Cla, NCLAUSES, GRB_INFINITY, "CNSTR_Obj0"); lhs = 0; for (i = 0; i < NCLAUSES; i++) { lhs += Cla[i]; } model.addGenConstrIndicator(Obj[1], 1, lhs >= 4.0, "CNSTR_Obj1"); // Set global objective sense model.set(GRB_IntAttr_ModelSense, GRB_MAXIMIZE); // Save problem model.write("genconstr_c++.mps"); model.write("genconstr_c++.lp"); // Optimize model.optimize(); // Status checking status = model.get(GRB_IntAttr_Status); if (status == GRB_INF_OR_UNBD || status == GRB_INFEASIBLE || status == GRB_UNBOUNDED ) { cout << "The model cannot be solved " << "because it is infeasible or unbounded" << endl; return 1; } if (status != GRB_OPTIMAL) { cout << "Optimization was stopped with status " << status << endl; return 1; } // Print result double objval = model.get(GRB_DoubleAttr_ObjVal); if (objval > 1.9) cout << "Logical expression is satisfiable" << endl; else if (objval > 0.9) cout << "At least four clauses can be satisfied" << endl; else cout << "Not even three clauses can be satisfied" << endl; } catch (GRBException e) { cout << "Error code = " << e.getErrorCode() << endl; cout << e.getMessage() << endl; } catch (...) { cout << "Exception during optimization" << endl; } // Free environment delete env; return 0; }