跳至主内容
框架 无框架

宏ILOBLACKBOX0

定义文件: ilcp/cpext.h
ILOBLACKBOX0(bbfunc)
ILOBLACKBOX1(bbfunc, bbtype1, bbvar1)
ILOBLACKBOX2(bbfunc, bbtype1, bbvar1, bbtype2, bbvar2)
ILOBLACKBOX3(bbfunc, bbtype1, bbvar1, bbtype2, bbvar2, bbtype3, bbvar3)
ILOBLACKBOX4(bbfunc, bbtype1, bbvar1, bbtype2, bbvar2, bbtype3, bbvar3, bbtype4, bbvar4)
ILOBLACKBOX5(bbfunc, bbtype1, bbvar1, bbtype2, bbvar2, bbtype3, bbvar3, bbtype4, bbvar4, bbtype5, bbvar5)
ILOBLACKBOX6(bbfunc, bbtype1, bbvar1, bbtype2, bbvar2, bbtype3, bbvar3, bbtype4, bbvar4, bbtype5, bbvar5, bbtype6, bbvar6)
宏,用于定义新的黑盒表达式。

黑匣表达式是一种数字表达式,其封闭形式未知,或者无法使用 CP Optimizer 的经典表达式进行公式化。 通过提供对给定点的表达式进行求值的 C++ 代码来指定黑匣表达式。 此函数在解析期间由引擎调用。

该宏定义了一个名为 "bbfunc的黑盒表达式和 "n参数。 当 n 大于零时,黑匣函数自变量的类型和名称必须以自变量形式提供给宏。 每个参数由其类型 "bbtypen和名称 "bbvarn定义。

以下是黑匣表达式 f 的示例:

IloNum PI = 3.14159265358979323846;

ILOBLACKBOX2(f, IloNumExpr, x, IloNumExpr, y) {
  // f(x,y) = cos(4.pi.x) + cos(4.pi.y) + 5(x+y) + 2
  IloNum vx = getValue(x);
  IloNum vy = getValue(y);
  IloNum v = cos(4*PI*vx) + cos(4*PI*vy) + 5*(vx+vy) + 2;
  returnValue(v);
}

可以在具有以下特征符的模型中创建此黑匣表达式的实例,并将其用作 IloNumExpr

IloBlackbox f(IloEnv env, IloNumExpr x, IloNumExpr y);

例如,以下是使用上述黑匣表达式的小型完整模型:

IloEnv env;
IloModel model(env);
IloIntVar x(env, 0, 100, "x");
IloIntVar y(env, 0, 100, "y");
model.add(x <= y); // Symmetry breaking as f(x,y)=f(y,x)
IloNumExpr obj = f(env, x/100.0, y/100.0);
model.add(5*(x+y) <= 100*(1+obj)); // Lower-bounding expression
model.add(IloMinimize(env, obj));
IloCP cp(model);
cp.solve();
env.end();

使用宏 ILOBLACKBOX 定义后,可以使用与模型中的经典数字表达式相同的方式使用黑匣表达式。 特别是,它可以与其他表达式(经典表达式或黑盒表达式)混合,作为目标函数的一部分使用,在约束条件中使用,在其他黑盒表达式的范围内使用,以及作为关键绩效指标或关键绩效指标的一部分使用。

以下函数可用于求值代码以访问黑匣作用域中变量/表达式的当前值:

IloInt  getValue  (IloIntVar x)      const;
IloInt  getValue  (IloIntExpr x)     const;
IloNum  getValue  (IloNumExpr x)     const;
IloBool isPresent (IloIntervalVar x) const;
IloBool isAbsent  (IloIntervalVar x) const;
IloInt  getStart  (IloIntervalVar x) const;
IloInt  getEnd    (IloIntervalVar x) const;
IloInt  getSize   (IloIntervalVar x) const;
IloIntervalVar getFirst(IloIntervalSequenceVar s) const;
IloIntervalVar getLast (IloIntervalSequenceVar s) const;
IloIntervalVar getNext (IloIntervalSequenceVar s, IloIntervalVar x) const;
IloIntervalVar getPrev (IloIntervalSequenceVar s, IloIntervalVar x) const;

黒匣表达式可以通过以下函数返回单个值或多个值:

void returnValue(IloNum val); // Return value of a single value function
void returnValue(IloInt i, IloNum val); // Return ith element of a multiple value function

当黑盒表达式返回一个值向量时,可以使用 "operator[]和 "IloBlackbox访问向量的每个分量:

IloNumExpr IloBlackbox::operator[](IloInt i);

在单个值的较简单情况下,类 IloBlackbox 可以直接用作 IloNumExpr

另请参阅: