tag:blogger.com,1999:blog-3001120404365621770.post3840000621394199595..comments2023-10-04T08:15:37.640-07:00Comments on Constraint Programming: Getting all the solutions with google solverJean-Charles Réginhttp://www.blogger.com/profile/06540516780781311246noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-3001120404365621770.post-71411664852728031092010-10-06T17:35:45.988-07:002010-10-06T17:35:45.988-07:00I have committed a shortcut on SolutionCollectors
...I have committed a shortcut on SolutionCollectors<br /><br /><br /> for i in range(collector.solution_count()):<br /> nbsol = collector.Value(i, nb)<br /> print nbsol<br /><br />You can get directly the saved value of 'nb' in the ith stored solution.Unknownhttps://www.blogger.com/profile/06293804153708190371noreply@blogger.comtag:blogger.com,1999:blog-3001120404365621770.post-17138152802201952292010-09-29T06:48:37.088-07:002010-09-29T06:48:37.088-07:00Thank you again Laurent!
I will try to format this...Thank you again Laurent!<br />I will try to format this in a nice way on examples.pschaushttps://www.blogger.com/profile/10578391475922351456noreply@blogger.comtag:blogger.com,1999:blog-3001120404365621770.post-62797496226828119282010-09-29T06:22:46.411-07:002010-09-29T06:22:46.411-07:00Some answer:
Fix point: add constraint inside a ...Some answer:<br /> Fix point: add constraint inside a decision Builder.<br /><br />Thus how to define tree search:<br /><br />Here is a simple decision builder around one var:<br />class MyDecisionBuilder(object):<br /> def __init__(self, var):<br /> self.__var = var<br /><br /> def Next(self, solver):<br /> if not self.__var.Bound():<br /> value = self.__var.Min()<br /> decision = solver.AssignVariableValue(self.__var, value)<br /> return decision<br /> else:<br /> return None<br /><br /><br />You could use the same Next method to add your constraints there<br /><br /><br />Define LNS:<br /><br />class MyLNS(object):<br /> def __init__(self):<br /> self.__current = 0<br /><br /> def InitFragment(self):<br /> self.__current = 0<br /><br /> def NextFragment(self, fragment, values):<br /> while self.__current < len(values):<br /> if values[self.__current] == 1:<br /> fragment.append(self.__current)<br /> self.__current += 1<br /> return True<br /> else:<br /> self.__current += 1<br /><br />Thus in a fragment, you append the index of the variables you want to release.<br />Values gives you the number of variables and the value in the current solution of these variables.<br /><br />Here is how it is called:<br /><br /> def testCallbackLNS(self):<br /> solver = pywrapcp.Solver('testCallbackLNS')<br /> x = [solver.BoolVar('x_%d' % i) for i in range(0, 10)]<br /> lns = solver.LNSOperator(x, MyLNS())<br /> solution = solver.Assignment()<br /> solution.Add(x)<br /> for v in x:<br /> solution.SetValue(v, 1)<br /> obj_var = solver.Sum(x)<br /> objective = solver.Minimize(obj_var, 1)<br /> collector = solver.LastSolutionCollector(solution)<br /> inner_db = solver.Phase(x, solver.CHOOSE_FIRST_UNBOUND,<br /> solver.ASSIGN_MIN_VALUE)<br /><br /> db = solver.LocalSearchPhase(solution, lns, inner_db, None)<br /> solver.Solve(db, [objective, collector])<br /> for v in x:<br /> self.assertEqual(0, collector.solution(0).Value(v))Laurent Perronhttps://www.blogger.com/profile/01233027642403281187noreply@blogger.com