写点什么

优化| 手把手教你学会杉数求解器 (COPT) 的安装、配置与测试

作者:杉数科技
  • 2022 年 2 月 28 日
  • 本文字数:3273 字

    阅读完需:约 11 分钟

优化| 手把手教你学会杉数求解器(COPT)的安装、配置与测试
  • 前言

    线性规划(LP)测试榜单--单纯形法:Benchmark of Simplex LP solvers

    线性规划(LP)测试榜单--内点法:Benchmark of Barrier LP solvers

    混合整数规划(MIP)测试榜单

  • COPT 的申请、安装、配置和测试

    COPT 的许可(license)以及安装包申请

    COPT 的安装

    COPT 许可配置

  • COPT 求解优化模型的测试:python 接口

  • 参考资料


1 前言

最近杉数求解器发布了 4.0.2 版本。著名的优化求解器 benchmark 测评的官网也更新了最近的榜单。

网址如下:

Benchmarks for Optimization Software - Hans Mittelmann

http://plato.asu.edu/bench.html


在这里插入图片描述

线性规划(LP)测试榜单--单纯形法:Benchmark of Simplex LP solvers

单纯形法目前COPT排名第一,阿里的MindOpt紧随其后,Gurobi排名第三。COPT略微领先于MindOpt。COPT、MindOpt、Gurobi是榜上唯三的解决了所有的40个问题的3个求解器。

在这里插入图片描述

线性规划(LP)测试榜单--内点法:Benchmark of Barrier LP solvers

内点法目前COPT也是在榜单中排名第一,Gurobi紧跟其后,差距非常小。



混合整数规划(MIP)测试榜单

MIP 的 benchmark 数据集有 3 个,如下图所示。

我们只看第一个,也就是MILP Benchmark - MIPLIB2017 (2-5-2022)

根据结果可知,在MILP Benchmark - MIPLIB2017 (2-5-2022)测试榜单中,Gurobi稳居第一,以较大优势领先其他求解器。COPT排名第二,跟Gurobi仍然有一些差距。运行速度方面

  • 单线程(1 thread):Gurobi:COPT = 1: 4.19;

  • 8 线程(8 threads):Gurobi:COPT = 1: 3.50。



可见COPT目前速度也已经慢慢具有较强的竞争力,大家可以去愉快地尝试使用了。小编也是期待了很久,最近也决定尝试学习和使用COPT了。

看完了这些,我们来进入主题,开始 COPT 的安装、配置和测试。

2COPT 的申请、安装、配置和测试

COPT 的许可(license)以及安装包申请

同学们可以在下面的网址填写信息申请 License 和安装包,目前网址不支持直接下载安装包。COPT 会通过邮件的方式将安装包和 license 发送给你。

  • 申请网址:https://www.shanshu.ai/copt

申请界面如下:

在这里插入图片描述

注意事项:申请界面的用户账号, 需要通过上图中如何获取用户账号名称里面的方法获得,不要想当然地乱写,否则申请的 license 是不匹配的。

  1. 如果用学校的邮箱申请。license 是 365 天。

  2. 如果是用自己的 163,qq, gmail 等邮箱申请,License 的有效期是 6 个月。这是之前用 163 邮箱申请的情况

  1. 这是用学校邮箱申请的情况


COPT 的安装

上图提供了两个链接,分别是

  • https://pub.shanshu.ai/download/copt/4.0.2/win64/CardinalOptimizer-4.0.2-win64-installer.zip

  • https://pub.shanshu.ai/download/copt/4.0.2/win64/CardinalOptimizer-4.0.2-win64.zip建议下载第一个,这个比较方便。原因是:第一个不用自己配置环境变量,COPT在安装的过程中会自动地配置环境变量。

下载之后,我们解压安装即可。

安装界面就是一直 next 就好,这里不再赘述。

在这里插入图片描述

COPT 许可配置

COPT必须要配置相应的许可文件才能正常使用。license 就在回复你的邮件中,如下图所示

配置许可的方法就是

  1. 以管理员身份打开命令行win+R + cmd

  2. 切换到 COPT 的安装目录下,如果你没有修改目录的话,默认目录是C:\Program Files\COPT",我们执行命令cd C:\Program Files\COPT

  3. 执行命令:copt_licgen -key 你的license,例如copt_licgen -key copt_licgen -key 19200817f147gd9f60abc791def047fb注意中间的空格。

  4. 执行完毕后,你的用户根目录下会自动生成两个授权文件:license.dat 和license.key这两个文件你可以通过搜索找到,也可以直接到相应目录下去找。我的电脑是在这里


  1. 完成这一步,别忘了最后一步。将license.dat 和license.key拷贝到 COPT 的安装目录下,也就是拷贝到C:\Program Files\COPT"下。如下图。大功告成!可以开始写代码了。


3COPT 求解优化模型的测试:python 接口

我们用一个非常简单的线性规划模型来测试一下。

例子如下:


Python 调用 COPT 建模的程序跟其他求解器基本一致,但是不同于Gurobi,COPT 需要首先创建一个环境(也就是创建一个 Envr 类的实例),然后用这个 Envr 实例,调用函数createModel来建立模型。下面是一个例子:

from coptpy import * 
# Create COPT environment env = Envr()
# create modelmodel = env.createModel("LP example") 
复制代码

建模过程主要用到的函数如下:

  • 创建环境+创建模型:Envr()Envr.createModel(name)

  • 创建决策变量: Model.addVar(lb=0.0, ub=COPT.INFINITY, obj=0.0, vtype=COPT.CONTINUOUS, name="", column=None)

  • 设置目标函数:Model.setObjective(expr, sense=None)

  • 添加约束:Model.addConstr(lhs, sense=None, rhs=None, name="")

  • 创建线性表达式: LinExpr(arg1=0.0, arg2=None)-

     注意,COPT 中,LinExpr 对象的addTerm()函数,第一个位置是系数(coef),第二个位置是变量(var),比如

     expr = LinExpr(); 

     expr.addTerm(1, x_1);

  • 求解模型:Model.solve()注意,目前4.0.2版本及更早的版本,暂时还不支持callback。

  • 设置求解参数(求解时间,Gap 等):Model.setParam(paramname, newval)

     设置求解时间:m.setParam(COPT.Param.TimeLimit, 3600)

     设置求解 MIP 的求解 Gap:model.setParam(COPT.Param.RelGap, 0.1)

  • 输出目标值:model.objval

  • 输出解的值和变量名

    Model.getVars():获得模型的所有变量;

    var.index:获得变量的 index,这个不同于变量名,只是一个序号;

    var.x: 获得变量在最优解中的取值;

    var.getName(): 获得变量名。

下面我们来完整地写出上面的例子并求解,输出解的信息。完整代码如下:

from coptpy import * 
# Create COPT environment env = Envr()
# create modelmodel = env.createModel("LP example") 
# create variables x1 = model.addVar(lb=0, ub=COPT.INFINITY, vtype = COPT.CONTINUOUS, name="x1")x2 = model.addVar(lb=0, ub=COPT.INFINITY, vtype = COPT.CONTINUOUS, name="x2")
# create objectivemodel.setObjective(8*x1 + 5*x2, sense=COPT.MAXIMIZE)
# create constraintsmodel.addConstr(x1 + x2 <= 6)model.addConstr(9*x1 + 5*x2 <= 45)
# solve and output the optimal solutionmodel.solve()
print("Objective value: {}".format(model.objval))print("Variable solution:")
for var in model.getVars():    print(" x[{0}]: {1}".format(var.index, var.x))
复制代码

求解结果如下

Hardware has 8 cores and 16 threads. Using instruction set X86_NATIVE (1)Maximizing an LP problem
The original problem has:    2 rows, 2 columns and 4 non-zero elementsThe presolved problem has:    2 rows, 2 columns and 4 non-zero elements
Starting the simplex solver using up to 8 threads
Method   Iteration           Objective  Primal.NInf   Dual.NInf        TimeDual             0    7.0451048183e+01            2           0       0.01sDual             2    4.1250756485e+01            0           0       0.01sPostsolvingDual             2    4.1250000000e+01            0           0       0.01s
Solving finishedStatus: Optimal  Objective: 4.1250000000e+01  Iterations: 2  Time: 0.01sObjective value: 41.25Variable solution: x[0]: 3.75 x[1]: 2.25
复制代码

从上述求解日志和求解结果来看,COPT 使用了对偶单纯形法(dual simplex)求解该问题,迭代了 2 步。

COPT的建模语法、求解日志信息与其他求解器(例如Gurobi)也是类似的风格,用户学习成本极低。

开心,接下就可以进一步研究更多的用法了。之后有空我会陆续推出基于 COPT 的推文。希望对大家有帮助。

4 参考资料

[1]: 杉数科技官网: https://www.shanshu.ai/copt

[2]: 杉数求解器用户手册 4.0.2.

用户头像

杉数科技

关注

服务逾20个行业的超100家龙头企业 2021.04.07 加入

杉数科技,是中国领先的人工智能决策优化技术服务企业,通过中国首个自研商用求解器COPT,为企业打造从数据到决策的端到端决策产品平台,帮助客户解决一系列业务场景中的决策优化难题,进一步助力企业降本增效。

评论

发布
暂无评论
优化| 手把手教你学会杉数求解器(COPT)的安装、配置与测试