Introduction
The Machine Learning for Combinatorial Optimization (ML4CO) NeurIPS 2021 competition aims at improving stateoftheart combinatorial optimization solvers by replacing key heuristic components with machine learning models. The competition's main scientific question is the following: is machine learning a viable option for improving traditional combinatorial optimization solvers on specific problem distributions, when historical data is available ?
While most combinatorial optimization solvers are presented as generalpurpose, onesizefitsall algorithms, the ML4CO competition focuses on the design of applicationspecific algorithms from historical data. This general problem captures a highly practical scenario relevant to many application areas, where a practitioner repeatedly solves problem instances from a specific distribution, with redundant patterns and characteristics. For example, managing a largescale energy distribution network requires solving very similar CO problems on a daily basis, with a fixed power grid structure while only the demand changes over time. This change of demand is hard to capture by handengineered expert rules, and MLenhanced approaches offer a possible solution to detect typical patterns in the demand history. Other examples include crew scheduling problems that have to be solved daily or weekly with minor variations, or vehicle routing where the traffic conditions change over time, but the overall transportation network does not.
The competition features three challenges for ML, each corresponding to a specific control task arising in the opensource solver SCIP, and exposed through a unified OpenAIgym API based on the Python library Ecole. For each challenge, participants will be evaluated on three problem benchmarks originating from diverse application areas, each represented as a collection of mixedinteger linear program (MILP) instances. Benchmarkspecific submissions are encouraged (algorithms or trained ML models), but of course generic submissions that work for all three benchmarks are allowed.
Note: while we encourage solutions derived from the machine learning and reinforcement learning paradigms, any algorithmic solution respecting the competition's API is accepted.
Important dates (anywhere on earth time zone):
 Jul 1st '21  competition start, release of the training datasets
 Oct 14th '21  registration deadline, no new team is accepted past this date
 Oct 21st '21  submission deadline, no submission is accepted past this date
 Nov 14th '21  final result annoucement and declaration of the winners
 December '21  virtual event at NeurIPS with poster session for all participants
 February '22  official report with winner contributions, to be published in PMLR
This event is sponsored by the Artificial Intelligence Journal (AIJ), as well as Compute Canada, Calcul Québec and Westgrid who graciously provide the infrastructure and compute ressources to run the competition.
Challenges
We propose three distinct challenges, each corresponding to a specific control task arising in traditional solvers. Participants can compete in any subset of those challenges, and one winner will be declared for each.

Primal task
Produce feasible solutions, in order to minimize the primal integral over time.

Dual task
Select branching variables, in order to minimize dual the dual integral over time.

Configuration task
Choose the best solver parameters, in order to minimize the primaldual integral over time.
Primal and dual bounds evolution vs solving time
(for a minimization MILP instance).
Note that this figure
shows the primal and dual integrals minus
\(T\mathbf{c}^\top \mathbf{x}^\star\), which takes a
constant value for a particular instance.
Primal task  Finding feasible solutions
The primal task deals with finding good primal solutions at the root node of the branchandbound tree. To that end, the environment (SCIP solver) will not perform any branching but will enter an infinite loop at the root node, which will collect the agent's solutions, evaluate their feasibility, and update the overall best solution reached so far, thus lowering the current primal bound (upper bound). The metric of interest for this task is the primal integral, which takes into account the speed at which the primal bound decreases over time. To model a realistic scenario, each problem instance will have been preprocessed by SCIP (problem reduction, cutting planes etc.), and the root linear program (LP) relaxation will have been solved before the participants are asked to produce feasible solutions. To prevent SCIP from searching for primal solutions by itself, all primal heuristics will be deactivated. In order to compute this metric unambiguously, even when no solution has been found yet, we provide an initial primal bound (trivial solution value) for each instance, which is to be given to SCIP at the beginning of the solving process in the form of a user objective limit.
 Environment
 The solver is stopped at the root node after the root LP has been solved and enters an infinite loop. At each transition, the environment evaluates the given solution candidate and updates the primal bound. Nothing else happens. The solver remains in the SOLVING stage until the episode terminates (time limit reached, or when the problem is solved).
 Action
 A solution candidate for the current problem (variable assignment values, x).
 Metric
 Primal integral.
 Time limit
 \(T=5\) minutes.
 Relevant literature:

 Learning Combinatorial Optimization Algorithms over Graphs , Dai et al., NeurIPS'17
 Reinforcement Learning for Solving the Vehicle Routing Problem , Nazari et al., NeurIPS'18
 Combinatorial Optimization with Graph Convolutional Networks and Guided Tree Search , Li et al., NeurIPS'18
 Solving Mixed Integer Programs Using Neural Networks , Nair et al., 2020
Dual task  Branching
The dual task deals with obtaining tight optimality guarantees (dual bounds) via branching. Making good branching decisions is regarded as a critical component of modern branchandbound solvers, yet has received little theoretical understanding to this day (see Lodi et al., 2017). In this task, the environment will run a fullfledged branchandcut algorithm with SCIP, and the participants will only control the solver's branching decisions. The metric of interest is the dual integral, which considers the speed at which the dual bound increases over time. Also, all primal heuristics will be deactivated, so that the focus is only on proving optimality via branching.
 Environment
 Traditional branchandbound algorithm. The solver stops after each node is processed (LP solved), receives a branching decision, performs branching, and selects the next open node to process. The solver remains in the SOLVING stage until the episode terminates (time limit reached, or when the problem is solved).
 Action
 One of the current node's branching candidates (nonfixed integer variables). Only singlevariable branching is allowed.
 Metric
 Dual integral.
 Time limit
 \(T=15\) minutes.
 Relevant literature:

 Learning to Branch in Mixed Integer Programming , Khalil et al., AAAI'16
 On Learning and Branching: a Survey , Lodi et al., TOP, 2017
 Learning to Branch , Balcan et al., ICML'18
 Exact Combinatorial Optimization with Graph Convolutional Neural Networks , Gasse et al., NeurIPS'19
 Hybrid Models for Learning to Branch , Gupta et al., NeurIPS'20
 Solving Mixed Integer Programs Using Neural Networks , Nair et al., 2020
Configuration task  Choosing solver parameters
The configuration task deals with deciding on a good parameterization of the solver for a given problem instance. The environment required for this task is more straightforward than for the two previous ones since it involves only a single decision for the agents (i.e., contextual bandit problem). Participants are allowed to tune any of the existing parameters of SCIP (except parameters regarding the computation of time). They can choose between providing a fixed set of parameters that work well on average for each problem benchmark or producing instancespecific parameterizations based on each instance's characteristics. The metric of interest for this task is the primaldual gap integral, which combines both improvements from the dual and from the primal side over time. In order to compute this metric unambiguously, even when no primal or dual bound exists, we provide both an initial primal bound (trivial solution value) and an initial dual bound (precomputed root LP solution value) for each instance.
 Environment
 The solver loads a problem instance and immediately stops. It then receives a parameterization, applies it, and pursues with the solving process until it terminates (time limit reached, or when the problem is solved). During the first and only transition, the solver is in the PROBLEM stage. As such, participants will not be able to extract advanced features from the solver, such as those relying on the LP being solved.
 Action
 A set of SCIP parameters, in the form of a key/value dictionary.
 Metric
 Primaldual gap integral.
 Time limit
 \(T=15\) minutes.
 Relevant literature

 Sequential modelbased optimization for general algorithm configuration , Hutter et al., LION'11
Metrics
Each of the three challenges, the primal task, the dual task and the configuration task, is associated with a specific evaluation metric that reflects a different objective. Here we describe how each metric is computed over a single problem instance, while the final goal of the participants is to optimize this metric in expectation over a hidden collection of test instances.
Because our evaluation metrics are timedependent, all evaluations will be run on the same hardware setup, including one CPU core and one GPU card, which will be communicated at the start of the competition. For practical reasons, for each task, a maximum time budget \(T\) is given to process each test instance (5, 15 and 15 minutes respectively for the primal, dual and configuration tasks), after which the environment necessarily terminates. Participants should therefore focus on taking both good and fast decisions.
In the following we consider instances of mixedinteger linear programs (MILPs) expressed as follows: \[ \begin{eqnarray} \underset{\mathbf{x}}{\operatorname{arg\,min}} \quad \mathbf{c}^\top\mathbf{x} && \\ \text{subject to} \quad \mathbf{A}^\top\mathbf{x} & \leq & \mathbf{b} \text{,} \\ \mathbf{x} & \in & \mathbb{Z}^p \times \mathbb{R}^{np} \text{,} \end{eqnarray} \] where \(\mathbf{c} \in \mathbb{R}^n\) denotes the coefficients of the linear objective, \(\mathbf{A} \in \mathbb{R}^{m \times n}\) and \(\mathbf{b} \in \mathbb{R}^m\) respectively denote the coefficients and upper bounds of the linear constraints, while \(n\) is the total number of variables, \(p \leq n\) is the number of integerconstrained variables, and \(m\) the number of linear constraints.
 Primal integral

This objective measures the area under the curve of the solver's primal bound (a.k.a. global upper bound), which corresponds to the value of the best feasible solution found so far. By providing better feasible solutions over time, the value of the primal bound decreases. With a time limit \(T\), the primal integral expresses as: \[ \int_{t=0}^{T} \mathbf{c}^\top \mathbf{x}^\star_t\;\mathrm{d}t  T\mathbf{c}^\top\mathbf{x}^\star \text{,} \] where \(\mathbf{x}^\star_t\) is the best feasible solution found at time \(t\) (so that \(\mathbf{c}^\top \mathbf{x}^\star_t\) is the primal bound at time \(t\)), and \(T\mathbf{c}^\top\mathbf{x}^\star\) is an instancespecific constant that depends on the optimal solution \(\mathbf{x}^\star\). The primal integral is to be minimized, and takes an optimal value of 0.
Note: to compute this metric unambiguously, a trivial initial solution \(x^\star_0\) is always provided to SCIP at the beginning of the solving process. Also, the constant term \(\mathbf{c}^\top\mathbf{x}^\star\) can be safely ignored at training time when participants train their control policy, as the learning problem is equivalent. At test time however, when we will evaluate the participant submissions, this constant term (or a proper substitute) will be incorporated in the reported metric.
 Dual integral

This objective measures the area over the curve of the solver's dual bound (a.k.a. global lower bound), which usually corresponds to a solution of a valid relaxation of the MILP. By branching, the LP relaxations corresponding to the branchandbound tree leaves get tightened, and the dual bound increases over time. With a time limit \(T\), the dual integral expresses as: \[ T\mathbf{c}^\top\mathbf{x}^\star  \int_{t=0}^{T} \mathbf{z}^\star_t\;\mathrm{d}t \text{,} \] where \(\mathbf{z}^\star_t\) is the best dual bound at time \(t\), and \(T\mathbf{c}^\top\mathbf{x}^\star\) is an instancespecific constant that depends on the optimal solution value \(\mathbf{c}^\top\mathbf{x}^\star\). The dual integral is to be minimized, and takes an optimal value of 0.
Note: in the context of branching, this metric is unambiguous to compute, as the root node of the tree always provides an initial dual bound \(\mathbf{z}^*_0\) at the beginning of branching. Here again, the constant term \(\mathbf{c}^\top\mathbf{x}^\star\) can be safely ignored for training, but it will be incorporated (or a proper substitute) in the metrics that we will report when evaluating the participants submissions.
 Primaldual gap integral

This objective measures the area between two curves, the solver's primal bound and the solver's dual bound. As such, this metric benefits both from improvements obtained from the primal side (finding good feasible solutions), and on the dual side (producing a tight optimality certificate). With a time limit \(T\), the primaldual gap integral expresses as: \[ \int_{t=0}^{T} \mathbf{c}^\top \mathbf{x}^\star_t  \mathbf{z}^\star_t\;\mathrm{d}t \text{.} \] The primaldual gap integral is to be minimized, and take an optimal value of 0.
Note: in the context of algorithm configuration, an initial value is required for the two curves at time \(t=0\). Therefore we always provide both an initial trivial solution \(x^\star_0\) and a valid initial dual bound \(z^\star_0\) to SCIP for this task.
Datasets
For each individual challenge, participants will be evaluated on three problem benchmarks from diverse application areas. Participants can provide a different decisionmaking code (algorithmic solution or trained ML model) for each of the benchmarks, or a single code that works for all benchmarks.
A problem benchmark consists in a collection of mixedinteger linear program (MILP) instances in the standard MPS file format. Each benchmark is split into a training and a test set, originating from the same problem distribution. While the training instances are made public at the beginning of the competition for participants to train their models, the test instances will be kept hidden for evaluation purposes and will only be revealed at the end of the competition.
Note: for each problem benchmark we suggest a preestablished split of the training instances into two distinct collections: train and valid. This is only a suggestion, and all instance files in both those collections can be likely considered as training instances. There is no restriction regarding how participants should use the provided instances during training.
The first two problem benchmarks are inspired by reallife applications of largescale systems at Google, while the third benchmark is an anonymous problem inspired by a realworld, largescale industrial application.
 Problem benchmark 1: Balanced Item Placement
 This problem deals with spreading items (e.g., files or processes) across containers (e.g., disks or machines) utilizing them evenly. Items can have multiple copies, but at most, one copy can be placed in a single bin. The number of items that can be moved is constrained, modeling the reallife situation of a live system for which some placement already exists. Each problem instance is modeled as a MILP, using a multidimensional multiknapsack formulation. This dataset contains 10000 training instances (presplit into 9900 train and 100 valid instances).
 Problem benchmark 2: Workload Apportionment
 This problem deals with apportioning workloads (e.g., data streams) across as few workers (e.g., servers) as possible. The apportionment is required to be robust to any one worker's failure. Each instance problem is modeled as a MILP, using a binpacking with apportionment formulation. This dataset contains 10000 training instances (presplit into 9900 train and 100 valid instances).
 Problem benchmark 3: Anonymous Problem
 The MILP instances corresponding to this benchmark are assembled from a public dataset, whose origin is kept secret to prevent cheating. Reverseengineering for the purpose of recovering the test set is explicitly forbidden (see rules). This dataset contains 118 training instances (presplit into 98 train and 20 valid instances).
Rules
The spirit of the competition is as follows:
 we encourage contributions from both the OR and ML communities by explicitly allowing nonML submissions;
 we encourage student participation with a dedicated student leaderboard;
 we encourage original contributions by specifically making the use of highlyengineered commercial solvers prohibited.
Participants must adhere to the following rules:
 Eligibility

 Participants can work in teams.
 Participants can submit codes based on a machine learning model, a humandesigned algorithm, or any combination of the two.
 Participants are not allowed to use commercial software in their code. The use of solvers such as CPLEX, Gurobi, or FICO XPress is explicitly forbidden.
 Studentonly teams are eligible to a separate student leaderboard, in addition to the main leaderboard of the competition. A graduated PhD is not considered a student.
 Data

 The use of supplementary existing opensource datasets, e.g., for pretraining, is permitted provided they are credited.
 The use of private, proprietary datasets is not permitted.
 In order to prevent cheating, the evaluation data sets will be kept hidden to the participants during the competition.
 Participants are free and encouraged to extract original features from the solver for training and evaluation, though the Python interface of SCIP, PySCIPOpt.
 Submission

 The submitted codes must be written in Python, and must run in the evaluation environment which we provide.
 Parallel implementations using multiple processes or multiple threads are allowed, although the hardware on which the codes will be evaluated is singlecore.
 The evaluation environment does not have access to any external network, to prevent any information leak.
 Users may make use of open source libraries given proper attribution. At the end of the competition, we encourage all code to be opensourced so the results can be reproduced.
 The evaluation environment will provide a basic ML ecosystem (Tensorflow, Pytorch, Scikitlearn). Additional libraries will be added to the evaluation environment upon reasonable requests.
 At the end of the competition, the winners are expected to provide a description of the method they used.
 Cheating prevention

 Participants are forbidden to interact with the SCIP solver in any other way than the one intended, that is, extracting information or providing a control decision related to the task at hand. Any interaction with SCIP that results in changes of the solver's internal state will be considered cheating.
 Some datasets have been anonymized, as they rely on publicly accessible data. Any attempt at reverseengineering for the purpose of recovering information about the test set is forbidden.
 Any instance of cheating, defined as violation of the rules above or any other attempt to circumvent the spirit and intent of the competition, as determined by the organizers, will result in the invalidation of all of the offending team’s submissions and a disqualification from the competition.
For each task, the winners will be declared as follows:
 Ranking rules

 Each team will be evaluated separately on each of the three benchmark datasets according the task's metric, i.e., primal integral, dual integral, or primaldual integral. This metric will be averaged across all instances in the test dataset, resulting in an individual ranking for each dataset. For example, for the primal task, team A might obtain ranks 3, 8, 1 respectively in the three problem benchmark, while team B obtains ranks 2, 2, 15.
 Then, for each team those three ranks will be multiplied together to obtain the overall score of the team. For example, team A will obtain a score of 3x8x1=24 while team B obtains 2x2x15=60.
 The team with the lowest overall score wins.
Getting started
Registration form: register your team and subscribe to the competition's mailing list.
GitHub repository: get started and access the datasets, started packages, and technical documentation.
Leaderboard
Last update: September 28th.
Note: for each challenge and each benchmark, we report two performance measures:
 the average evaluation metric (primal integral, dual integral, or primaldual integral) obtained over the test instances, which is to be minimized. This measure is described in detail in the metrics section, and corresponds to the negated cumulated reward computed by our evaluation script, plus a constant term (\(T\mathbf{c}^\top\mathbf{x}^\star\), \(T\mathbf{c}^\top\mathbf{x}^\star\) or \(0\)) that depends on the optimal solution value of each instance. Because for some instances it is hard to obtain the optimal solution value, and because this constant term is the same for every participant and does not impact the rankings, we compute an adequate estimate to substitute \(\mathbf{c}^\top\mathbf{x}^\star\) when the optimal solution value is not available, based on the best primal and dual bounds obtained after some time limit.
 the average cumulated reward (cum. reward) obtained over the test instances, which is to be maximized. We report this measure for information purposes, as it is exactly the one computed by our evaluation script. This measure can be interpreted as the negated and unshifted version of the evaluation metric (it does not depend on \(\mathbf{c}^\top\mathbf{x}^\star\)), and it produces the exact same ranking.
Global leaderboard
rank  team  item_placement  load_balancing  anonymous  score  

primal integral  (cum. reward)  rank  primal integral  (cum. reward)  rank  primal integral  (cum. reward)  rank  
1  generaleyes  3931.26  (7017.25)  4  7629.80  (221372.30)  1  392292059.66  (414613348.68)  2  8 
2  Mr_Tree  3732.71  (6818.70)  2  9170.42  (222912.92)  4  292115828.78  (314437117.80)  1  8 
3  Nuri  4006.03  (7092.02)  5  8947.16  (222689.66)  2  392757636.47  (415078925.49)  3  30 
4  CUHKSZ_ATD  3505.09  (6591.08)  1  12179.33  (225921.83)  5  nan  (nan)  6  30 
5  dt  3928.18  (7014.17)  3  8968.14  (222710.64)  3  nan  (nan)  6  54 
6  EIOROAS  10198.37  (13284.36)  6  45437.66  (259180.16)  6  1133597396.21  (1155918685.23)  4  144 
7  LIM  nan  (nan)  7  nan  (nan)  7  nan  (nan)  6  294 
8  ethzscuba  nan  (nan)  7  nan  (nan)  7  nan  (nan)  6  294 
rank  team  item_placement  load_balancing  anonymous  score  

dual integral  (cum. reward)  rank  dual integral  (cum. reward)  rank  dual integral  (cum. reward)  rank  
1  uofx  2915.49  (6342.48)  1  6202.41  (635025.09)  6  6671189.63  (60292677.43)  1  6 
2  Nuri  4098.88  (5159.09)  3  5675.69  (635551.81)  2  6786985.80  (60176881.27)  2  12 
3  EIOROAS  3612.42  (5645.55)  2  5976.67  (635250.83)  4  7175390.80  (59788476.26)  3  24 
4  qqy  5366.12  (3891.85)  9  5638.23  (635589.27)  1  7475634.27  (59488232.80)  5  45 
5  lxj24  6357.95  (2900.02)  10  5779.61  (635447.89)  3  7356549.62  (59607317.44)  4  120 
6  gentlemenML4CO  4102.47  (5155.50)  4  6120.77  (635106.73)  5  7870071.64  (59093795.43)  7  140 
7  nflzg  5002.42  (4255.55)  8  6366.78  (634860.72)  7  7524731.62  (59439135.44)  6  336 
8  Columbia_Combinators  4673.36  (4584.61)  5  6378.88  (634848.62)  8  nan  (nan)  10  400 
9  royce  4750.45  (4507.52)  6  6390.03  (634837.47)  9  8027218.99  (58936648.07)  8  432 
10  ark  5001.61  (4256.36)  7  7489.33  (633738.17)  10  8038141.70  (58925725.36)  9  630 
rank  team  item_placement  load_balancing  anonymous  score  

primaldual integral  (cum. reward)  rank  primaldual integral  (cum. reward)  rank  primaldual integral  (cum. reward)  rank  
1  EIOROAS  9836.59  (9836.59)  1  10369.50  (10369.50)  1  nan  (nan)  4  4 
2  MixedInspiringLamePuns  15804.51  (15804.51)  4  21624.00  (21624.00)  3  843368159.90  (843368159.90)  1  12 
3  ECNUNoah001  13867.23  (13867.23)  2  21015.18  (21015.18)  2  nan  (nan)  4  16 
4  royce  14534.74  (14534.74)  3  22578.84  (22578.84)  4  nan  (nan)  4  48 
5  Nuri  51691.19  (51691.19)  5  170775.62  (170775.62)  5  1664225918.57  (1664225918.57)  2  50 
Student leaderboard
Primal taskrank  team  item_placement  load_balancing  anonymous  score  

primal integral  (cum. reward)  rank  primal integral  (cum. reward)  rank  primal integral  (cum. reward)  rank  
1  Nuri  4006.03  (7092.02)  1  8947.16  (222689.66)  1  392757636.47  (415078925.49)  1  1 
2  LIM  nan  (nan)  2  nan  (nan)  2  nan  (nan)  2  8 
3  ethzscuba  nan  (nan)  2  nan  (nan)  2  nan  (nan)  2  8 
rank  team  item_placement  load_balancing  anonymous  score  

dual integral  (cum. reward)  rank  dual integral  (cum. reward)  rank  dual integral  (cum. reward)  rank  
1  Nuri  4098.88  (5159.09)  1  5675.69  (635551.81)  2  6786985.80  (60176881.27)  1  2 
2  qqy  5366.12  (3891.85)  5  5638.23  (635589.27)  1  7475634.27  (59488232.80)  3  15 
3  lxj24  6357.95  (2900.02)  6  5779.61  (635447.89)  3  7356549.62  (59607317.44)  2  36 
4  Columbia_Combinators  4673.36  (4584.61)  2  6378.88  (634848.62)  5  nan  (nan)  6  60 
5  nflzg  5002.42  (4255.55)  4  6366.78  (634860.72)  4  7524731.62  (59439135.44)  4  64 
6  ark  5001.61  (4256.36)  3  7489.33  (633738.17)  6  8038141.70  (58925725.36)  5  90 
rank  team  item_placement  load_balancing  anonymous  score  

primaldual integral  (cum. reward)  rank  primaldual integral  (cum. reward)  rank  primaldual integral  (cum. reward)  rank  
1  MixedInspiringLamePuns  15804.51  (15804.51)  1  21624.00  (21624.00)  1  843368159.90  (843368159.90)  1  1 
2  Nuri  51691.19  (51691.19)  2  170775.62  (170775.62)  2  1664225918.57  (1664225918.57)  2  8 