ortool解决作业车间调度问题
当问题规模比较大时短时间无法求得解,可以设置条件提前停止求解
- 1,以设置的求解个数来作为终止条件
"""Code sample that solves a model and displays a small number of solutions."""
from ortools.sat.python import cp_model
class VarArraySolutionPrinterWithLimit(cp_model.CpSolverSolutionCallback):
"""Print intermediate solutions."""
def __init__(self, variables, limit):
cp_model.CpSolverSolutionCallback.__init__(self)
self.__variables = variables
self.__solution_count = 0
self.__solution_limit = limit
def on_solution_callback(self):
self.__solution_count += 1
for v in self.__variables:
print('%s=%i' % (v, self.Value(v)), end=' ')
# print(' objective value = %i' % self.ObjectiveValue())
print()
if self.__solution_count >= self.__solution_limit:
print('Stop search after %i solutions' % self.__solution_limit)
self.StopSearch()
def solution_count(self):
return self.__solution_count
def StopAfterNSolutionsSampleSat():
"""Showcases calling the solver to search for small number of solutions."""
###设置停止条件
stop_early_count=2
# Creates the model.
model = cp_model.CpModel()
# Creates the variables.
num_vals = 3
x = model.NewIntVar(0, num_vals - 1, 'x')
y = model.NewIntVar(0, num_vals - 1, 'y')
z = model.NewIntVar(0, num_vals - 1, 'z')
model.Add(x != y)
model.Maximize(x + 2 * y + 3 * z)
# Create a solver and solve.
solver = cp_model.CpSolver()
solution_printer = VarArraySolutionPrinterWithLimit([x, y, z], stop_early_count)
# Enumerate all solutions.
solver.parameters.enumerate_all_solutions = True
# Solve.
status = solver.SolveWithSolutionCallback(model, solution_printer)
print('Status = %s' % solver.StatusName(status))
print('Number of solutions found: %i' % solution_printer.solution_count())
assert solution_printer.solution_count() == stop_early_count
print(solver.ObjectiveValue())
StopAfterNSolutionsSampleSat()
- 2.设置时间为停止条件
from ortools.sat.python import cp_model
from time import time
class VarArraySolutionPrinterWithLimit(cp_model.CpSolverSolutionCallback):
"""Print intermediate solutions."""
def __init__(self, limit):
cp_model.CpSolverSolutionCallback.__init__(self)
self.__solution_count = time()
self.__solution_limit = limit
def on_solution_callback(self):
t1=time()
if (t1-self.__solution_count) >= self.__solution_limit:
self.StopSearch()
def StopAfterNSolutionsSampleSat():
"""Showcases calling the solver to search for small number of solutions."""
###设置停止条件
stop_early_time=10
# Creates the model.
model = cp_model.CpModel()
# Creates the variables.
num_vals = 3
x = model.NewIntVar(0, num_vals - 1, 'x')
y = model.NewIntVar(0, num_vals - 1, 'y')
z = model.NewIntVar(0, num_vals - 1, 'z')
model.Add(x != y)
model.Maximize(x + 2 * y + 3 * z)
# Create a solver and solve.
solver = cp_model.CpSolver()
solution_printer = VarArraySolutionPrinterWithLimit( stop_early_time)
# Enumerate all solutions.
solver.parameters.enumerate_all_solutions = True
# Solve.
status = solver.SolveWithSolutionCallback(model, solution_printer)
print('Status = %s' % solver.StatusName(status))
print(solver.ObjectiveValue())
StopAfterNSolutionsSampleSat()
引用
https://github.com/google/or-tools/blob/master/ortools/sat/doc/solver.md#stopping-search-early
https://github.com/google/or-tools/issues/651