第三天:c++中的cplex设计(初级)

来源:互联网 发布:java鱼雷公路车 编辑:程序博客网 时间:2024/05/21 10:27

CPLEX 对象对于 C++ 应用程序为必需。

清楚地了解 C++ 对象是结合使用 Concert Technology 和 CPLEX 对优化模型进行构建和求解的基础。 这些对象可分为两个类别:

  1. 建模对象用于对优化问题进行定义。 一般情况下,应用程序创建多个建模对象来指定一个优化问题。 这些对象分组在一个表示完整优化问题的IloModel 对象中。

  2. IloCplex 对象用于对已通过建模对象创建的问题进行求解。 IloCplex 对象读取模型并将其数据抽取到 CPLEX 优化器的相应表示法中。 这样,IloCplex 对象便准备就绪,可以对其所抽取的模型求解并接受查询以获取解法信息。

一、构造环境:IloEnv

类IloEnv用于构造CPLEX环境,通常是创建的第一个对象

IloEnv env;

IloEnv是句柄类,只是创建了一个指针,可以:

IloEnv env2=env;

程序结束时需要销毁:

env.end();


二、创建模型

创建环境后,Concert应用程序便准备好创建一个或多个优化模型;

建模对象也称为可抽取对象,因为在您将优化模型抽取到IloCplex . 因此,通过被抽取到 IloCplex 之类的算法的可能性来描述可抽取对象。 实际上,它们全部都是从类IloExtractable 继承而来。 换言之,IloExtractable 是可抽取对象或建模对象的所有类的基类。

最基本的可抽取对象类为 IloModel。 该类的对象用于定义可在稍后抽取到IloCplex 对象的完整优化模型。 您通过构造类型为 IloModel 的对象来创建模型。 例如,为了在名为 env 的现有环境内构造名为 model 的建模对象,可编写以下行:

IloModel model(env);

构造 IloModel 对象后,将使用用于定义优化模型的可抽取对象来对其进行填充。 此处最重要的类包括:


IloNumVar x1(env, 0.0, 40.0, ILOFLOAT);

该定义创建下限为 0.0、上限为 40.0 且类型为 ILOFLOAT(指示此变量为连续变量)的建模变量x1。 其他可能的变量类型包括 ILOINT(针对整数变量)和ILOBOOL(针对布尔型变量)。

对于优化模型中的每个变量,必须创建类 IloNumVar 的一个对应对象。 Concert Technology 提供丰富的方法来帮助您构造所有IloNumVar 对象。

构造所有建模变量之后,它们可用于构建表达式,这些表达式进而用于定义类 IloObjectiveIloRange 的对象。

IloObjective obj = IloMinimize(env, x1 + 2*x2 + 3*x3);

model.add(obj);

通过以下语句可一样轻松地创建约束并将其添加到模型:

model.add(-x1 + x2 + x3 <= 20);


三、对模型求解

IloModel 对象中创建了优化问题后,便应该创建 IloCplex 对象,以通过创建类 IloCplex 的实例来对问题求解。 例如,要创建名为cplex 的对象,请编写以下行:

IloCplex cplex(env);

再次使用环境 env 作为参数。 然后,可以使用 CPLEX 对象抽取要求解的模型。 抽取模型的一种方法是调用cplex.extract(model)。 但是,有经验的 Concert 用户采用一种快捷方法,此方法在一行中执行cplex 对象的构造以及模型的抽取:

IloCplex cplex(model);

此快捷方法有用的原因是,建模对象 model 在其内部包含对名为 env 的环境的引用。

在该行之后,对象 cplex 便准备好对 model 所定义的优化问题进行求解。 要对模型求解,请调用:

cplex.solve ();

该方法会返回 IloBool 值,其中 IloTrue 指示 cplex 已成功找到可行(但不一定最优)的解法,而 IloFalse 指示未找到任何解法。 有关最后一次调用方法 IloCplex::solve 的结果的更准确信息可通过调用以下内容来获取:

cplex.getStatus ();

返回值告诉您 CPLEX 找到的有关模型的信息:它找到最优解法还是仅找到可行解法;它证明模型无边界还是不可行;或者此时是否尚未证明任何内容。 有关求解调用的终止的更详细信息可通过方法IloCplex::getCplexStatus 获取。


四、查询结果

在成功对优化问题求解后,您可能对访问解法感兴趣。 以下方法用于查询一个变量或一组变量的解法值:

IloNum IloCplex::getValue (IloNumVar var) const;void IloCplex::getValues (IloNumArray val,                         const IloNumVarArray var) const;

例如:

IloNum val1 = cplex.getValue(x1);

将建模变量 x1 的解法值存储到 val1 中。 提供了其他方法以用于查询其他解法信息。 例如,可使用以下示例来访问解法的目标函数值:

IloNum objval = cplex.getObjValue ();


五、处理错误

要在 Concert Technology 应用程序中从容地处理异常,可在一个 try/catch 子句中包含所有代码,如以下所示:

IloEnv env;try {// ...} catch (IloException& e) {cerr << "Concert Exception: " << e << endl;} catch (...) {cerr << "Other Exception" << endl;}env.end();



0 0