跳至主内容
框架 无框架

类IloCplex::CallbackI

定义文件: ilcplex/ilocplexi.h
IloCplex::CallbackI的地图IloCplex::CallbackIIloCplex::OptimizationCallbackIIloCplex::TuningCallbackIIloCplex::CallbackI

这是用户编写的传统回调类的抽象基类。 它提供了通用的应用编程接口(API)。 在优化过程中,回调可能会在不同的位置被重复调用;CPLEX 为每个被调用的回调提供了一个单独的回调类(从该类派生)。 这种回调类将特定的 API 作为受保护的方法提供给特定的实现方法使用。

您不需要创建该类的实例,而是使用它的一个子类来实现您自己的回调。 要使用 "IloCplex实例实现用户编写的回调,请按照以下步骤操作:

  1. 确定要编写哪种回调,并为其选择合适的类。 树状图中的类层次结构可能会给你一些启发。
  2. 例如,从相应的预定义回调类中派生出自己的子类 "MyCallbackI。 派生类只能从一个预定义的回调类继承,即不允许多重继承。
  3. 在回调类的子类中,使用基类中定义的受保护 API 来实现用户编写的回调的 "main例程。 (所有预定义回调类的构造函数都是受保护的;只有用户编写的派生子类才能调用它们)
  4. 在子类中实现方法 "duplicateCallback
  5. 编写函数 "myCallback,在 Concert 技术环境中创建实现类的实例,以便 "IloEnv::end解除实例和实例内部使用的数据结构的分配。 您编写的函数应将实例作为 "IloCplex::Callback的句柄返回。 在编写回调函数时,请使用放置运算符 "new来指定环境,就像这样:
             MyCallback *myCallback= new(env)MyCallback(env,y, 0, 0);
         
  6. 创建回调类的实例,并将其传递给成员函数 "IloCplex::use

宏 "ILOXXXCALLBACKn("n从 0 到 7)可用于简化步骤 2 至 5,其中 "XXX代表正在构建的特定回调,"n代表除环境参数外,步骤 5 中编写的函数要接收的参数个数。

一个回调实例只能使用一个 "IloCplex实例。 当您使用带有第二个 "IloCplex实例的回调时,将使用方法 "duplicateCallback自动创建一个副本,并使用该副本。

此外,"IloCplex实例在任何时候都只考虑特定回调的一个实例。 也就是说,如果使用相同类别的回调多次调用 "IloCplex::use,则最后一次调用会覆盖之前的调用。 例如,每次只能使用一个原始单工回调,或者每次只能使用一个网络回调,等等。

回调有两种:

绝不能在回调中修改现有的可提取内容。 可以创建和修改临时可提取数据,如数组、表达式和范围约束。 临时可提取物通常很有用,例如用于计算切割。

另请参阅:

方法概要
public voidabort()
protected virtual CallbackI *duplicateCallback() const
public IloNumgetCplexTime() const
public IloNumgetDetTime() const
public IloNumgetEndDetTime() const
public IloNumgetEndTime() const
public IloEnvgetEnv() const
public IloNumgetStartDetTime() const
public IloNumgetStartTime() const
public virtual Callback::TypegetType() const
protected virtual voidmain()
方法详细信息

abort

public voidabort()

该方法指示 CPLEX 在用户回调结束后停止当前优化。 请注意,在回调中执行额外的 "IloCplex回调方法会导致不可预测的行为。 例如,"IloCplex::SolveCallbackI::solve或 "IloCplex::BranchCallbackI::makeBranch等回调方法可以覆盖回调状态,从而使优化继续进行。 因此,要有效地终止优化,用户应通过以下方式之一退出回调:


duplicateCallback

保护的虚拟CallbackI*duplicateCallback() 常量

必须执行该虚拟方法,才能在同一环境中创建调用回调对象的副本。 对于名为 "MyCallbackI的回调类,以下实现方法通常会有效:

 IloCplex::CallbackI* MyCallbackI::duplicateCallback() const {

   return (new (getEnv()) MyCallbackI(*this));

 } 

在两种情况下,"IloCplex对象会调用该方法:


getCplexTime

公共IloNum getCplexTime() 常量

该方法返回一个时间戳,用于测量以秒为单位的经过时间。

若要测量操作的起点和终点之间的时间,可在起点处使用此方法得出结果;在终点处使用此方法得出结果;用终点时间戳减去起点时间戳;减去的结果就是以秒为单位的已用时间。

所用时间是计算挂钟时间(也称实时时间)还是 CPU 时间,取决于时钟类型参数 "ClockType的设置。

时间戳记的绝对值不具有意义。


getDetTime

publicIloNum getDetTime() const

该方法以 ticks 为单位返回一个确定的时间戳。

要测量操作起点和终点之间以 ticks 为单位的确定性时间,可使用起点的确定性时间戳;使用终点的确定性时间戳;用终点的确定性时间戳减去起点的确定性时间戳。

确定性时间戳的绝对值没有意义。


getEndDetTime

publicIloNum getEndDetTime() const

该方法返回一个确定性时间戳,指明确定性时限的发生时间。 要计算以 ticks 为单位的剩余时间,请从本方法的结果中减去 "getDetTime的结果。

确定性时间戳的绝对值没有意义。


getEndTime

publicIloNum getEndTime() const

该方法返回一个时间戳,指明时限发生的时间。 要计算以秒为单位的剩余时间,请从该方法的结果中减去 "getCplexTime的结果。 根据参数 "ClockType设置的时钟类型,计算得出的结果是挂钟时间(也称为实时时间)或 CPU 时间。 时间戳记的绝对值不具有意义。


getEnv

publicIloEnv getEnv() const

This method returns the environment belonging to the IloCplex object that invoked the method main.


getStartDetTime

publicIloNum getStartDetTime() const

该方法返回一个确定的时间戳,指明解算过程的启动时间。 要计算以 ticks 为单位的经过时间,请从本方法的结果中减去 "getDetTime的结果。

确定性时间戳的绝对值没有意义。


getStartTime

公共IloNum getStartTime() 常量

该方法返回一个时间戳,指明解算过程开始的时间。 要计算以秒为单位的经过时间,请将 "getCplexTime的结果减去该方法的结果。 根据参数 "ClockType设置的时钟类型,计算得出的结果是挂钟时间(也称为实时时间)或 CPU 时间。 时间戳记的绝对值不具有意义。


getType

公共虚拟Callback::Type getType() 常量

此方法返回调用回调对象的回调类型。


main

protected virtual voidmain()

用户应在派生的回调类中实现该虚拟方法,以定义回调的功能。 当 "IloCplex实例使用回调("IloCplex::CallbackI实例或其派生子类之一)时,"IloCplex会在执行回调的优化过程中调用该虚拟方法 "main