def _solve_gapfill(job: Job) -> List[List[int]]: # 1. Sort by magnitude (largest first) # 2. stack until limit is reached # 3. try smaller as long as possible # 4. create new bar # TODO: rewrite to use native map instead # we are writing around in target sizes, prevent leaking changes to job mutable_sizes = copy.deepcopy(job.sizes_as_list()) targets = sorted(mutable_sizes, reverse=True) stocks = [] current_size = 0 current_stock = [] i_target = 0 while len(targets) > 0: # nothing fit, next stock if i_target >= len(targets): # add local result stocks.append(current_stock) # reset current_stock = [] current_size = 0 i_target = 0 current_target = targets[i_target] # target fits inside current stock, transfer to results if (current_size + current_target.length + job.cut_width) < job.max_length: current_stock.append(current_target.length) current_size += current_target.length + job.cut_width # remove empty entries if current_target.quantity <= 1: targets.remove(current_target) else: current_target.quantity -= 1 # try smaller else: i_target += 1 # apply last "forgotten" stock if current_stock: stocks.append(current_stock) # trimming could be calculated from len(stocks) * length - sum(stocks) return stocks
def _solve_FFD(job: Job) -> List[List[int]]: # iterate over list of stocks # put into first stock that it fits into # 1. Sort by magnitude (largest first) # 2. stack until limit is reached # 3. try smaller as long as possible # 4. create new bar # TODO: rewrite to use native map instead mutable_sizes = copy.deepcopy(job.sizes_as_list()) sizes = sorted(mutable_sizes, reverse=True) stocks: List[List[int]] = [[]] stock_lengths: List[int] = [0] i_target = 0 while i_target < len(sizes): current_size = sizes[i_target] for i, stock in enumerate(stocks): # step through existing stocks until current size fits if (job.max_length - stock_lengths[i]) > current_size.length: # add size stock.append(current_size.length) stock_lengths[i] += job.cut_width + current_size.length break else: # nothing fit, opening next bin stocks.append([current_size.length]) stock_lengths.append(0) # decrease/get next if current_size.quantity <= 1: i_target += 1 else: current_size.quantity -= 1 return stocks