问题描述
cvxpy调用cvxopt集成的glpk时,一直提示Long-step dual simplex will be used
问题原因
直接使用pip 安装的cvxopt默认集成4.65版本的glpk,如【1】所述,该版本glpk/src/draft/glpios03.c第 923-930 行输出上述提示。
解决办法
- 卸载cvxopt,安装最新版本的glpk(5.0版本)
- cxvopt基于源代码重新安装,手动修改、配置其内部集成的glpk版本
具体操作
注:本人使用conda创建了虚拟变量(pytorch),故所有操作在该虚拟环境变量下完成。
- 激活虚拟环境变量 source activate pytorch
- 卸载cvxopt pip uninstall cvxopt
- 从【5】中下载并安装最新版本的glpk,具体操作如下,安装完成后在/usr/local/bin及/usr/local/lib可找到相关文件
# 同时下载sig文件和程序文件,x和y表示版本信息
# 1. 完成sig认证
gpg --verify glpk-x.y.tar.gz.sig
# 2. 解压缩程序文件
gzip -d glpk-x.y.tar.gz
tar -x < glpk-x.y.tar
# 3. 配置包
./configure
# 4. 编译
make
# 5. 安装(一定要用sudo安装)
sudo make install 确保在pytorch环境中 -
确保在pytorch环境下,安装如下包:
sudo apt-get install -y libsuitesparse-dev libblas-dev liblapack-dev -
在pytorch环境下,修改cvxopt文件夹下的setup.py文件的第38、41、43行,具体修改如下:
-
# Set to 1 if you are installing the glpk module. BUILD_GLPK = 1 # Directory containing libglpk (used only when BUILD_GLPK = 1). GLPK_LIB_DIR = '/usr/local/lib' #glpk实际的安装位置 # Directory containing glpk.h (used only when BUILD_GLPK = 1). GLPK_INC_DIR = '/usr/local/include'
-
-
在pytorch环境下,执行pip setup.py install
-
使用如下代码进行测试,如不再输出:Long-step dual simplex will be used, 表示安装成功;反之,不成功。
-
import cvxpy as cp # Create two scalar optimization variables. x = cp.Variable() y = cp.Variable() # Create two constraints. constraints = [x + y == 1, x - y >= 1] # Form objective. obj = cp.Minimize(x - y) # Form and solve problem. prob = cp.Problem(obj, constraints) prob.solve(solver='GLPK_MI',cvxopt_params={'msg_lev':'GLP_MSG_OFF'})
-
注意事项
- glpk的卸载方式是在glpk文件根目录下执行sudo make uninstall,重新安装时需将整个glpk文件夹删除,重新解压缩
参考文献
[1]python - Stop GLPK from printing log messages when using cvxpy - Stack Overflow
Installation instructions — CVXOPT
[3]GLPK - GNU Project - Free Software Foundation (FSF3)
[4]GitHub - cvxopt/cvxopt: CVXOPT -- Python Software for Convex Optimization