From 91783cb848fd3f41fab87d33a5a220def2aa6894 Mon Sep 17 00:00:00 2001 From: Laurent Perron Date: Wed, 25 Oct 2017 15:27:19 +0200 Subject: [PATCH] filter slabs --- examples/python/steel_mill_slab_sat.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/python/steel_mill_slab_sat.py b/examples/python/steel_mill_slab_sat.py index 2e5bd18cb2..91f1addb5b 100644 --- a/examples/python/steel_mill_slab_sat.py +++ b/examples/python/steel_mill_slab_sat.py @@ -416,7 +416,7 @@ class AllSolutionsCollector(cp_model.CpSolverSolutionCallback): def NewSolution(self): solution = [self.Value(v) for v in self.__variables] - self.__solutions.append(solution) + self.__solutions.append(tuple(solution)) def AllSolutions(self): return self.__solutions @@ -490,18 +490,26 @@ def SteelMillSlabWithColumns(problem, break_symmetries): loads = [model.NewIntVar(0, max_capacity, 'load_%i' % s) for s in all_slabs] losses = [model.NewIntVar(0, max_loss, 'loss_%i' % s) for s in all_slabs] - valid_slabs = CollectValidSlabs(capacities, colors, widths, loss_array, - all_colors) - print(' - %i valid slab combinations' % len(valid_slabs)) + unsorted_valid_slabs = CollectValidSlabs(capacities, colors, widths, + loss_array, all_colors) + # Sort slab by descending load/loss. Remove duplicates. + valid_slabs = sorted(list(set(unsorted_valid_slabs)), + key = lambda c : 1000 * c[-1] + c[-2]) + num_valid_slabs = len(valid_slabs) + print(' - %i valid slab combinations' % num_valid_slabs) + for s in all_slabs: - model.AddAllowedAssignments([assign[o][s] - for o in all_orders] + [losses[s], loads[s]], - valid_slabs) + model.AddAllowedAssignments( + [assign[o][s] for o in all_orders] + [losses[s], loads[s]], + valid_slabs) # Orders are assigned to one slab. for o in all_orders: model.Add(sum(assign[o]) == 1) + # Redundant constraint (sum of loads == sum of widths). + model.Add(sum(loads) == sum(widths)) + # Symmetry breaking. for s in range(num_slabs - 1): model.Add(loads[s] >= loads[s + 1])