作者:刘兴禄
目录
安装CPLEX
准备好CPLEX的安装包
安装CPLEX
CPLEX的OPL建模语言及可视化用户界面
在PyCharm的terminal中输入
1. 安装CPLEX
2. 核对好Python、CPLEX和PyCharm的版本
3. 在PyCharm中配置CPLEX
几种报错的情况
直接在PyCharm的Terminal中安装,可能会由于网络问题报错
Pycharm版本和whl文件以及CPLEX版本不适配
这是一篇很久之前写好的Python调用CPLEX的笔记,现在分享给大家。
安装CPLEX
准备好CPLEX的安装包
我这里有下面的安装包,可以选择安装其中较新的版本22.1.0
安装CPLEX
点击安装,选择确定
点击下一步
接受许可协议中的全部条款:这里必须选择接受。
选择安装目录:这里可以选择默认目录,也可以自定义安装目录。我习惯自定义安装目录,因为默认目录中有空格,也许会导致潜在的麻烦。
继续下一步
进入安装后步骤:这里有一个安装 Microsoft Visual C++ 2015-2022
的选项。如果你的电脑没有安装过这个package,CPLEX不能运行,因此必须安装这个package。如果你之前安装过,则不用在意这一项。
继续安装后骤
安装完成
自动弹出启动CPLEX的OPL可视化建模界面:OPL语言是CPLEX自带的Optimization Programming Language的缩写,是一种CPLEX自己开发的优化建模语言。可以利用改语言进行建模。也可以使用Python、C、C++、Java、Matlab等语言调用CPLEX相应的API进行建模。这一步可以直接忽略。
CPLEX的OPL建模语言及可视化用户界面
关于CPLEX的OPL建模语言,我之前也出过一期教学视频。感兴趣的小伙伴可以前往学习。
【视频讲解】CPLEX的OPL语言:可视化的优化模型求解解决方案
我在2016年第一次使用CPLEX的时候,用的就是CPLEX的OPL建模语言,如今已经很久不用了。不过虽然OPL建模语言可扩展性有限,但是OPL建模语言的图形化界面自带各种信息统计、可视化等的功能,也有自己的优势。
说到这里,我不禁想回味一下8年前的心路历程,结果发现那些代码很难找到了。于是我导入了一些案例,运行查看了一下。如下图所示,可以看到运行结果。从图中也可以观察到上述提及的优势。
从上图可以观察到,图形界面中包含
脚本日志
,解
,冲突
,松弛
,引擎日志
等项目。其中:
解
: 该界面会直接输出当前最优解。如果在查看解池的部分切换当前解,则该界面会自动输出响应的解;冲突
: 该界面会显示冲突的约束,便于用户分析不可行的原因,帮助用户诊断模型并修正模型。引擎日志
:对应求解日志。
下面是求解结果界面,可以看到右下角的迭代可视化界面清晰地展示了上下界的迭代过程。其中,黄色方块对应找到了一个可行解。
在PyCharm的terminal中输入
由于目前大部分用户都在使用Python,因此我们在这里讲解如何完成Pycharm中CPLEX的配置。
1. 安装CPLEX
该步骤见上述内容。
2. 核对好Python、CPLEX和PyCharm的版本
CPLEX、Python,PyCharm的版本需要兼容。
CPLEX 22.1.0支持的Python版本有:3.6 ~ 3.11。不知道为啥这里没显示3.11。
PyCharm也会有对应的Python版本。比如我目前用的PyCharm 2023.03版本,对应 python 3.11。
因此,我这边选择的版本如下:
CPLEX:22.1.0 Python: 3.11 PyCharm: 2023.03
读者可以根据自己安装的版本自行对应。
3. 在PyCharm中配置CPLEX
在PyCharm中配置CPLEX与在PyCharm中安装Scipy, Numpy, Pandas等包类似。
我们介绍下面几种方法。
第一种:直接上官网下载whl文件安装【需申请许可】
这种方法最保险,不依赖于网络情况。
具体方法如下:
来到whl文件下载网站: https://pypi.org/project/cplex/
这里一般默认是最新版本。
如果你安装的CPLEX是老版本,可以在这里寻找对应的找历史版本:
https://pypi.org/project/cplex/#history
比如说,如果你安装的是CPLEX 20.1,则可以下载下面框柱的whl文件。
安装whl文件
可以将whl文件放到方便的目录下,比如我直接放在对应Python的安装目录的site-packages
目录下,如下图所示。
接下来打开PyCharm的Terminal
界面,如下图所示。
接下来进入到whl文件的目录。
cd C:\Develop\Python311
然后执行下面的命令:
pip install cplex-22.1.1.2-cp311-cp311-win_amd64.whl
界面显示CPLEX的whl文件安装完成。
测试是否成功
我们用CPLEX的官方例子来进行测试。官方例子的路径如下图:
我们选用mipex3.py
来测试,具体地爱吗如下:
#!/usr/bin/python
# ---------------------------------------------------------------------------
# File: mipex3.py
# Version 22.1.0
# ---------------------------------------------------------------------------
# Licensed Materials - Property of IBM
# 5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55 5655-Y21
# Copyright IBM Corporation 2009, 2022. All Rights Reserved.
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with
# IBM Corp.
# ---------------------------------------------------------------------------
"""
Entering and optimizing a MIP problem with SOS sets and priority orders.
Is a modification of mipex1.py.
Note that the problem solved is slightly different than mipex1.py so that
the output is interesting.
To run from the command line, use
python mipex3.py
"""
import cplex
def setproblemdata(p):
p.objective.set_sense(p.objective.sense.maximize)
p.linear_constraints.add(rhs=[20.0, 30.0, 0.0], senses="LLE")
obj = [1.0, 2.0, 3.0, 1.0]
lb = [0.0, 0.0, 0.0, 2.0]
ub = [40.0, cplex.infinity, cplex.infinity, 3.0]
cols = [[[0, 1], [-1.0, 1.0]],
[[0, 1, 2], [1.0, -3.0, 1.0]],
[[0, 1], [1.0, 1.0]],
[[0, 2], [10.0, -3.5]]]
p.variables.add(obj=obj, lb=lb, ub=ub, columns=cols,
types="CIII", names=["0", "1", "2", "3"])
p.SOS.add(type="1", SOS=[["2", "3"], [25.0, 18.0]])
p.order.set([(1, 8, p.order.branch_direction.up),
("3", 7, p.order.branch_direction.down)])
p.order.write("mipex3.ord")
return
def mipex3():
p = cplex.Cplex()
p.parameters.preprocessing.presolve.set(
p.parameters.preprocessing.presolve.values.off)
p.parameters.preprocessing.aggregator.set(0)
p.parameters.mip.interval.set(1)
setproblemdata(p)
print()
print("Parameters not at their default value:")
print(" ", p.parameters.get_changed())
print()
p.solve()
sol = p.solution
p.write("mip3.mps")
print()
# solution.get_status() returns an integer code
print("Solution status = ", sol.get_status(), ":", end=' ')
# the following line prints the corresponding string
print(sol.status[sol.get_status()])
print("Solution value = ", sol.get_objective_value())
numcols = p.variables.get_num()
numrows = p.linear_constraints.get_num()
for j in range(numrows):
print("Row %d: Slack = %10f" % (j, sol.get_linear_slacks(j)))
for j in range(numcols):
print("Column %d: Value = %10f" % (j, sol.get_values(j)))
if __name__ == "__main__":
mipex3()
测试结果如下:
Version identifier: 22.1.1.0 | 2023-06-15 | d64d5bd77
CPXPARAM_Preprocessing_Aggregator 0
CPXPARAM_Preprocessing_Presolve 0
CPXPARAM_Read_DataCheck 1
CPXPARAM_MIP_Interval 1
Found incumbent of value 46.000000 after 0.00 sec. (0.00 ticks)
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 20 threads.
Root relaxation solution time = 0.00 sec. (0.00 ticks)
Nodes Cuts/
Node Left Objective IInf Best Integer Best Bound ItCnt Gap
* 0+ 0 46.0000 0.00%
0 0 64.0000 1 46.0000 64.0000 3 39.13%
* 0 0 integral 0 56.0000 3 ---
Elapsed time = 0.02 sec. (0.02 ticks, tree = 0.01 MB, solutions = 2)
Root node processing (before b&c):
Real time = 0.02 sec. (0.02 ticks)
Parallel b&c, 20 threads:
Real time = 0.00 sec. (0.00 ticks)
Sync time (average) = 0.00 sec.
Wait time (average) = 0.00 sec.
------------
Total (root+branch&cut) = 0.02 sec. (0.02 ticks)
Solution status = 101 : MIP_optimal
Solution value = 56.0
Row 0: Slack = 33.000000
Row 1: Slack = 11.000000
Row 2: Slack = 0.000000
Column 0: Value = 40.000000
Column 1: Value = 7.000000
Column 2: Value = 0.000000
Column 3: Value = 2.000000
成功!!!
第2种:在PyCharm的Setting中搜索进行安装
这种方法依赖于网络情况,有可能会安装失败。
Settings -- Project -- Python Interpreter
如下图所示。然后点击右Python Interpreter下面的【+】号
在搜索框内搜索cplex
,然后点击Install Packages
。
第3种:将CPLEX安装目录下对应的cplex文件拷贝到python对应安装目录下的site-packages文件下 【学术许可用这种】
这个方法我试了一下,感觉很管用。
建议用上面两种应该就可以。
几种报错的情况
直接在PyCharm的Terminal中安装,可能会由于网络问题报错
在PyCharm的Terminal中安装,输入如下命令并执行。
pip install cplex
运行结果如下:
Pycharm版本和whl文件以及CPLEX版本不适配
Pycharm版本和whl文件以及CPLEX版本不适配。