Code for the paper "Learning to Search in Branch and Bound Algorithms" published in NIPS 2014. The main goal is to speedup ILP solvers by prioritizing and pruning nodes during exploration. Currently it's tested on Linux only.
This implementation is base on the open source ILP solver SCIP 3.1.0.
To have access to more features during solving, I had to change/add some API in the original SCIP package.
You can either get the affected source director src/scip from this repo and make changes accordingly to your SCIP package,
or download the whole SCIP package scip-3.1.0.tgz.
Then you need to change SCIPDIR in the Makefile.
We used CPLEX as the LP solver for SCIP. But you can also use other LP solvers. Please see details in SCIP documentation.
To train the (linear) policy, you need LIBLINEAR.
I used version 1.94 but it should be compatible with later versions.
After compiling put the executable train and predict in bin.
LIBLINEAR does not support instance weights; please also download LIBLINEAR-weights and put the executable train-w in bin.
This algorithm learns from solved problems.
Before learning, you need to put ILP problems in dat/dataset/{train,dev,test} and their corresponding solutions (with the same filename prefix) under sol/dataset/{train,dev,test}, where dataset should be the name of your dataset.
See sample-dat and sample-sol for example.
To obtain solutions by SCIP, you can use scripts/run_scip.sh.
To compile, run make. This will generate bin/scipdagger.
The main DAgger loop is in scripts/train_bb.sh.
For example,
scripts/train_bb.sh -d sample/train -p 2 -n 24 -c 2 -w 8 -e sample -x .lp.gz
-d: learn a policy from problems indat/sample/train.-pand-n: go through the whole training set for 2 passes and train a policy for every 24 problems. The total number of training examples should be dividable by the argument of-n.-e: specify the experiment name; used for logging purposes.-x: specify the suffix of problems indat.-cand-w: hyperparameters for LIBLINEAR.-cis the SVM penalty parameter and we tried{0.25, 0.5, 1, 2, 4, 8};-wis the weight on positive instances since the classification is highly imbalanced, and we tried{1, 2, 4, 8}.
Note: It will generate temporary training files (potentially large!) for LIBLINEAR; set scratch to point to a tmp location.
To test the learned policy, use scripts/test_bb.sh.
Besides arguments the above arguments, you need to pass it the pruning policy (-k) and the selection policy (-s), whose locations are specified in scripts/train_bb.sh.
In addition, we may want to compare it with other methods.
scripts/compare.sh reads results from logs generated by test_bb.sh then compares it with SCIP and Gurobi using the same node or time constraints.
We can also rank the policy features (scripts/rank_features.py) by weights of a learned model; or run statistical tests (scripts/ttest.sh).