Python Interface: COPT vs GUROBI

Prerequisite

COPT 5.0.1 GUROBI 9.5.1
Installation pip install coptpy pip install gurobipy

Main Features

  1. Replace gurobipy            by coptpy                    (importing pakcage)
  2. Replace GRB                 by COPT                      (for constant values)
  3. Replace name                by nameprefix                (for creating names)
  4. Replace optimize()          by solve() 
  5. Replace getAttr('X')        by getInfo(COPT.Info.Value)  (for getting solutions)
  6. Replace ConstrName/Varname  by name                      (for getting names)
1 Import Package
COPT import coptpy as cp
from coptpy import COPT
GUROBI import gurobipy as gp
from gurobipy as GRB
2 Create Model
COPT env = cp.Envr()
model = env.createModel('sudoku')
GUROBI model = gp.Model('sudoku')
2.1 Create Model with Remote Server
COPT config = cp.EnvConfig()
confit.set("cluster", "192.168.9.9")
env = cp.Envr(config)
model = env.createModel('sudoku')
3 Add Variables
COPT vars = model.addVars(n, n, n, vtype=COPT.BINARY, nameprefix='G')
GUROBI vars = model.addVars(n, n, n, vtype=GRB.BINARY, name='G')
4 Add Constraints
COPT model.addConstrs((vars.sum(i, j, '*') == 1
       for i in range(n)
       for j in range(n)), nameprefix='V')
GUROBI model.addConstrs((vars.sum(i, j, '*') == 1
       for i in range(n)
       for j in range(n)), name='V')
5 Add Constraints using quicksum
COPT model.addConstrs((
       cp.quicksum(vars[i, j, v] for i in range(i0 * s, (i0 + 1) * s) for j in range(j0 * s, (j0 + 1) * s)) == 1
             for v in range(n)
             for i0 in range(s)
             for j0 in range(s)), nameprefix='Sub)
GUROBI model.addConstrs((
       gp.quicksum(vars[i, j, v] for i in range(i0 * s, (i0 + 1) * s) for j in range(j0 * s, (j0 + 1) * s)) == 1
             for v in range(n)
             for i0 in range(s)
             for j0 in range(s)), name='Sub)
6 Solve
COPT model.solve()
GUROBI model.optimize()
7 Get Solutions
COPT solution = model.getInfo(COPT.Info.Value, vars)
GUROBI solution = model.getAttr('X', vars)
8 Get Names
COPT constraint.name
variable.name
GUROBI constraint.ConstrName
variable.VarName
9 Parameter
Attribute
Checking Status
COPT model.param.timelimit = 60
model.objval
model.status = COPT.OPTIMAL
GUROBI model.params.timelimit = 60
model.objval
model.status = GRB.OPTIMAL

Other Features

1 Add MIP Start
COPT model.setMipStart(vars[i], 0.0)
model.loadMipStart()
GUROBI vars[i].Start = 0.0
2 Add Constraints with Two Bounds
COPT for c in c_list:
    m.addConstr(cp.quicksum(
       coef[i, c] * vars[f] for i in vlist) == [con_lower[c], con_upper[c]], c)
GUROBI m.addConstrs(gp.quicksum(
     coef[i, c] * vars[f] for i in vlist) == [con_lower[c], con_upper[c]] for c in c_list, "_")
3 Linear Expression
COPT expr = LinExpr(1.0)
expr.addTerm(x, 2.0)
GUROBI expr = LinExpr(1.0)
expr.addTerm(2.0, x)