简单优化程序的 SCIPsolve 失败

SCIPsolve fails for the simple optimization program

我正在尝试使用 SCIP 解决简单的优化问题,但是方法 SCIPsolve returns 异常。

问题是:最小化 x + y + z 受制于:xyz = 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));

在第 4 步中,您错过了向 SCIP 添加变量 (SCIPaddVar)。