| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |
黑匣表达式是一种数字表达式,其封闭形式未知,或者无法使用 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。
另请参阅: