Я успешно создал программу планирования, которая находит оптимальное решение, однако я надеюсь получить ТОП 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
' ''