| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |

目标是 CP Optimizer 中自定义搜索算法的基石。 目标取决于两个类:"IlcGoal和 "IlcGoalI。 IlcGoal类是句柄类。 类 "IlcGoal实例包含一个数据成员(句柄指针),该数据成员指向 CP 优化堆上分配的类 "IlcGoalI实例(实现对象)。
有关在IBM®ILOG® Concert Technology 模型中使用的目标,请参阅 "IloGoal。
如果在 CP 优化器搜索过程中定义了一个新的目标类,则必须定义实现类和相应的虚拟成员函数 "execute,以及一个返回句柄类实例 "IlcGoal的函数。
一个目标可以用其他目标(称为子目标)来定义。 有关示例,请参阅函数 "IlcAnd和 "IlcOr。 子目标不会立即执行。 事实上,它会被添加到目标堆栈中,当前目标的 "execute成员函数会在子目标执行前终止。 当目标本身的执行完成后,将返回子目标。
目标也可以定义为在其他目标之间的选择。 这一选择由函数 "IlcOr实现。
更多信息,请参见概念 "CP 优化器中的目标。
另请参阅:
| 方法概要 | |
|---|---|
public virtual IlcGoal | execute() |
public void | fail(IlcAny label) |
public void | fail() |
public IlcCPEngine | getCPEngine() const |
public | IlcGoalI(IlcCPEngine solver) |
| 方法详细信息 |
|---|
该构造函数创建一个目标实现。 由于这是一个抽象类,因此不应直接调用该构造函数。 子类的构造函数会自动调用该构造函数。
当您派生一个新的 "IlcGoalI子类时,必须重新定义该成员函数。 当调用目标从目标堆栈中弹出并执行时,该成员函数将被调用。 如果调用的目标没有子目标,该成员函数应返回 0。 否则,它应该返回目标的子目标。
示例
下面介绍如何定义一类没有子目标的目标。 该目标只是打印作为参数传递的整数。
classPrintXI:publicIlcGoalI{
IlcIntx;
public:
PrintXI(IlcCPEnginecp,IlcIntxx):IlcGoalI(cp), x(xx){}
~PrintXI(){}
IlcGoalexecute() {
IlcCPEngine cp = getCPEngine();
cp.out() <<"PrintX:有一个数据成员的目标" << std::endl;
cp.out() << x << std::endl;
return 0;
}
};
IlcGoal PrintX(IlcCPEnginecp,IlcIntx) {
return newcp.getHeap())PrintXI(cp,x);
}使用宏 "ILCGOAL可以更容易地定义目标。
下面是一个包含一个子目标的目标示例:
ILCGOAL0(Print){
IlcCPEngine cp = getCPEngine();
cp.out() << "在一个子目标之前" << std::endl;
返回PrintX(cp,2);
}目标也可以定义为在其他目标之间的选择。 这一选择由函数 "IlcOr实现。 例如,以下目标有三个选项:
ILCGOAL0(PrintOne) {
IlcCPEngine cp = getCPEngine();
cp.out() << "打印一个" << std::endl;
returnIlcOr(PrintX(cp,1),PrintX(cp,2 PrintX(cp,3)));
}该成员函数会导致调用目标失败。 参数 "label会使调用目标在名为 "label的选择点失败。
该成员函数会导致调用目标失败。
该成员函数返回在构建目标时传递的引擎对象。