Python环境下应用Cplex求解最优化问题CPLEX安装超详细必成功
Python环境下应用Cplex求解最优化问题——CPLEX安装(超详细!必成功!)
1 前提
1.1 前言
免费版本的cplex和docplex在求解问题规模上有着限制,只能求解很小规模的问题。为了不受求解规模的限制,选择安装完整版的cplex12.10(文末附有下载链接),全部选择默认安装。注意,cplex和docplex的安装有所区别,并且不能同时装在一个环境下(多次测试,第二个安装的库无法成功安装),也就是下文1.2和1.3节的安装教程是会有冲突的,读者根据自行需求安装即可。
注意 :python的版本不要超过3.7,否则Cplex不支持,文章默认已经安装对应的Python版本和Cplex12.10,本文使用的是Anaconda和PyCharm。
1.2 安装docplex库
本文在安装Cplex时使用了默认安装位置,建议读者也如此。找到Cplex安装目录,默认位置:C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\python,如下:
复制路径,以管理员的身份打开Anaconda Prompt(!!!不然后面的操作可能会提示权限不足,注意名称不要打开为Anaconda Powershell Prompt):
输入命令进入该路径:
cd C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\python
使用需要创建一个新的python3.7的环境,使用如下命令,
conda create -n pythonForCplex python=3.7
使用如下命令进入刚刚安装好的环境:
conda activate pythonForCplex
接下来使用如下命令在pythonForCplex环境下安装docplex:
python setup.py install
输入命令后,会跳出很多内容,不用在意,只要不提示错误就可以,如下图表示安装成功:
验证是否安装成功,使用如下命令:
python
输入代码:
import docplex
如下图没有任何提示表示安装成功:
注意,虽然此时已经安装成功,并且在pycharm中使用docplex已经可以创建变量、约束、目标函数等,但是在求解时,会出现如下错误提示:
这个错误我没有找到百分百保证解决的办法,我的解决办法(自己试出来的,多次多台设备尝试都可以解决该问题)是找到Cplex安装路径中的:C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\cplex\python\3.7\x64_win64,如下图所示:
复制路径下的cplex文件夹,粘贴到虚拟环境存包的位置(这里注意下图中标红位置,这是Annaconda内创建的虚拟环境。我已经安装了多次,读者创建虚拟环境的路径不一定跟我下图中的一样,你需要找到你的虚拟环境位置,例如我某一次安装的时候,虚拟环境位置为:C:\Users\user1conda\envs\pythonForCplex\Lib\site-packages),如下:
此时,再运行使用docplex库写的文件不会再报错,可以正常求解。 注意 ,使用如我图片中的代码,表示强制本地求解:
至此,可以不受限制的使用docplex求解问题。
1.3 安装cplex库
寻找如下图所示的路径(注意这是Cplex默认安装路径),为C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\cplex\python\3.7\x64_win64。
复制路径,以管理员的身份打开Anaconda Prompt(不这样可能会提示权限不足),输入命令进入该路径:
cd C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\cplex\python\3.7\x64_win64
注意:如果你的python版本是3.6,则在上述路径的“python”文件夹中点击文件夹“3.6”。
接下来使用如下命令在pythonForCplex环境下安装cplex:
python setup.py install
输入命令后,会跳出很多内容,不用在意,只要不提示错误就可以。安装完成后验证是否安装成功,使用如下命令:
python
输入代码:
import cplex
至此,cplex已经安装完成,可以打开pycharm进行代码测试。
1.4 代码测试
安装好库后,可以使用我之前文章中的代码做测试:
1)docplex测试:不会使用docplex的读者可以看
# 导入docplex
from docplex.mp.model import Model
# 创建模型对象
cplex_obj = Model()
# 添加变量
x = cplex_obj.continuous_var(name='x')
y = cplex_obj.continuous_var(name='y')
# 添加约束
cplex_obj.add_constraint(3*x + y <= 10)
cplex_obj.add_constraint(x + 2*y <= 12)
# 添加目标函数
cplex_obj.maximize(2*x + 3*y)
# 求解优化问题
solution = cplex_obj.solve()
# 获取结果
if solution:
print(f"最优值为:{cplex_obj.objective_value:.2f}")
print(f"x的取值为:{x.solution_value:.2f}")
print(f"y的取值为:{y.solution_value:.2f}")
else:
print("求解失败")
2)cplex测试:不会使用cplex的读者可以看
import cplex as cp
# 创建cplex对象
cplex_obj = cp.Cplex()
# 创建连续值变量
x = cplex_obj.variables.add(names=['x'], types=['C'], lb=[0], ub=[10])
y = cplex_obj.variables.add(names=['y'], types=['C'], lb=[0], ub=[10])
# 创建目标函数(线性)
cplex_obj.objective.set_linear([('x', 1.0), ('y', 2.0)])
# 设置优化方向(最大化)
cplex_obj.objective.set_sense(cplex_obj.objective.sense.maximize)
# 添加约束
cplex_obj.linear_constraints.add(lin_expr=[[['x', 'y'], [1.0, 2.0]]], senses=['L'], rhs=[30], names=['st1'])
cplex_obj.linear_constraints.add(lin_expr=[[['x', 'y'], [1.0, 1.0]]], senses=['L'], rhs=[15], names=['st2'])
# 设置名称,测试set_names和get_names
print(cplex_obj.linear_constraints.get_names(1)) cplex_obj.linear_constraints.set_names(1,'st3') print(cplex_obj.linear_constraints.get_names(1))
# 求解问题
cplex_obj.solve()
# 检查求解可行性
if cplex_obj.solution.is_primal_feasible():
print("Solution is feasible")
# 获取解
solution = cplex_obj.solution.get_values()
print(solution)
else:
print("Solution is infeasible")
2 总结
我现在也是一名Cplex求解器的初学者,我的建议是使用docplex库进行python下求最优解,因为这个库的使用会更友好,个人觉得更适合编写优化问题求解。我放弃cplex库的主要原因是在编辑如下的两个变量相乘的约束时不知道如何解决,ChatGPT提示我cplex库不能直接添加如下类型的约束:
cplex12.10不限制求解规模:
阿里云盘:https://www.aliyundrive.com/s/oo1n9jfiCGQ,
百度网盘: 提取码:wcxx。
如果本文对您有帮助,可以点赞收藏支持一下。