dense_c + + . cpp


/ * 2023年版权,Gurobi优狗万app足彩化,LLC * / / *本例制定和解决以下简单的QP模型:最小化x + y + x ^ 2 + x * y + y ^ 2 + y * z + z ^ 2受x + 2 + 3 z > = 4 x + y > = 1 x, y, z的示例展示了使用非负密度矩阵来存储和Q(和密集的其他相关数据的向量)。我们不建议您使用稠密矩阵,但是这个例子可能是有益的,如果你已经有你的数据在这个格式。* / # include“gurobi_c + +。使用名称空间std h”;静态bool dense_optimize (GRBEnv * env, int, int关口,双c *, / *目标函数的线性部分* /双* Q / *目标函数的二次部分* /双*,/ *约束矩阵* / char *, / *约束感官* /双*,/ * * /双*磅rhs向量,/ *变量下界* /双*乌兰巴托,/ *变量上界* / char * vtype, / *变量类型(连续、二进制等)* /双*解决方案,双* objvalP) {GRBModel模型= GRBModel (* env);int i, j。bool成功= false;/ *向模型中添加变量* / GRBVar * var =模型。vtype addVars(磅,乌兰巴托,空,空,关口);/ *填充矩阵* / (i = 0;我<行;我+ +){GRBLinExpr lh = 0; for (j = 0; j < cols; j++) if (A[i*cols+j] != 0) lhs += A[i*cols+j]*vars[j]; model.addConstr(lhs, sense[i], rhs[i]); } GRBQuadExpr obj = 0; for (j = 0; j < cols; j++) obj += c[j]*vars[j]; for (i = 0; i < cols; i++) for (j = 0; j < cols; j++) if (Q[i*cols+j] != 0) obj += Q[i*cols+j]*vars[i]*vars[j]; model.setObjective(obj); model.optimize(); model.write("dense.lp"); if (model.get(GRB_IntAttr_Status) == GRB_OPTIMAL) { *objvalP = model.get(GRB_DoubleAttr_ObjVal); for (i = 0; i < cols; i++) solution[i] = vars[i].get(GRB_DoubleAttr_X); success = true; } delete[] vars; return success; } int main(int argc, char *argv[]) { GRBEnv* env = 0; try { env = new GRBEnv(); double c[] = {1, 1, 0}; double Q[3][3] = {{1, 1, 0}, {0, 1, 1}, {0, 0, 1}}; double A[2][3] = {{1, 2, 3}, {1, 1, 0}}; char sense[] = {'>', '>'}; double rhs[] = {4, 1}; double lb[] = {0, 0, 0}; bool success; double objval, sol[3]; success = dense_optimize(env, 2, 3, c, &Q[0][0], &A[0][0], sense, rhs, lb, NULL, NULL, sol, &objval); cout << "optimal=" << success << " x: " << sol[0] << " y: " << sol[1] << " z: " << sol[2] << endl; } catch(GRBException e) { cout << "Error code = " << e.getErrorCode() << endl; cout << e.getMessage() << endl; } catch(...) { cout << "Exception during optimization" << endl; } delete env; return 0; }