SCIP介绍

       SCIP is currently one of the fastest non-commercial solvers for mixed integer programming (MIP) and mixed integer nonlinear programming (MINLP). It is also a framework for constraint integer programming and branch-cut-and-price. It allows for total control of the solution process and the access of detailed information down to the guts of the solver.

背景介绍

      公司最近有算法项目(python3.6)需要部署在centos7服务器上,经过跟算法工程师沟通发现,部署算法项目有一个特别重要的东西就是求解器,本项目中用到了两个求解器cplex和scip,经过部署发现,cplex求解器安装比较简单,可以查看我的另一篇博客 , 比较复杂的就是scip,所以重点介绍。

      安装求解器算法工程师给了一个测试求解器demo如下:

# encoding=utf-8
import numpy as np
import pandas as pd
from pyomo.environ import *
import pyutilib.subprocess.GlobalData
pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False

def object_func(model):
    return model.x + model.y

def constraint_01(model):
    return model.x * model.y >= 10

model = ConcreteModel(name="cplex_test")
model.x = Var(bounds=(1,5),within=NonNegativeReals,initialize=1)
model.y = Var(bounds=(1,5),within=NonNegativeReals,initialize=1)

model.cons = ConstraintList()
model.cons.add(constraint_01(model))
model.obj = Objective(rule=object_func, sense=maximize)

//ampl编译后可执行文件绝对路径
solver_path = '/root/scip/scipoptsuite-5.0.0/scip/interfaces/ampl/bin/scipampl'
opt = SolverFactory('scipampl', executable=solver_path)


results = opt.solve(model, tee=True)
results.write()
print(model.x.value)
print(model.y.value)

      由于网上关于scip安装的帖子都是结合PySCIPOpt使用,我也根据网上的帖子成功安装了scip和PySCIPOpt ,(此帖子在实际安装过程中也遇到了一些问题,稍后再写一篇博客专门介绍)
但是算法工程却要求不使用PySCIPOpt,必须使用pyomo,一是、使用PySCIPOpt相对编码比较复杂,二、由于项目中使用了两个求解器,为了使代码保持统一,所以放弃了使用PySCIPOpt。

      由于之前算法是运行在windows系统上的,通过测试demo就可以看出,solver_path的值就是求解器的可运行程序路径。但是通过实际部署发现,cplex安装成功后,直接可以在安装目录下bin文件下找到一个cplex程序,以此路径作为solver_path即可执行成功。但是scip经过上面介绍的博客安装成功后,能找到可执行文件,却一直报错,在网上找了好多资料也没有解决。

      最终通过请教别人,自己查阅资料还是解决了部署的问题,由于本人是java后台工程师,兼职干一点部署的活,一下子遇到了这么复杂的部署,最终虽然解决了问题,但是整个过程还是有很多不理解,等使用过程中了解的更多以后再补充。

下载地址

https://www.scipopt.org/index.php#download 此处简单说明一下 ,根据官网介绍scipopsuite中包含了scip 所以此处选择下载scipoptsuite源码,版本:5.0.0

解压

将下载的scipoptsuite-5.0.0.tgz 进行解压:

tar -zxvf scipoptsuite-5.0.0.tgz

Python安装

由于公司项目需要,Python大版本必须是3.6,因为网上关于Python教程多如牛毛,此处就不在赘述,贴出我安装使用的教程链接:

安装依赖

sudo yum install -y gmp-devel  gcc-c++  zlib-devel  readline-devel

由于在Python安装过程中已经安装了zlib-devel readline-devel所以只需要安装前面两个即可。

编译scip

cd scipopsuite-5.0.0

make

此处编译过程中问题较多,针对遇到的问题简单整理下:

1. g++ 命令未找到

sudo yum install -y gcc-c++

2. gmp.h没有那个文件或目录

sudo yum install -y gmp-devel

3. zlib.h: 没有那个文件或目录

sudo yum install -y zlib-devel

4. readline/readline.h:没有那个文件或目录

sudo yum install -y readline-devel

5. /usr/bin/ld: cannot find -lc

sudo yum install -y glibc-static libstdc++-static

编译ampl

cd scip/interfaces/ampl/

./get.ASL 

cd solvers

make -f makefile.u

cd .. 

make

如果是在以Centos7为基础镜像的容器里面执行./get.ASL会报

Utility wget not found in your PATH.

使用命令安装wget

yum -y install wget

发现依然这个错,我们打开get.ASL文件查看发现了一个判断语句如下图所示:

centos7 安装 rustdesk_SCIP with AMPL


我们将红线框内的语句在命令行执行,发现为0,然后直接使用which命令查找wget

which get

发现容器内没有which命令,但是容器内有whereis命令,我们只需将该文件内的which改为whereis即可。

测试

命令测试

cd bin

./scipampl

如果出现以下结果说明安装成功:

centos7 安装 rustdesk_centos7 安装 rustdesk_02

代码测试

      1. requirements.txt

numpy
pandas
pyomo
pyutilib

      2. 安装依赖

pip3 install  --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple -r requirements.

      3. 代码运行

python3 cplex_test.py

      4. 运行结果

出现以下结果说明部署成功,并且求解成功:

centos7 安装 rustdesk_Centos7安装SCIP_03