【0基础运筹学】MIP求解器样例:Gurobi、SCIP、Highs


作者:小猪快跑

基础数学&计算数学,从事优化领域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+yy75x+2y1563x+2y0x4;1y

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()}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值