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

这是用户编写的传统回调类的抽象基类。 它提供了通用的应用编程接口(API)。 在优化过程中,回调可能会在不同的位置被重复调用;CPLEX 为每个被调用的回调提供了一个单独的回调类(从该类派生)。 这种回调类将特定的 API 作为受保护的方法提供给特定的实现方法使用。
您不需要创建该类的实例,而是使用它的一个子类来实现您自己的回调。 要使用 "IloCplex实例实现用户编写的回调,请按照以下步骤操作:
MyCallbackI。 派生类只能从一个预定义的回调类继承,即不允许多重继承。main例程。 (所有预定义回调类的构造函数都是受保护的;只有用户编写的派生子类才能调用它们)duplicateCallback。myCallback,在 Concert 技术环境中创建实现类的实例,以便 "IloEnv::end解除实例和实例内部使用的数据结构的分配。 您编写的函数应将实例作为 "IloCplex::Callback的句柄返回。 在编写回调函数时,请使用放置运算符 "new来指定环境,就像这样: MyCallback *myCallback= new(env)MyCallback(env,y, 0, 0);
IloCplex::use。宏 "ILOXXXCALLBACKn("n从 0 到 7)可用于简化步骤 2 至 5,其中 "XXX代表正在构建的特定回调,"n代表除环境参数外,步骤 5 中编写的函数要接收的参数个数。
一个回调实例只能使用一个 "IloCplex实例。 当您使用带有第二个 "IloCplex实例的回调时,将使用方法 "duplicateCallback自动创建一个副本,并使用该副本。
此外,"IloCplex实例在任何时候都只考虑特定回调的一个实例。 也就是说,如果使用相同类别的回调多次调用 "IloCplex::use,则最后一次调用会覆盖之前的调用。 例如,每次只能使用一个原始单工回调,或者每次只能使用一个网络回调,等等。
回调有两种:
IloCplex实例中检索当前解决方案的相关信息。 可用信息取决于您使用的算法(原始单纯形、对偶单纯形、障碍、混合整数或网络)。 例如,查询回调可以返回当前目标值、已完成的单纯形迭代次数以及其他详细信息。 查询回调也可以从预解、探测、小数切割和非连续切割中调用。IloCplex实例中求解 MIP 时,控制回调可以引导搜索。 例如,通过控制回调,可以选择下一个要处理的节点,或控制子节点的创建(还有其他可能性)。绝不能在回调中修改现有的可提取内容。 可以创建和修改临时可提取数据,如数组、表达式和范围约束。 临时可提取物通常很有用,例如用于计算切割。
另请参阅:
ILOBARRIERCALLBACK0, ILOBRANCHCALLBACK0, IloCplex, IloCplex::BarrierCallbackI, IloCplex::BranchCallbackI, IloCplex::Callback, IloCplex::ControlCallbackI, IloCplex::CrossoverCallbackI, IloCplex::UserCutCallbackI, IloCplex::LazyConstraintCallbackI, IloCplex::DisjunctiveCutCallbackI, IloCplex::FlowMIRCutCallbackI, IloCplex::FractionalCutCallbackI, IloCplex::HeuristicCallbackI, IloCplex::IncumbentCallbackI, IloCplex::ContinuousCallbackI, IloCplex::MIPCallbackI, IloCplex::NetworkCallbackI, IloCplex::NodeCallbackI, IloCplex::OptimizationCallbackI, IloCplex::ProbingCallbackI, IloCplex::SimplexCallbackI, IloCplex::SolveCallbackI, IloCplex::TuningCallbackI, ILOCROSSOVERCALLBACK0, ILOBRANCHCALLBACK0, ILODISJUNCTIVECUTCALLBACK0, ILOFLOWMIRCUTCALLBACK0, ILOFRACTIONALCUTCALLBACK0, ILOHEURISTICCALLBACK0, ILOINCUMBENTCALLBACK0, ILOCONTINUOUSCALLBACK0, ILOMIPCALLBACK0, ILONETWORKCALLBACK0, ILONODECALLBACK0, ILOPROBINGCALLBACK0, ILOSIMPLEXCALLBACK0, ILOSOLVECALLBACK0, ILOTUNINGCALLBACK0
| 方法概要 | |
|---|---|
public void | abort() |
protected virtual CallbackI * | duplicateCallback() const |
public IloNum | getCplexTime() const |
public IloNum | getDetTime() const |
public IloNum | getEndDetTime() const |
public IloNum | getEndTime() const |
public IloEnv | getEnv() const |
public IloNum | getStartDetTime() const |
public IloNum | getStartTime() const |
public virtual Callback::Type | getType() const |
protected virtual void | main() |
| 方法详细信息 |
|---|
该方法指示 CPLEX 在用户回调结束后停止当前优化。 请注意,在回调中执行额外的 "IloCplex回调方法会导致不可预测的行为。 例如,"IloCplex::SolveCallbackI::solve或 "IloCplex::BranchCallbackI::makeBranch等回调方法可以覆盖回调状态,从而使优化继续进行。 因此,要有效地终止优化,用户应通过以下方式之一退出回调:
return immediately after the call of abort.IloCplex::CallbackI and its subclasses after abort.必须执行该虚拟方法,才能在同一环境中创建调用回调对象的副本。 对于名为 "MyCallbackI的回调类,以下实现方法通常会有效:
IloCplex::CallbackI* MyCallbackI::duplicateCallback() const {
return (new (getEnv()) MyCallbackI(*this));
} 在两种情况下,"IloCplex对象会调用该方法:
cplex.use(cb)时,回调对象 "cb已被 "IloCplex的另一个实例使用,这时,"cb的实现对象将通过调用 "duplicateCallback创建一个副本,并取而代之。 方法 "use将返回该副本的句柄。IloCplex会通过调用 "duplicateCallback来为其使用的每个回调创建副本。 并行优化器中每多使用一个线程,就会创建一个回调副本。 在优化过程中,每个线程都会调用与线程编号相对应的副本。 回调 API 提供的方法保证线程安全。 不过,在访问传递给回调的参数或存储在回调中的成员时,用户需要通过同步访问或在 "duplicateCallback的实现中创建不同的数据副本来确保线程安全。该方法返回一个时间戳,用于测量以秒为单位的经过时间。
若要测量操作的起点和终点之间的时间,可在起点处使用此方法得出结果;在终点处使用此方法得出结果;用终点时间戳减去起点时间戳;减去的结果就是以秒为单位的已用时间。
所用时间是计算挂钟时间(也称实时时间)还是 CPU 时间,取决于时钟类型参数 "ClockType的设置。
时间戳记的绝对值不具有意义。
该方法以 ticks 为单位返回一个确定的时间戳。
要测量操作起点和终点之间以 ticks 为单位的确定性时间,可使用起点的确定性时间戳;使用终点的确定性时间戳;用终点的确定性时间戳减去起点的确定性时间戳。
确定性时间戳的绝对值没有意义。
该方法返回一个确定性时间戳,指明确定性时限的发生时间。 要计算以 ticks 为单位的剩余时间,请从本方法的结果中减去 "getDetTime的结果。
确定性时间戳的绝对值没有意义。
该方法返回一个时间戳,指明时限发生的时间。 要计算以秒为单位的剩余时间,请从该方法的结果中减去 "getCplexTime的结果。 根据参数 "ClockType设置的时钟类型,计算得出的结果是挂钟时间(也称为实时时间)或 CPU 时间。 时间戳记的绝对值不具有意义。
This method returns the environment belonging to the IloCplex object that invoked the method main.
该方法返回一个确定的时间戳,指明解算过程的启动时间。 要计算以 ticks 为单位的经过时间,请从本方法的结果中减去 "getDetTime的结果。
确定性时间戳的绝对值没有意义。
该方法返回一个时间戳,指明解算过程开始的时间。 要计算以秒为单位的经过时间,请将 "getCplexTime的结果减去该方法的结果。 根据参数 "ClockType设置的时钟类型,计算得出的结果是挂钟时间(也称为实时时间)或 CPU 时间。 时间戳记的绝对值不具有意义。
此方法返回调用回调对象的回调类型。
用户应在派生的回调类中实现该虚拟方法,以定义回调的功能。 当 "IloCplex实例使用回调("IloCplex::CallbackI实例或其派生子类之一)时,"IloCplex会在执行回调的优化过程中调用该虚拟方法 "main。