数学规划求解器 | 手把手教你CPLEX的安装及PyCharm环境的配置

文摘   2024-10-10 08:31   湖北  

作者刘兴禄




目录

  • 安装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

图1 CPLEX的安装包

安装CPLEX

  • 点击安装,选择确定
图2 点击安装
  • 点击下一步
图3 点击下一步
  • 接受许可协议中的全部条款:这里必须选择接受。
图4 接受许可协议中的全部条款
  • 选择安装目录:这里可以选择默认目录,也可以自定义安装目录。我习惯自定义安装目录,因为默认目录中有空格,也许会导致潜在的麻烦。
图5 选择安装目录
  • 继续下一步
图6 继续下一步
  • 进入安装后步骤:这里有一个安装 Microsoft Visual C++ 2015-2022的选项。如果你的电脑没有安装过这个package,CPLEX不能运行,因此必须安装这个package。如果你之前安装过,则不用在意这一项。
图7 进入安装后步骤
  • 继续安装后骤
图8 继续安装后骤
  • 安装完成
图9 安装完成
  • 自动弹出启动CPLEX的OPL可视化建模界面:OPL语言是CPLEX自带的Optimization Programming Language的缩写,是一种CPLEX自己开发的优化建模语言。可以利用改语言进行建模。也可以使用Python、C、C++、Java、Matlab等语言调用CPLEX相应的API进行建模。这一步可以直接忽略。
图10 自动弹出启动CPLEX的OPL可视化建模界面

CPLEX的OPL建模语言及可视化用户界面

关于CPLEX的OPL建模语言,我之前也出过一期教学视频。感兴趣的小伙伴可以前往学习。


【视频讲解】CPLEX的OPL语言:可视化的优化模型求解解决方案


我在2016年第一次使用CPLEX的时候,用的就是CPLEX的OPL建模语言,如今已经很久不用了。不过虽然OPL建模语言可扩展性有限,但是OPL建模语言的图形化界面自带各种信息统计、可视化等的功能,也有自己的优势

说到这里,我不禁想回味一下8年前的心路历程,结果发现那些代码很难找到了。于是我导入了一些案例,运行查看了一下。如下图所示,可以看到运行结果。从图中也可以观察到上述提及的优势。

图11 OPL建模语言及可视化用户界面

从上图可以观察到,图形界面中包含脚本日志冲突松弛引擎日志等项目。其中:

  • : 该界面会直接输出当前最优解。如果在查看解池的部分切换当前解,则该界面会自动输出响应的解;
  • 冲突: 该界面会显示冲突的约束,便于用户分析不可行的原因,帮助用户诊断模型并修正模型。
  • 引擎日志:对应求解日志。

下面是求解结果界面,可以看到右下角的迭代可视化界面清晰地展示了上下界的迭代过程。其中,黄色方块对应找到了一个可行解。

图12 求解结果界面1

在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。

图13 CPLEX 22.1.0支持的Python版本

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文件安装【需申请许可】

这种方法最保险,不依赖于网络情况。

具体方法如下:

  1. 来到whl文件下载网站https://pypi.org/project/cplex/

这里一般默认是最新版本。

图14 whl文件下载网站
图14-2 whl文件下载网站

如果你安装的CPLEX是老版本,可以在这里寻找对应的找历史版本:

https://pypi.org/project/cplex/#history

图15 whl文件历史版本

比如说,如果你安装的是CPLEX 20.1,则可以下载下面框柱的whl文件。

图16 CPLEX 20.1 whl文件下载界面
  1. 安装whl文件

可以将whl文件放到方便的目录下,比如我直接放在对应Python的安装目录的site-packages目录下,如下图所示。

图16 将whl文件放到方便的位置

接下来打开PyCharm的Terminal界面,如下图所示。

图17 PyCharm的Terminal界面

接下来进入到whl文件的目录。

cd C:\Develop\Python311

然后执行下面的命令:

pip install cplex-22.1.1.2-cp311-cp311-win_amd64.whl

界面显示CPLEX的whl文件安装完成。

图18 CPLEX的whl文件安装完成
  1. 测试是否成功

我们用CPLEX的官方例子来进行测试。官方例子的路径如下图:

图19 Python调用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.030.00.0], senses="LLE")

    obj = [1.02.03.01.0]
    lb = [0.00.00.02.0]
    ub = [40.0, cplex.infinity, cplex.infinity, 3.0]
    cols = [[[01], [-1.01.0]],
            [[012], [1.0-3.01.0]],
            [[01], [1.01.0]],
            [[02], [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.018.0]])

    p.order.set([(18, 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中搜索进行安装

这种方法依赖于网络情况,有可能会安装失败。

  1. Settings -- Project -- Python Interpreter

如下图所示。然后点击右Python Interpreter下面的【+】号

图20 Settings -- Project -- Python Interpreter

在搜索框内搜索cplex,然后点击Install Packages

图21 查找CPLEX安装包
图22 Cplex package安装成功
图22 Cplex package安装成功

第3种:将CPLEX安装目录下对应的cplex文件拷贝到python对应安装目录下的site-packages文件下 【学术许可用这种】

这个方法我试了一下,感觉很管用。

建议用上面两种应该就可以。

几种报错的情况

直接在PyCharm的Terminal中安装,可能会由于网络问题报错

在PyCharm的Terminal中安装,输入如下命令并执行。

 pip install cplex

运行结果如下:

图22-1 由于网络问题报错
图22-2 由于网络问题报错

Pycharm版本和whl文件以及CPLEX版本不适配

  • Pycharm版本和whl文件以及CPLEX版本不适配。
图23 pycharm版本和whl文件以及CPLEX版本不适配






Python学习杂记
数据分析与挖掘、运筹优化、机器学习、AI 、数据可视化等。
 最新文章