我已经成功创建了一个计划程序,该程序可以找到最佳解决方案,但是,我希望能检索出前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
'''