我正在尝试使用 SCIP 解决简单的优化问题,但 SCIPsolve 方法返回异常。
问题是: 最小化 x + y + z 服从: x y z = 1 其中 x、y 和 z 是整数
源代码如下。有人知道这段代码有什么问题吗?
我在 Visual Studio 2010 和 2012 中尝试了此代码。我使用了来自http://scip.zib.de/的最新版本的 SCIP 源代码和库
// 1. Initializing the SCIP environment
SCIP* scip;
SCIP_CALL(SCIPcreate(&scip));
// 2. Load all desired plugins
SCIP_CALL(SCIPincludeDefaultPlugins(scip));
// 3. Creating a problem
SCIP_CALL(SCIPcreateProb(scip, "Example", NULL, NULL, NULL, NULL, NULL, NULL, NULL));
// 4. Creating variables
SCIP_VAR *x, *y, *z;
SCIP_CALL(SCIPcreateVar(scip, &x, "x", -1, 1, 1.0, SCIP_VARTYPE_INTEGER, TRUE, FALSE, NULL, NULL, NULL, NULL, NULL));
SCIP_CALL(SCIPcreateVar(scip, &y, "y", -1, 1, 1.0, SCIP_VARTYPE_INTEGER, TRUE, FALSE, NULL, NULL, NULL, NULL, NULL));
SCIP_CALL(SCIPcreateVar(scip, &z, "z", -1, 1, 1.0, SCIP_VARTYPE_INTEGER, TRUE, FALSE, NULL, NULL, NULL, NULL, NULL));
// 5. Creating constraint
SCIP_EXPR* exprx;
SCIP_EXPR* expry;
SCIP_EXPR* exprz;
SCIP_CALL(SCIPexprCreate(SCIPblkmem(scip), &exprx, SCIP_EXPR_VARIDX, 0));
SCIP_CALL(SCIPexprCreate(SCIPblkmem(scip), &expry, SCIP_EXPR_VARIDX, 1));
SCIP_CALL(SCIPexprCreate(SCIPblkmem(scip), &exprz, SCIP_EXPR_VARIDX, 2));
/* setup monomial for x*y*z */
SCIP_Real exponents[3] = { 1.0, 1.0, 1.0 };
SCIP_EXPRDATA_MONOMIAL* monomial;
SCIP_Real one = 1.0;
SCIP_CALL(SCIPexprCreateMonomial(SCIPblkmem(scip), &monomial, one, 3, NULL, exponents));
/* create polynomial expression x*y*z */
SCIP_EXPR* expr;
SCIP_EXPR* children[3] = {exprx, expry, exprz};
SCIP_CALL(SCIPexprCreatePolynomial(SCIPblkmem(scip), &expr, 3, children, 1, &monomial, 0.0, FALSE));
/* setup expression tree with expr as root expression, the tree is defined w.r.t. 3 variables */
SCIP_EXPRTREE* exprtree;
SCIP_CALL(SCIPexprtreeCreate(SCIPblkmem(scip), &exprtree, expr, 3, 0, NULL));
/* assign SCIP variables to tree */
SCIP_VAR* vars[3] = { x, y, z };
SCIP_CALL(SCIPexprtreeSetVars(exprtree, 3, vars));
/* create and add nonlinear constraint x*y*z = 1 */
SCIP_CONS* constraint;
SCIP_CALL(SCIPcreateConsBasicNonlinear(scip, &constraint, "xyz", 0, NULL, NULL, 1, &exprtree, &one, 1.0, 1.0));
SCIP_CALL(SCIPaddCons(scip, constraint));
// 6. Solving the problem
SCIP_CALL(SCIPsolve(scip));