|
|
|
@ -23,7 +23,6 @@ from .pyomo.gurobi import GurobiPyomoSolver
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Global memory for multiprocessing
|
|
|
|
|
SOLVER = [None] # type: List[Optional[LearningSolver]]
|
|
|
|
|
INSTANCES = [None] # type: List[Optional[dict]]
|
|
|
|
@ -45,18 +44,6 @@ def _parallel_solve(idx):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LearningSolver:
|
|
|
|
|
def __init__(
|
|
|
|
|
self,
|
|
|
|
|
components=None,
|
|
|
|
|
gap_tolerance=1e-4,
|
|
|
|
|
mode="exact",
|
|
|
|
|
solver="gurobi",
|
|
|
|
|
threads=None,
|
|
|
|
|
time_limit=None,
|
|
|
|
|
node_limit=None,
|
|
|
|
|
solve_lp_first=True,
|
|
|
|
|
use_lazy_cb=False,
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Mixed-Integer Linear Programming (MIP) solver that extracts information
|
|
|
|
|
from previous runs and uses Machine Learning methods to accelerate the
|
|
|
|
@ -75,7 +62,7 @@ class LearningSolver:
|
|
|
|
|
mode
|
|
|
|
|
If "exact", solves problem to optimality, keeping all optimality
|
|
|
|
|
guarantees provided by the MIP solver. If "heuristic", uses machine
|
|
|
|
|
learning more agressively, and may return suboptimal solutions.
|
|
|
|
|
learning more aggressively, and may return suboptimal solutions.
|
|
|
|
|
solver
|
|
|
|
|
The internal MIP solver to use. Can be either "cplex", "gurobi", a
|
|
|
|
|
solver class such as GurobiSolver, or a solver instance such as
|
|
|
|
@ -97,6 +84,19 @@ class LearningSolver:
|
|
|
|
|
expensive to solve and if it provides good hints for the integer
|
|
|
|
|
solution.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
|
self,
|
|
|
|
|
components=None,
|
|
|
|
|
gap_tolerance=1e-4,
|
|
|
|
|
mode="exact",
|
|
|
|
|
solver="gurobi",
|
|
|
|
|
threads=None,
|
|
|
|
|
time_limit=None,
|
|
|
|
|
node_limit=None,
|
|
|
|
|
solve_lp_first=True,
|
|
|
|
|
use_lazy_cb=False,
|
|
|
|
|
):
|
|
|
|
|
self.components = {}
|
|
|
|
|
self.mode = mode
|
|
|
|
|
self.internal_solver = None
|
|
|
|
|