Как отобразить 10 лучших решений по оптимизации ограничений с помощью OR-инструментов CPSAT - PullRequest
0 голосов
/ 19 января 2020

Я успешно создал программу планирования, которая находит оптимальное решение, однако я надеюсь получить ТОП 10 решений, а не только лучшее.

Я попытался использовать функцию solver.SolveWithSolutionCallback, однако - по какой-то странной причине число решений меняется всякий раз, когда я меняю «cost_function» в модели. Maximum («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

' ''

...