| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |
目标可用于控制 "
IloCplex中的分支和切分搜索。 目标在 "
IloCplex::GoalI类中实现。
IloCplex::Goal类是句柄类。 也就是说,它包含一个指向 "
IloCplex::GoalI实例的指针,以及实现类中对象的访问器。
要实现自己的目标,需要子类化 "
IloCplex::GoalI,并实现其虚拟成员函数 "execute和 "duplicateGoal。 方法 "execute控制分支和切分搜索。 方法 "duplicateGoal会创建一个调用目标对象的副本,用于并行分支和切割搜索。 如果使用宏 "
ILOCPLEXGOALn,就可以大大简化目标的实现。
每个分支和切割节点都有一个目标堆栈,其中可能包含 "
IloCplex::GoalI对象。 在 "
IloCplex解决了一个节点的松弛问题后,它会从目标堆栈中弹出最上面的目标,并调用其方法 "execute。 目标有几种类型:
OrGoal,"IloCplex将创建子节点。 每个子节点都将使用当前节点的目标堆栈副本进行初始化。 然后,对于每个子节点,"OrGoal中指定的目标都会被推送到子节点的相应目标堆栈中。 最后,删除当前节点。 (详细讨论见 "
IloCplex#GoalI::OrGoal)AndGoal被执行,其子目标就会被简单地推入堆栈。 (详细讨论见 "
IloCplex::GoalI::AndGoal)
IloCplex::GoalI::FailGoal,"
IloCplex将剪切当前节点,即在当前节点停止搜索。 如果树中还有一个节点可用,
IloCplex将继续使用另一个节点。
IloCplex::GoalI::SolutionGoal,"
IloCplex将尝试注入用户提供的解决方案作为新的在位者。 在 CPLEX 接受注入的解决方案之前,它会首先测试注入的解决方案在模型和目标方面是否可行。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::Goal 和 IloCplex::GoalI