美文网首页Python与OR
设置解答器约束

设置解答器约束

作者: 白晓寒星 | 来源:发表于2019-08-11 23:11 被阅读0次

    ·运行时间约束
    ·解约束

    1.为解答器设置运行时间约束
    如果程序的运行时间太长了,我们可以设置程序的合理运行时间。调用函数为 solver.parameters.max_time_in_seconds 。以下是一个十秒运行时间的限制:

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from ortools.sat.python import cp_model
    
    
    def SolveWithTimeLimitSampleSat():
        """Minimal CP-SAT example to showcase calling the solver."""
        # 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')
        # Adds an all-different constraint.
        model.Add(x != y)
    
        # Creates a solver and solves the model.
        solver = cp_model.CpSolver()
    
        # Sets a time limit of 10 seconds.
        solver.parameters.max_time_in_seconds = 10.0
    
        status = solver.Solve(model)
    
        if status == cp_model.FEASIBLE:
            print('x = %i' % solver.Value(x))
            print('y = %i' % solver.Value(y))
            print('z = %i' % solver.Value(z))
    
    
    SolveWithTimeLimitSampleSat()
    

    2.给定解的数量终止运行
    例子如下:

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    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()
            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."""
        # 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')
    
        # Create a solver and solve.
        solver = cp_model.CpSolver()
        solution_printer = VarArraySolutionPrinterWithLimit([x, y, z], 5)
        status = solver.SearchForAllSolutions(model, solution_printer)
        print('Status = %s' % solver.StatusName(status))
        print('Number of solutions found: %i' % solution_printer.solution_count())
        assert solution_printer.solution_count() == 5
    
    
    StopAfterNSolutionsSampleSat()
    

    相关文章

      网友评论

        本文标题:设置解答器约束

        本文链接:https://www.haomeiwen.com/subject/aoedjctx.html