跳至主内容
框架 无框架

CPLEX 中的目标
上一页 下一页

目标可用于控制 " IloCplex中的分支和切分搜索。 目标在 " IloCplex::GoalI类中实现。 IloCplex::Goal类是句柄类。 也就是说,它包含一个指向 " IloCplex::GoalI实例的指针,以及实现类中对象的访问器。

要实现自己的目标,需要子类化 " IloCplex::GoalI,并实现其虚拟成员函数 "execute和 "duplicateGoal。 方法 "execute控制分支和切分搜索。 方法 "duplicateGoal会创建一个调用目标对象的副本,用于并行分支和切割搜索。 如果使用宏 " ILOCPLEXGOALn,就可以大大简化目标的实现。

每个分支和切割节点都有一个目标堆栈,其中可能包含 " IloCplex::GoalI对象。 在 " IloCplex解决了一个节点的松弛问题后,它会从目标堆栈中弹出最上面的目标,并调用其方法 "execute。 目标有几种类型:

IloCplex会继续从目标堆栈中弹出目标,直到 "OrGoal或 "FailGoal被执行,或者堆栈变空;如果堆栈变空,它将继续使用内置搜索策略。

预定义目标 "OrGoal和 "AndGoal允许您组合目标。 AndGoal允许您在一个节点上执行不同的目标,而 "OrGoal允许您在新创建的不同节点上执行不同的目标。 在用户编写的目标的返回语句中,这两个目标的常规用法如下:

 
returnAndGoal(OrGoalbranch1,branch2), this);

AndGoal"首先将 "this(当前正在执行的目标)推入目标堆栈,然后推入 "OrGoal。 因此,"OrGoal位于堆栈顶部,接下来将被执行。 当 "OrGoal执行时,它会创建两个新节点,并将剩余的目标堆栈复制到这两个节点上。 因此,此时两个新节点的目标堆栈顶部都将是 "this目标。 然后,"OrGoal继续将 "branch1推送到第一个子节点的目标堆栈,并将 "branch2推送到第二个子节点的目标堆栈。 通常,"branch1和 "branch2包含切割目标,因此通过在相应的子节点上执行 "branch1和 "branch2,子节点将被限制为代表比父节点更小的子问题。 branch1和 "branch2执行完毕后,"this位于两个子节点的节点栈顶端;也就是说,两个子节点将根据相同的规则继续分支。 总之,本例创建了分支 "branch1和 "branch2,并在这两个分支中继续控制相同的搜索策略 "this

要使用目标执行搜索,需要调用以目标为参数的方法 "IloCplex::solve(goal)(而不是标准的 "IloCplex::solve)来求解提取的模型。 在调用标准的 "solve之前,"solve(goal)方法只是将 "goal推入根节点的目标堆栈。

另请参阅

IloCplex::GoalIloCplex::GoalI

上一页 下一页