前言:
看论文总是看到整数规划,0-1整数规划,混合整数规划,便研究了一下,包括问题定义,快速求解工具等。
杉数求解器
杉数求解器COPT(Cardinal Optimizer),是杉数自主研发的针对大规模优化问题的高效数学规划求解器套件,也是支撑杉数端到端供应链平台的核心组件,是目前中国唯一一个同时具备大规模线性规划(单纯形法和内点法)和混合整数规划问题求解能力的综合性数学规划求解器,为企业应对高性能求解的需求提供了更多选择[1]。
如何获取
从杉数求解器官网上,可以看到,该求解器目前开放许可申请与下载,尤其是对于学术用户,拥有一年的免费试用权限,针对非学术用户,提供60天的免费试用权限。需要填写如下申请表,即可申请获取。
本人第一天申请,第二天就收到了邮件,可以说相当快了。邮件里包含求解器的安装包下载地址,软件密钥以及必要的说明信息。
安装与介绍
安装就很简单了,主要就是配置软件密钥。
软件安装完毕后,安装的根路径下文件夹内容如图所示:
- bin:各种动态库以及可执行文件
- doc:用户操作文档
- example:编程接口调用案例
- lib:通过编程接口调用需要依赖的文件
通过JAVA调用
-
引入jar包
在软件安装的
lib
文件夹下有copt.jar
,复制一份到项目中,并加入到Library
。以集成环境
IDEA
举例:复制到项目的lib
文件夹(自行创建)—>右键lib
文件夹—>Add as Library 即可。 -
编程使用
然后就可以通过java编程使用该求解器的功能。
举例
求解问题:
max
z
=
5
x
1
+
8
x
2
s. t.
x
1
+
x
2
≤
6
5
x
1
+
9
x
2
≤
45
x
i
≥
0
,
x
i
∈
Z
i
=
1
,
2
\begin{gathered} \max z=5 x_{1}+8 x_{2}\\ \text { s. t. } \quad x_{1}+x_{2} \leq 6 \\ 5 x_{1}+9 x_{2} \leq 45 \\ x_{i} \geq 0, x_{i} \in \mathbb{Z} \quad i=1,2 \end{gathered}
maxz=5x1+8x2 s. t. x1+x2≤65x1+9x2≤45xi≥0,xi∈Zi=1,2
代码:
public static void main(String[] args) {
try {
Envr env = new Envr();
Model model = env.createModel("myModel");
// Add variables
// obj: 5x + 8y
// var:
// 0 <= x, y
Var x = model.addVar(0, copt.Consts.INFINITY, 5.0, Consts.INTEGER, "x");
Var y = model.addVar(0, copt.Consts.INFINITY, 8.0, Consts.INTEGER, "y");
// 1.添加线性约束
// r0: x + y <= 6
// r1: 5x + 9y <= 45
Expr e0 = new Expr(x, 1.0);
e0.addTerm(y, 1.0);
model.addConstr(e0, copt.Consts.LESS_EQUAL, 6.0, "r0");
Expr e1 = new Expr(x,5.0);
e1.addTerm(y,9.0);
model.addConstr(e1, Consts.LESS_EQUAL, 45.0, "r1");
// 设置模型的参数和属性
model.setDblParam(copt.DblParam.TimeLimit, 10);
model.setObjSense(copt.Consts.MAXIMIZE);
// Solve problem
model.solve();
// Output solution
System.out.println("\nFound optimal solution:");
VarArray vars = model.getVars();
for (int i = 0; i < vars.size(); i++) {
Var var = vars.getVar(i);
System.out.println(" " + var.getName() + " = " + var.get(copt.DblInfo.Value));
}
System.out.println("Obj = " + model.getDblAttr(copt.DblAttr.BestObj));
System.out.println("\nDone");
} catch (CoptException e) {
e.printStackTrace();
}
}
输出:
Cardinal Optimizer v3.0.1. Build date Oct 12 2021
Copyright Cardinal Operations 2021. All Rights Reserved
Setting parameter 'TimeLimit' to 10
Maximizing a MIP problem
The original problem has:
2 rows, 2 columns and 4 non-zero elements
2 integers
Presolving the problem
The presolved problem has:
2 rows, 2 columns and 4 non-zero elements
2 integers
Starting the MIP solver with 8 threads and 16 tasks
Nodes Active LPit/n IntInf BestBound BestSolution Gap Time
0 1 -- 0 1.000000e+30 -- Inf 0.12s
H 0 1 -- 0 1.000000e+30 0.000000e+00 Inf 0.13s
H 0 1 -- 0 1.000000e+30 1.300000e+01 Inf 0.13s
0 1 -- 2 4.125000e+01 1.300000e+01 68.5% 0.14s
H 0 1 -- 2 4.125000e+01 3.400000e+01 17.6% 0.14s
H 0 1 -- 2 4.125000e+01 3.900000e+01 5.45% 0.14s
0 1 -- 2 4.050000e+01 3.900000e+01 3.70% 0.14s
* 0 1 -- 0 4.000000e+01 4.000000e+01 0.00% 0.14s
0 1 -- 0 4.000000e+01 4.000000e+01 0.00% 0.14s
1 0 -- 0 4.000000e+01 4.000000e+01 0.00% 0.14s
Best solution : 40.000000000
Best bound : 40.000000000
Best gap : 0.0000%
Solve time : 0.14
Solve node : 1
MIP status : solved
Solution status : integer optimal (relative gap limit 0.0001)
Violations : absolute relative
bounds : 0 0
rows : 0 0
integrality : 0
Found optimal solution:
x = 0.0
y = 5.0
Obj = 40.0
Done
参考
[1]杉数求解器COPT