Visual Studio(VS2017/VS2019) C++ 配置 CPLEX 教程

简介: Visual Studio(VS2017/VS2019) C++ 配置 CPLEX 教程

一、涉及软件


Visual Studio 2017、Visual Studio 2019

CPLEX 12.9.0



二、配置效果


1、可以实现C++调用CPLEX求解线性规划,混合整数规划等;

2、可以在debug和release两种模式下进行调试或者运行代码





三、配置步骤


1、首先选择代码运行的环境


20210701105646394.png


(1)、将平台设置为x64或者(活动)x64,此处一定需要修改!不能使用x32平台模式


(2)、配置的设置可以根据需要自行选择release模式或者debug模式(作者建议两种都进行配置一下,方便后续使用)





2、打开项目的属性项


20210701101229166.png




3、修改C/C++附加包含目录


20210701101622924.png


这里找到CPLEX的安装目录(根据自己的安装目录进行修改),如本人的是:


(注:下述若不做特殊说明,均需要将目录替换为自己的目录,若安装时没进行修改,从IBM/ILOG/…的目录同下述目录应该相同)


//CPLEX安装目录
D:\Program Files\IBM\ILOG\CPLEX_Studio129\concert\include
D:\Program Files\IBM\ILOG\CPLEX_Studio129\cplex\include


将上述两项加入到附加目录之中,点击确定,效果如下:

20210701102357509.png




4、修改C/C++预处理器中的预处理器定义项

20210701102638816.png


添加下述命令到预处理器定义中(此处无需进行修改,直接复制粘贴就好):

NDEBUG
_CONSOLE
IL_STD




5、修改C/C++代码生成中的运行库

20210701102950615.png

将此处的改为多线程DLL(/MD)或者多线程调试DLL(/MDd)




6、修改链接器常规项中的“附加库目录项”

20210701104452281.png


将下述两个目录添加到“附加库目录项”中,目录地址同上述CPLEX安装目录相同

D:\Program Files\IBM\ILOG\CPLEX_Studio129\concert\lib\x64_windows_vs2017\stat_mda
D:\Program Files\IBM\ILOG\CPLEX_Studio129\cplex\lib\x64_windows_vs2017\stat_mda



7、修改链接器输入中的“附加依赖项”

20210701105221893.png

将下述两个目录添加到“附加库目录项”中,目录地址同上述CPLEX安装目录相同

D:\Program Files\IBM\ILOG\CPLEX_Studio129\concert\lib\x64_windows_vs2017\stat_mda\concert.lib
D:\Program Files\IBM\ILOG\CPLEX_Studio129\cplex\lib\x64_windows_vs2017\stat_mda\cplex1290.lib
D:\Program Files\IBM\ILOG\CPLEX_Studio129\cplex\lib\x64_windows_vs2017\stat_mda\ilocplex.lib


8、 点击确定,点击应用,大功告成!





四、运行测试代码


1、下面给出CPLEX官方测试文档中的cutstock代码进行测试

#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
#define RC_EPS 1.0e-6
static void readData(const char* filename, IloNum& rollWidth,
  IloNumArray& size, IloNumArray& amount);
static void report1(IloCplex& cutSolver, IloNumVarArray Cut,
  IloRangeArray Fill);
static void report2(IloAlgorithm& patSolver,
  IloNumVarArray Use,
  IloObjective obj);
static void report3(IloCplex& cutSolver, IloNumVarArray Cut);
/// MAIN PROGRAM ///
int main(int argc, char **argv)
{
  IloEnv env;
  try {
    IloInt  i, j;
    IloNum      rollWidth;
    IloNumArray amount(env);
    IloNumArray size(env);
    if (argc > 1)
      readData(argv[1], rollWidth, size, amount);
    else
      readData("cutstock.dat",
        rollWidth, size, amount);
    /// CUTTING-OPTIMIZATION PROBLEM ///
    IloModel cutOpt(env);
    IloObjective   RollsUsed = IloAdd(cutOpt, IloMinimize(env));
    IloRangeArray  Fill = IloAdd(cutOpt,
      IloRangeArray(env, amount, IloInfinity));
    IloNumVarArray Cut(env);
    IloInt nWdth = size.getSize();
    for (j = 0; j < nWdth; j++) {
      Cut.add(IloNumVar(RollsUsed(1) + Fill[j](int(rollWidth / size[j]))));
    }
    IloCplex cutSolver(cutOpt);
    /// PATTERN-GENERATION PROBLEM ///
    IloModel patGen(env);
    IloObjective ReducedCost = IloAdd(patGen, IloMinimize(env, 1));
    IloNumVarArray Use(env, nWdth, 0.0, IloInfinity, ILOINT);
    patGen.add(IloScalProd(size, Use) <= rollWidth);
    IloCplex patSolver(patGen);
    /// COLUMN-GENERATION PROCEDURE ///
    IloNumArray price(env, nWdth);
    IloNumArray newPatt(env, nWdth);
    /// COLUMN-GENERATION PROCEDURE ///
    for (;;) {
      /// OPTIMIZE OVER CURRENT PATTERNS ///
      cutSolver.solve();
      report1(cutSolver, Cut, Fill);
      /// FIND AND ADD A NEW PATTERN ///
      for (i = 0; i < nWdth; i++) {
        price[i] = -cutSolver.getDual(Fill[i]);
      }
      ReducedCost.setLinearCoefs(Use, price);
      patSolver.solve();
      report2(patSolver, Use, ReducedCost);
      if (patSolver.getValue(ReducedCost) > -RC_EPS) break;
      patSolver.getValues(newPatt, Use);
      Cut.add(IloNumVar(RollsUsed(1) + Fill(newPatt)));
    }
    cutOpt.add(IloConversion(env, Cut, ILOINT));
    cutSolver.solve();
    cout << "Solution status: " << cutSolver.getStatus() << endl;
    report3(cutSolver, Cut);
  }
  catch (IloException& ex) {
    cerr << "Error: " << ex << endl;
  }
  catch (...) {
    cerr << "Error" << endl;
  }
  env.end();
  return 0;
}
static void readData(const char* filename, IloNum& rollWidth,
  IloNumArray& size, IloNumArray& amount)
{
  ifstream in(filename);
  if (in) {
    in >> rollWidth;
    in >> size;
    in >> amount;
  }
  else {
    cerr << "No such file: " << filename << endl;
    throw(1);
  }
}
static void report1(IloCplex& cutSolver, IloNumVarArray Cut,
  IloRangeArray Fill)
{
  cout << endl;
  cout << "Using " << cutSolver.getObjValue() << " rolls" << endl;
  cout << endl;
  for (IloInt j = 0; j < Cut.getSize(); j++) {
    cout << "  Cut" << j << " = " << cutSolver.getValue(Cut[j]) << endl;
  }
  cout << endl;
  for (IloInt i = 0; i < Fill.getSize(); i++) {
    cout << "  Fill" << i << " = " << cutSolver.getDual(Fill[i]) << endl;
  }
  cout << endl;
}
static void report2(IloAlgorithm& patSolver, IloNumVarArray Use,
  IloObjective obj)
{
  cout << endl;
  cout << "Reduced cost is " << patSolver.getValue(obj) << endl;
  cout << endl;
  if (patSolver.getValue(obj) <= -RC_EPS) {
    for (IloInt i = 0; i < Use.getSize(); i++) {
      cout << "  Use" << i << " = " << patSolver.getValue(Use[i]) << endl;
    }
    cout << endl;
  }
}
static void report3(IloCplex& cutSolver, IloNumVarArray Cut)
{
  cout << endl;
  cout << "Best integer solution uses "
    << cutSolver.getObjValue() << " rolls" << endl;
  cout << endl;
  for (IloInt j = 0; j < Cut.getSize(); j++) {
    cout << "  Cut" << j << " = " << cutSolver.getValue(Cut[j]) << endl;
  }
}


2、首先编译代码,出现下面截图说明配置成功辽

20210701110649913.png


3、给出输入文件信息如下:

115
[25, 40, 50, 55, 70]
[50, 36, 24, 8, 30]




4、运行结果如下:


20210701111039800.png


THE END


谢谢观看,欢迎批评指正













相关文章
|
22天前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
202 4
|
26天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
60 1
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
287 3
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
38 1
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
232 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
3月前
|
NoSQL 编译器 C语言
VSCode配置配置C++环境
VSCode配置配置C++环境
98 1
|
3月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
33 2
|
3月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
98 0
|
5月前
|
存储 算法 编译器
C++ 函数式编程教程
C++ 函数式编程学习
下一篇
无影云桌面