Cplex安装与环境配置步骤(C++与Python)

article/2025/3/1 4:00:00

一、Cplex简介

Cplex是IBM公司的一个优化问题求解器。主要用于求解线性规划,混合整数规划、二次规划等问题。
Cplex求解速度快,使用简单易上手。除了自带的语言外,cplex可以利用C++、Java、Python等语言使用。对于运筹优化方向的问题求解事半功倍。

二、Cplex下载与安装

Cplex可以从官方网站利用电子邮件注册下载,网址如下:
https://www.ibm.com/analytics/cplex-optimizer
社区版的可以随便下载,但是变量个数有限制。
安装完成后可以查看版本,这个是社区版。在这里插入图片描述

三、设置环境变量

1.IBM cplex的官方文档《Getting Started with CPLEX》
网址如下 https://www.ibm.com/support/knowledgecenter/SSSA5P_12.7.1/ilog.odms.studio.help/pdf/gscplex.pdf
初次使用 Cplex 的基础文档,里面包含了如何安装使用Cplex及在不同语言环境下的配置方法。
2.设置环境变量在这里插入图片描述
通过对官方文档的查看,在windows中需要配置环境变量。打开控制面板,win10中可以在设置中搜索打开。总体步骤如下:
控制面板—系统—高级—环境变量—系统变量中查看Path—添加图上路径

在这里插入图片描述
笔者的Cplex装在D盘中,所以路径示例如上。

四、配置VS C++ 2019调用 CPLEX 接口

笔者将大部分时间都耗费在了对VS C++的环境配置中,因为采坑不少,所以在此将过程总结出来,希望可以帮助大家减少试错时间。
1.将调试环境修改为 Release x64
将VS调试环境修改为release, x64. 如图所示。(代码是官方示例,附在文末)

在这里插入图片描述
笔者之前没有注意修改调试环境,次次出错。VS调试环境默认是Debug模式。Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。x86平台编译出来的可执行文件都是32位的。x64对应的则是64位的。Cplex是64位的,所以VS中的环境配置也必须是64位

2.将解决方案属性也修改为 Release x64
在解决方案管理器中右键点击测试文件Cplex的属性,配置为release ,x64。
在这里插入图片描述
3.添加include的路径
在c++中调用cplex,需要让vs知道include的各种路径。
具体的办法是:
属性页面——附加包含目录——编辑——点击带星号的文件夹——增加路径
具体的路径需要根据自己电脑上的cplex安装位置匹配。其实就是两个文件夹路径:
cplex\concert\include
cplex\include
在这里插入图片描述
4.链接库
这一步的目的是让 C++ 的 Linker(链接器) 知道cplex以及 Concert 的库在哪里,以便调用。如下图所示:
在这里插入图片描述
5.添加附加依赖项
在这里插入图片描述
将具体的lib链接进去。
D:\Cplex\concert\lib\x64_windows_msvc14\stat_mda\concert.lib
D:\Cplex\cplex\lib\x64_windows_msvc14\stat_mda\cplex12100.lib
D:\Cplex\cplex\lib\x64_windows_msvc14\stat_mda\ilocplex.lib
具体的路径要根据自己文件所在的位置!!!不要直接copy,不然连接器还是找不到

6.添加预处理器指令
在这里插入图片描述
注意不要敲错,添加之后应用。

7.注意调整代码生成的运行库为 多线程DLL(/MD)
一般是默认的,但是笔者踩坑时就是有过因为代码生成的运行库没有调整,因此也列出来以便查阅。
在这里插入图片描述
以上七步结束后,就可以在vs c++ 2019中调用cplex啦~

可以用官方提供的测试代码试试:

#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
int
main(int argc, char** argv)
{IloEnv env;try {IloModel model(env);IloNumVarArray vars(env);vars.add(IloNumVar(env, 0.0, 40.0));vars.add(IloNumVar(env));vars.add(IloNumVar(env));model.add(IloMaximize(env, vars[0] + 2 * vars[1] + 3 * vars[2]));model.add(-vars[0] + vars[1] + vars[2] <= 20);model.add(vars[0] - 3 * vars[1] + vars[2] <= 30);IloCplex cplex(model);if (!cplex.solve()) {env.error() << "Failed to optimize LP." << endl;throw(-1);}IloNumArray vals(env);env.out() << "Solution status = " << cplex.getStatus() << endl;env.out() << "Solution value = " << cplex.getObjValue() << endl;cplex.getValues(vals, vars);env.out() << "Values = " << vals << endl;}catch (IloException& e) {cerr << "Concert exception caught: " << e << endl;}catch (...) {cerr << "Unknown exception caught" << endl;}env.end();return 0;
}

来源:https://www.ibm.com/support/knowledgecenter/SSSA5P_12.7.1/ilog.odms.studio.help/pdf/gscplex.pdf
第12页

五、在python中调用Cplex

在python中调用Cplex的接口相对比较简单,官方文档里给了两条路径。
在这里插入图片描述
但是相对来说还是比较繁琐,其实本身就是调用cplex的库嘛,直接用pip安装第三方库 cplex就可以了。如果用anaconda的话可以直接在anaconda prompt中安装
在这里插入图片描述
But,笔者在多次安装后都提示失败,没有找到相应的版本,无奈准备用官方的方法时,发现cplex文件夹里只支持python3.6 和3.7 的版本。
在这里插入图片描述
而笔者现在用的python和anaconda的python版本都是3.8,所以屡次报错。当然也不需要重新安装了,回滚到python3.7版本就好啦~

以anaconda 为例,利用python -V命令查看目前python版本:
在这里插入图片描述
笔者这里已经回滚到3.7了,如果是3.8及以上,可以利用

conda install python=3.7

**将anaconda的python版本回滚到3.7。**然后就可以利用pip命令在anaconda中安装cplex库啦~注意新版的anaconda里面是搜不到cplex库的,因为目前cplex 12.10.0.0最高只能支持到python3.7。所以相对而言这是一个比较简便的方法。
在这里插入图片描述
安装完cplex包之后环境就配置好啦~可以利用官方提供的代码示例试试!


```python
execfile("cplexpypath.py")
import cplex
from cplex.exceptions import CplexError
import sys# data common to all populateby functions
my_obj = [1.0, 2.0, 3.0]
my_ub = [40.0, cplex.infinity, cplex.infinity]
my_colnames = ["x1", "x2", "x3"]
my_rhs = [20.0, 30.0]
my_rownames = ["c1", "c2"]
my_sense = "LL"def populatebyrow(prob):prob.objective.set_sense(prob.objective.sense.maximize)# since lower bounds are all 0.0 (the default), lb is omitted hereprob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)# can query variables like the following bounds and names:# lbs is a list of all the lower boundslbs = prob.variables.get_lower_bounds()# ub1 is just the first lower boundub1 = prob.variables.get_upper_bounds(0)# names is ["x1", "x3"]names = prob.variables.get_names([0, 2])rows = [[[0,"x2","x3"],[-1.0, 1.0,1.0]],[["x1",1,2],[ 1.0,-3.0,1.0]]]prob.linear_constraints.add(lin_expr = rows, senses = my_sense,rhs = my_rhs, names = my_rownames)# because there are two arguments, they are taken to specify a range# thus, cols is the entire constraint matrix as a list of column vectorscols = prob.variables.get_cols("x1", "x3")def populatebycolumn(prob):prob.objective.set_sense(prob.objective.sense.maximize)prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,names = my_rownames)c = [[[0,1],[-1.0, 1.0]],[["c1",1],[ 1.0,-3.0]],[[0,"c2"],[ 1.0, 1.0]]]prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames,columns = c)
def populatebynonzero(prob):prob.objective.set_sense(prob.objective.sense.maximize)prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,names = my_rownames)prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)rows = [0,0,0,1,1,1]cols = [0,1,2,0,1,2]vals = [-1.0,1.0,1.0,1.0,-3.0,1.0]prob.linear_constraints.set_coefficients(zip(rows, cols, vals))# can also change one coefficient at a time# prob.linear_constraints.set_coefficients(1,1,-3.0)# or pass in a list of triples# prob.linear_constraints.set_coefficients([(0,1,1.0), (1,1,-3.0)])
def lpex1(pop_method):try:my_prob = cplex.Cplex()if pop_method == "r":handle = populatebyrow(my_prob)if pop_method == "c":handle = populatebycolumn(my_prob)if pop_method == "n":handle = populatebynonzero(my_prob)my_prob.solve()except CplexError, exc:print excreturnnumrows = my_prob.linear_constraints.get_num()numcols = my_prob.variables.get_num()print# solution.get_status() returns an integer codeprint "Solution status = " , my_prob.solution.get_status(), ":",# the following line prints the corresponding stringprint my_prob.solution.status[my_prob.solution.get_status()]print "Solution value = ", my_prob.solution.get_objective_value()slack = my_prob.solution.get_linear_slacks()pi = my_prob.solution.get_dual_values()x = my_prob.solution.get_values()dj = my_prob.solution.get_reduced_costs()for i in range(numrows):print "Row %d: Slack = %10f Pi = %10f" % (i, slack[i], pi[i])for j in range(numcols):print "Column %d: Value = %10f Reduced cost = %10f" % (j, x[j], dj[j])my_prob.write("lpex1.lp")if __name__ == "__main__":if len(sys.argv) != 2 or sys.argv[1] not in ["-r", "-c", "-n"]:print "Usage: lpex1.py -X"print " where X is one of the following options:"print " r generate problem by row"print " c generate problem by column"print " n generate problem by nonzero"print " Exiting..."sys.exit(-1)lpex1(sys.argv[1][1])
else:prompt = """Enter the letter indicating how the problem data should be populated:r : populate by rowsc : populate by columnsn : populate by nonzeros\n ? > """r = ’r’c = ’c’n = ’n’lpex1(input(prompt))

来源:https://www.ibm.com/support/knowledgecenter/SSSA5P_12.7.1/ilog.odms.studio.help/pdf/gscplex.pdf
第16页

当然这段python代码还是有些冗杂,后面其实调用的话不需要这么复杂,直接调库,建模,求解就可以啦~

最后感谢各位大佬的经验贴指导!


http://chatgpt.dhexx.cn/article/eCk7tnD6.shtml

相关文章

形状-自适应椭圆

自适应椭圆 根据内容自适应宽高&#xff0c;如果宽高相等&#xff0c;显示为一个圆&#xff0c;宽高不等显示为椭圆&#xff0c;如下图所示&#xff1a; 自适应椭圆实现 想要达到上图所示的效果&#xff0c;我们必须先了解border-radius 的两个特性 border-radius可以单独…

112.(leaflet篇)leaflet椭圆修改

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> …

java panel画椭圆_如何在Java 2D中绘制椭圆?

在Ellipse2D类定义由成帧矩形定义的椭圆。您可以使用double或float值创建椭圆。使用双精度值创建椭圆时&#xff0c;请使用Ellipse2D.Double类。对于浮点值&#xff0c;您可以使用Ellipse2D.Float该类。package org.nhooo.example.geom; import javax.swing.*; import java.awt…

AEJoy —— 随机运动表达式之球面上的随机运动(四)

效果图 原理与代码 现在我们已经掌握了产生随机运动的技巧,让我们做一些有趣的事情。 我们的目标是看看我们是否能在球面上创造随机运动。我们会看到,通过一些几何学,一些三角学和我们的随机运动算法,我们可以解决一些看似不可能的问题。 首先让我们看一看几何学和涉及的…

椭圆伸缩之思考

我们讨论的椭圆缩放基于二维空间&#xff0c;首先给出以下定义及性质&#xff1a; 1 基点&#xff1a;如果选择一个能控制图形比例&#xff08;缩放&#xff09;变换的点&#xff0c;使该点再变换后仍保持不变&#xff0c;则称其为基点&#xff08;不动点&#xff09;。 2 比例…

自由落体java编程_java模拟自由落体运动源代码

简单做了一个 import java.awt.borderlayout; import java.awt.button; import java.awt.color; import java.awt.frame; import java.awt.graphics; import java.awt.panel; import java.awt.point; import java.awt.event.actionevent; import java.awt.event.actionlistener…

点旋转的java算法_点和椭圆(旋转)位置测试:算法

另一种选择是将所有内容都放入2D旋转椭圆的等式中&#xff0c;并查看结果是否小于1 . 因此&#xff0c;如果以下不等式为真&#xff0c;则在椭圆内部有一个点 其中(xp&#xff0c;yp)是点坐标&#xff0c;(x0&#xff0c;y0)是椭圆的中心 . 我实施了一个小的Mathematica程序&am…

(转载)在Eclipse中使用JUnit4进行单元测试(中级篇)

<原文地址如下&#xff1a;http://blog.csdn.net/andycpp/archive/2006/10/09/1327147.aspx> 我们继续对初级篇中的例子进行分析。初级篇中我们使用Eclipse自动生成了一个测试框架&#xff0c;在这篇文章中&#xff0c;我们来仔细分析一下这个测试框架中的每一个细节&…

用Python模拟小球的平抛运动,及其在落地后的运动轨迹

废话不多说&#xff0c;先上效果演示&#xff08;doge&#xff09;: 1、需求分析 给定一个小球&#xff0c;在离地某高度处给予一初始速度&#xff0c;当其撞击到地面后&#xff0c;速度衰减为原来的α倍&#xff0c;当其速度衰减为初始速度的1%后&#xff0c;运动结束。 2、运…

【达内课程】Eclipse中的junit测试

文章目录 简介使用测试1测试2生成测试报告 简介 使用 下载junit 新建一个java项目&#xff0c;把junit jar包放入项目&#xff0c;右键项目&#xff0c;选择properties&#xff0c;把jar包加进来 测试1 创建如下文件 在这里插入代码片如果出错 如果成功 测试2 新建H…

java斜椭圆_JAVA 任意椭圆方向画法

展开全部 使用32313133353236313431303231363533e4b893e5b19e31333332636266 AffineTransform 把Ellipse2D 旋转一下就可以了。 import java.awt.image.BufferedImage; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.Color; import …

从STL的视角,了解下Map、Set、Tuple和Initializer_List的区别

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

用Java模拟行星的运动

这段时间都在寝室里自学Java,就想自己写个小程序玩一玩。同时&#xff0c;我也是个三体迷&#xff0c;就想着能不能用学的Java来模拟一下三体运动。这个程序算是我正式写模拟三体运动前的一个尝试。 一、程序分析 首先来百度一番查一下太阳、水星、金星和地球的各种参数(非精确…

java课程设计旋转的行星_Java编程实现的模拟行星运动示例

本文实例讲述了Java编程实现的模拟行星运动。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 期待了很久的Java语言程序设计也拉下了帷幕&#xff0c;在几个月的时间里基本掌握了java的简单用法&#xff0c;学习了java的主要基础知识&#xff0c;面向对象思想&#xff…

JS-圆,椭圆等轨迹相关算法

圆 公式 (x0, y0) 圆心坐标 r&#xff1a;半径 x x0 cos(angle) * r y y0 sin(angle) * r 1、轨迹 <div id"div" style"position:relative; width: 20px; height: 20px; background: cadetblue;"></div><script>/*** 圆心 (x0, y0…

精确绘制椭圆

本文首发于微信公众号「3D视觉工坊」。 前言 圆特征在测量领域中应用广泛&#xff0c;比如&#xff1a;相机标定、位姿估计、目标跟踪等方面。圆经过透视投影&#xff0c;当成像平面与圆平面不平行时&#xff0c;圆经过透视投影为椭圆&#xff0c;圆心的透视投影点与椭圆的中…

cesium椭圆编辑椭圆修改(cesium篇.78)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前必须先查看该博客) 完整代码工程包下载 运行如有问题,可“私信”博主。效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en

JS小球绕着椭圆形的轨迹旋转并且近大远小

在ivx中案例如下&#xff1a; VxEditor 效果如下&#xff0c;近大远小 主要代码如下&#xff1a; const centerX 360 / 2; // 椭圆中心的X坐标 const centerY 120 / 2; // 椭圆中心的Y坐标 const a 100; // 长半轴 const b 60; // 短半轴const elementsWithClassName d…

知识图谱实战应用2-知识图谱的知识融合与知识消歧

大家好,我是微学AI,今天给大家带来知识图谱实战应用2-知识图谱的知识融合与知识消歧。 知识图谱是用于表示语义化信息的一种图形化知识表示形式,其中包含了大量的实体、属性和关系。由于知识图谱是由不同来源的知识组成的,因此可能存在同一实体在不同知识源中有不同的表达…

【知识图谱】深入浅出讲解知识图谱(技术、构建、应用)

本文收录于《深入浅出讲解自然语言处理》专栏&#xff0c;此专栏聚焦于自然语言处理领域的各大经典算法&#xff0c;将持续更新&#xff0c;欢迎大家订阅&#xff01;个人主页&#xff1a;有梦想的程序星空个人介绍&#xff1a;小编是人工智能领域硕士&#xff0c;全栈工程师&a…