optimization - IBM ILOG CMPLEX Optimization Studio 中 OPL 接口和 Concert 技术之间的区别
问题描述
我是 IBM CMPLEX Optimization Studio 的新手,我试图了解实现目标的最佳方法是什么。我正在尝试通过为我的问题创建相关表示,然后将其与 CMPLEX 求解器接口来实现决策优化解决方案,以混合整数线性程序表示。
最初,我开始使用 OPL 语言开发模型。但是,由于我打算从我的 C++ 应用程序中使用相同的模型但使用不同的数据动态调用求解器,我意识到构建模型并通过 CMPLEX C++ API(Concert 的一部分)调用求解器更有意义技术(#reff1,#reff2)。当然,与在 OPL 中构建模型并直接运行相比,Concert Technology 公开的用于构建模型的接口要低得多,就表达它的难易程度而言。然后,我了解了“ OPL 接口”,它还公开了一个 C++ API,如果正确理解它,您可以从 OLP 定义加载您的模型并使用自定义数据源,并调用求解器。
所以我的问题是特定语言的 OPL 接口和 CMPLEX API(音乐会技术)如何比较两者是否可以用于相同的目的,以构建和执行优化模型?我了解OPL 接口和 OPL 的 C++ API基于 C++ Concert 技术。如果目标是快速测试模型,但使用 C++ 应用程序动态提供的自定义数据输入,我应该选择 OPL 接口,还是有理由选择 Concert Technology 中的 CMPLEX C++ API 更好?
软件版本:IBM ILOG CMPLEX Optimization Studio 20.1.0
解决方案
与 Alex 的回答相反(我们彼此都很了解!),我绝对建议直接从 C++ 使用 Concert 库 API 调用。在过去的 20 年中,我在许多项目中使用了 OPL,并且我也在许多项目中使用了来自 C++、Java 和 C# 的 Concert API 调用。至少对我来说,我发现将我的建模变量和约束直接集成到我的 C++(或 C# 或 Java)代码中是一个巨大的优势。
如果您来自习惯于建模语言(AMPL、GAMS、MPL 等)的背景,那么当您第一次开始使用 Concert API 时,它可能看起来更复杂或更困难。但是,如果您来自使用 C++、C# 或 Java 的标准编码背景,那么将 CPLEX 视为一组库对象和函数似乎比必须学习另一种专业编程语言更自然。
我们发现,完全使用 C++(或 C# 或 Java)中的 Concert API 会改变您对使用 CPLEX 的看法。与我们合作过的软件开发人员似乎更开心,因为那时 CPLEX 只是我们可以像其他任何软件一样使用的另一款软件。我们可以将 CPLEX IloNumVars 等作为普通 C++ 类中的成员变量,将它们放入字典、列表或数组中;通常将它们视为普通的 C++ 对象。这使您可以轻松地将 CPLEX 建模变量和约束集成到您的软件中。
如果您想使用 OPL,那么它肯定会鼓励(强制执行?)您的标准 (C++) 代码和数学模型内部之间的分离。您可能会发现这是一个优势(以不同的语言单独保存模型)或不是。即使使用 OPL,如果您的数据结构(在数据、数据库或 C++ 中)发生更改,您可能也必须更新 OPL 结构和代码,因此我们发现这通常会给您留下一组额外的东西来保持更新或同步.
真的没有“正确”的选择——它真的取决于你(和你的团队)的偏好。无论您使用 OPL 还是 Concert API,这些都是将您的模型导入 CPLEX 的方法。求解性能应该没有区别
推荐阅读
- docusignapi - 以嵌入模式签署文档并将电子邮件发送到第二个收据
- xcode10 - 在一行中突出显示 Xcode 中的整个方法范围
- python - 无法理解此函数中的关键逗号
- python - 是否有 Python 库或模块可以绘制字母并获取线的 X、Y 坐标?
- c# - GetBytes() 方法为看似相同的字符串返回不同的数组
- python - 在 Python 中的另一个二维数组中搜索二维数组
- gradle - 从 .tar.gz 归档文件中获取 tarball
- angular - power bi 是否嵌入了正确的报告包以用于 Angular 2 及更高版本
- angular - Angular ng-content n 第一个元素
- mongodb - cloneCollection 命令中的 URI 问题