def main(): from optparse import OptionParser parser = OptionParser(usage="usage: %prog [options] [input_file]") parser.add_option('-a', '--alpha', type='float', default=0.3, metavar='NUM', help='Alpha parameter for RCL construction') parser.add_option('-b', '--ptb', type='float', default=300, metavar='NUM', help='Per task bonification in greedy function') parser.add_option('-p', '--pertr', type='float', default=0, metavar='NUM', help='Cost perturbation radius in greedy function') parser.add_option('--debug-greedy', action='store_true', help='Print debugging data for construction stage') parser.add_option('--debug-search', action='store_true', help='Print debugging data for search stage') (options, args) = parser.parse_args() if not args: args = ['orlib/csp50.txt'] if not options.debug_greedy: global DEBUG_SOLUTION, DEBUG_RCL DEBUG_SOLUTION = lambda *args: None DEBUG_RCL = lambda *args: None csp = CrewSchedulingProblem(open(args[0])) rotations = list(csp.generate_rotations()) greedy_cost = partial(rotation_cost, per_task_bonification=options.ptb, perturbation_radius=options.pertr) solution = grasp(rotations, csp, options.alpha, greedy_cost)
def __init__(self, problem_file): csp = CrewSchedulingProblem(problem_file) columns, costs = [], [] for rotation in csp.generate_rotations(): column = zeros(len(csp.tasks), dtype="uint8") for task in rotation.tasks: column[task] = 1 columns.append(column) costs.append(rotation.cost) A = array(columns).transpose() m, n = A.shape alpha = [set() for row in range(m)] beta = [set() for col in range(n)] for row, col in transpose(A.nonzero()): alpha[row].add(col) beta[col].add(row) self.A = A self.costs = array(costs) self.nr_tasks, self.nr_rotations = m, n self.alpha = map(frozenset, alpha) self.beta = map(frozenset, beta)