如何使用OR工具CPSAT显示约束优化中的前10个解决方案

时间:2020-01-19 05:57:08

标签: python optimization scheduling constraint-programming or-tools

我已经成功创建了一个计划程序,该程序可以找到最佳解决方案,但是,我希望能检索出前10名的解决方案,而不仅仅是最佳的解决方案。

但是,我已经尝试使用Solver.SolveWithSolutionCallback函数,由于某些奇怪的原因,每当我更改model.Maximum(“ cost_function”)中的“ cost_function”时,解决方案的数量就会改变。

我不确定数学如何解决这个问题,因为可行解决方案的数量应仅取决于约束条件。 “ cost_function”绝不应更改Solver.SolveWithSolutionCallback返回的解决方案的数量。

我知道我可以使用Solver.SearchForAllSolutions显示所有解决方案,但是这样做的问题是,我必须重新计算此函数返回的每个解决方案的所有目标值。我既要解决方案,又要有目标值。

我错过了什么吗?谢谢大家!

注意:在这种情况下,self.cube与我要求解的变量有关。

'''

class SolutionAndObjectiveCallback(cp_model.CpSolverSolutionCallback):

def __init__(self, variables):
    cp_model.CpSolverSolutionCallback.__init__(self)
    self.__variables = variables
    self.__solution_count = 0
    self.__start_time = time.time()
    self.all_cubes = {}

def on_solution_callback(self):
    """Called on each new solution."""
    current_time = time.time()
    obj = self.ObjectiveValue()
    print('Solution %i, time = %0.2f s, objective = %i' %
          (self.__solution_count, current_time - self.__start_time, obj))
    for v in self.__variables:
        print('  %s = %i' % (v, self.Value(v)), end=' ')
    print()
    #
    self.all_cubes[self.__solution_count] = {"cube": {},
                                             "objective_value": obj}

    for v in self.__variables:

        self.all_cubes[self.__solution_count]["cube"][v] = self.Value(v)

    self.__solution_count += 1

def solution_count(self):
    """Returns the number of solutions found."""
    return self.__solution_count

def export_all_cubes(self):

    return self.all_cubes

'''

0 个答案:

没有答案