作者:小猪快跑
基础数学&计算数学,从事优化领域6年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
本文将介绍常见MIP求解器的示例:Gurobi、SCIP、Highs。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑
求解器性能总览
The benchmark instances of MIPLIB2017 have been run by a number of codes.
CBC-2.10.5: CBC
Gurobi-11.0.0 Gurobi
COPT-7.1.0: COPT
SCIP/spx-9.0.0: SCIP
SCIP/cpx-9.0.0: SCIPC
HiGHS-1.6.0 HiGHS
SMOO/XSMOO: SMOOTHIE (FiberSCIP[with Soplex/CPLEX as LP solver]+HiGHS)
MindOpt-1.0.0: MindOpt
OptVerse-0.7.0: OptVerse
XOPT-0.0.6: XOPT
LEOPT-0.5.1: LEOPT
TAYLORMIP-0.8: www.tcs-lab.com/solver/
Table for 8 threads, Result files per solver, Log files per solver
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Unscaled and scaled shifted geometric means of run times
All non-successes are counted as max-time.
The third line lists the number of problems (240 total) solved.
MATLAB has HiGHS as default solver starting with 2024a.
-----------------------
| not fully trusted |
-----------------------
CBC Gurb COPT SCIP SCIPC HiGHS SMOO XSMO MDOPT |OPTV XOPT LEOPT TAYLR
--------------------------------------------------------------------------------
unscal 1328 72.1 104 894 764 720 612 510 301 | 207 457 301 176
scaled 18.4 1 1.44 12.4 10.6 9.98 8.49 7.07 4.18 |2.88 6.34 4.18 2.45
solved 107 229 220 139 152 159 163 172 196 | 202 188 179 227
--------------------------------------------------------------------------------
问题概述
min x + y subject to y ⩽ 7 5 ⩽ x + 2 y ⩽ 15 6 ⩽ 3 x + 2 y 0 ⩽ x ⩽ 4 ; 1 ⩽ y \begin{align} \min \quad & x + y &\\ \text{subject to} \quad & y \leqslant 7\\ & 5 \leqslant x + 2y \leqslant 15\\ & 6 \leqslant 3x + 2y\\ & 0 \leqslant x \leqslant 4; 1\leqslant y \end{align} minsubject tox+yy⩽75⩽x+2y⩽156⩽3x+2y0⩽x⩽4;1⩽y
Gurobi
from gurobipy import GRB, Model
# 创建模型
m = Model()
# 添加变量
x = m.addVar(lb=0, ub=4, vtype=GRB.CONTINUOUS, name="x")
y = m.addVar(lb=1, ub=7, vtype=GRB.CONTINUOUS, name="y")
# 更新模型以集成新变量
m.update()
# 设置目标函数
m.setObjective(x + y, GRB.MINIMIZE)
# 设置约束条件
m.addConstr(5 <= x + 2 * y)
m.addConstr(x + 2 * y <= 15)
m.addConstr(6 <= 3 * x + 2 * y)
# 设置优化参数
m.setParam('TimeLimit', 30)
m.setParam('MIPGap', 0)
# 优化模型
m.optimize()
# 输出结果
if m.status == GRB.OPTIMAL:
print("Optimal solution found:")
for v in m.getVars():
print(f"{v.varName}: {v.x}")
print(f"Objective value: {m.objVal}")
else:
print("No optimal solution found.")
Highs
from highspy import HighsVarType, ObjSense
import highspy
# 创建一个HiGHS模型实例
m = highspy.Highs()
# 添加变量
x = m.addVariable(lb=0, ub=4, type=HighsVarType.kContinuous, name='x')
y = m.addVariable(lb=1, ub=7, type=HighsVarType.kContinuous, name='y')
# 设置约束条件
m.addConstr(5 <= x + 2 * y <= 15)
m.addConstr(6 <= 3 * x + 2 * y)
# 设置目标函数
m.minimize(x + y)
# 打印解
info = m.getInfo()
print('Model status:', m.modelStatusToString(m.getModelStatus()))
print('Gap:', info.mip_gap)
print('lb:', info.mip_dual_bound)
print('ub:', info.objective_function_value)
print('runtime:', m.getRunTime())
for i, val in enumerate(m.getSolution().col_value):
print(f"{m.getColName(i)[1]} = {val}")
SCIP
from pyscipopt import Model
# 创建模型
m = Model()
# 添加变量
x = m.addVar(lb=0, ub=4, vtype='C', name="x")
y = m.addVar(lb=1, ub=7, vtype='C', name="y")
# 设置目标函数
m.setObjective(x + y, "minimize")
# 设置约束条件
m.addCons(5 <= x + 2 * y)
m.addCons(x + 2 * y <= 15)
m.addCons(6 <= 3 * x + 2 * y)
# 设置优化参数
m.setParam('limits/time', 30)
m.setParam('limits/gap', 0)
# 优化模型
m.optimize()
# 输出结果
print("Optimal solution:")
for v in m.getVars():
print(f"{v.name}: {m.getVal(v)}")
print(f"Objective value: {m.getObjVal()}")