An online-learning meta-solver for Mixed-Integer Programming problems through multi-armed bandit-based adaptive large neighborhood search, ALNS(MIP).
1 Brown University 2 Fidelity Investments 3 University of Southern California 4 Northeastern University
@inproceedings{balans,
title = {Balans: Multi-Armed Bandits-based Adaptive Large Neighborhood Search for Mixed-Integer Programming Problems},
author = {Cai, Junyang and Kadıoğlu, Serdar and Dilkina, Bistra},
booktitle = {Proceedings of the Thirty-Fourth International Joint Conference on Artificial Intelligence, {IJCAI-25}},
publisher = {International Joint Conferences on Artificial Intelligence Organization},
editor = {James Kwok},
pages = {2566--2574},
year = {2025},
month = {8},
note = {Main Track},
doi = {10.24963/ijcai.2025/286},
url = {https://doi.org/10.24963/ijcai.2025/286},
}
A modular, extensible, solver-agnostic meta-solver for MIP
Balans iteratively improves solutions through a bandit-guided destroy-and-repair loop
Load a MIP instance (.mps/.lp) via the built-in solver reader
Find a feasible starting solution with the MIP solver
Multi-armed bandit selects destroy & repair operators
Iteratively improve via adaptive neighborhood search
Get started with Balans in just a few lines of Python
pip install balans
# Balans meta-solver for solving mixed-integer programming problems
from balans.solver import Balans
# Balans with default configuration
balans = Balans()
# Solve
result = balans.solve("mip_instance.mps")
# Results
print("Best solution:", result.best_state.solution())
print("Best solution objective:", result.best_state.objective())
# Supply a custom JSON configuration file from balans.solver import Balans balans = Balans(config="/path/to/config.json")
# Run directly from the command line after pip install balans mip_instance.mps balans mip_instance.mps config.json
Parallel multi-armed bandits-based adaptive large neighborhood search
ParBalans extends the Balans framework with parallelization strategies at both the outer configuration level (n_jobs) and the inner branch-and-bound level (n_mip_jobs) to exploit modern multicore architectures. It runs multiple Balans configurations in parallel and returns the best found solution across all processes.
Alican Yılmaz, Junyang Cai, Serdar Kadıoğlu, Bistra Dilkina · arXiv 2025
@misc{parbalans,
title = {ParBalans: Parallel Multi-Armed Bandits-based Adaptive Large Neighborhood Search},
author = {Alican Yilmaz and Junyang Cai and Serdar Kadıoğlu and Bistra Dilkina},
year = {2025},
eprint = {2508.06736},
archivePrefix = {arXiv},
primaryClass = {cs.AI},
url = {https://arxiv.org/abs/2508.06736}
}
# Parallel version of Balans, that runs several configurations in parallel
from balans.solver import ParBalans
if __name__ == '__main__':
# ParBalans to run different Balans configs in parallel and save results
parbalans = ParBalans(n_jobs=2, # Outer-level: parallel Balans configurations
n_mip_jobs=1, # Inner-level: parallel BnB search (Gurobi only)
mip_solver="scip",
output_dir="parbalans_results/",
balans_generator=ParBalans.TOP_CONFIGS)
# Run a mip instance to retrieve several results
instance_path = "mip_instance.mps"
best_solution, best_objective = parbalans.run(instance_path)
# Results of the best found solution and the objective
print("Best solution:", best_solution)
print("Best solution objective:", best_objective)
@inproceedings{balans,
title = {Balans: Multi-Armed Bandits-based Adaptive Large Neighborhood Search for Mixed-Integer Programming Problems},
author = {Cai, Junyang and Kadıoğlu, Serdar and Dilkina, Bistra},
booktitle = {Proceedings of the Thirty-Fourth International Joint Conference on Artificial Intelligence, {IJCAI-25}},
publisher = {International Joint Conferences on Artificial Intelligence Organization},
editor = {James Kwok},
pages = {2566--2574},
year = {2025},
month = {8},
note = {Main Track},
doi = {10.24963/ijcai.2025/286},
url = {https://doi.org/10.24963/ijcai.2025/286},
}
@misc{parbalans,
title = {ParBalans: Parallel Multi-Armed Bandits-based Adaptive Large Neighborhood Search},
author = {Alican Yilmaz and Junyang Cai and Serdar Kadıoğlu and Bistra Dilkina},
year = {2025},
eprint = {2508.06736},
archivePrefix = {arXiv},
primaryClass = {cs.AI},
url = {https://arxiv.org/abs/2508.06736},
}