跳至主内容
框架 无框架

IlcGoalI类

定义文件: ilcp/cpext.h
包含文件: <ilcp/cpextilcp/cpext.h
IlcGoalI地图IlcGoalIIlcGoalI
自定义搜索算法构件的实现类。

目标是 CP Optimizer 中自定义搜索算法的基石。 目标取决于两个类:"IlcGoal和 "IlcGoalIIlcGoal类是句柄类。 类 "IlcGoal实例包含一个数据成员(句柄指针),该数据成员指向 CP 优化堆上分配的类 "IlcGoalI实例(实现对象)。

有关在IBM®ILOG® Concert Technology 模型中使用的目标,请参阅 "IloGoal

如果在 CP 优化器搜索过程中定义了一个新的目标,则必须定义实现类和相应的虚拟成员函数 "execute,以及一个返回句柄类实例 "IlcGoal的函数。

一个目标可以用其他目标(称为子目标)来定义。 有关示例,请参阅函数 "IlcAnd和 "IlcOr。 子目标不会立即执行。 事实上,它会被添加到目标堆栈中,当前目标的 "execute成员函数会在子目标执行前终止。 当目标本身的执行完成后,将返回子目标。

目标也可以定义为在其他目标之间的选择。 这一选择由函数 "IlcOr实现。

更多信息,请参见概念 "CP 优化器中的目标

另请参阅:

方法概要
public virtual IlcGoalexecute()
public voidfail(IlcAny label)
public voidfail()
public IlcCPEnginegetCPEngine() const
public IlcGoalI(IlcCPEngine solver)
方法详细信息

IlcGoalI

publicIlcGoalI(IlcCPEngine solver)

该构造函数创建一个目标实现。 由于这是一个抽象类,因此不应直接调用该构造函数。 子类的构造函数会自动调用该构造函数。


执行

public virtualIlcGoal execute()

当您派生一个新的 "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)));
 }

失败

public voidfailIlcAny label)

该成员函数会导致调用目标失败。 参数 "label会使调用目标在名为 "label的选择点失败。


失败

public voidfail()

该成员函数会导致调用目标失败。


getCPEngine

publicIlcCPEngine getCPEngine() const

该成员函数返回在构建目标时传递的引擎对象。