Constructive Heuristics for 2D Bin Packing Problem

Constructive Heuristics for 2D Bin Packing Problem#

Problem#

The 2D Bin Packing Problem involves packing rectangular items into rectangular bins.

  • Given: A set of rectangular items with specific widths and heights, bins of fixed dimensions

  • Objective: Minimize the number of bins used

  • Constraints: Items must not overlap, items must fit within bin boundaries

Algorithm Design Task#

Constructive heuristics iteratively select items and bins for placement.

  • Inputs: Remaining items (width, height), point matrices (occupancy grids)

  • Outputs: (selected_item, selected_bin)

Evaluation#

  • Dataset: 8 instances, 100 items, 100x100 bins

  • Fitness: Average number of bins used (minimized)

Template#

template_program = '''
import numpy as np

def determine_next_assignment(remaining_items: List[Tuple[int, int]],
                             point_matrices: List[List[List[int]]]) -> Tuple[Tuple[int, int], int]:
    """
    A simple heuristic function to select the next item and bin for packing.

    Args:
        remaining_items: List of (width, height) tuples.
        point_matrices: List of 2D matrices (0=empty, 1=occupied).

    Returns:
        A tuple containing: (selected_item, selected_bin)
    """
    selected_item = max(remaining_items, key=lambda x: x[0] * x[1])

    for bin_idx, point_matrix in enumerate(point_matrices):
        bin_width = len(point_matrix)
        bin_height = len(point_matrix[0]) if bin_width > 0 else 0
        if bin_width >= selected_item[0] and bin_height >= selected_item[1]:
            for x in range(bin_width - selected_item[0] + 1):
                for y in range(bin_height - selected_item[1] + 1):
                    if all(point_matrix[x + dx][y + dy] == 0
                           for dx in range(selected_item[0])
                           for dy in range(selected_item[1])):
                        return selected_item, bin_idx
    return selected_item, None
'''

task_description = '''
Given a set of rectangular bins and rectangular items, iteratively assign each item to a
feasible position in one of the bins. Design a constructive heuristic that, in each
iteration, selects the best item and placement from the remaining items and feasible
corners, with the objective of minimizing the number of used bins.
'''

Configuration Parameters#

Parameter Description Default
timeout_seconds Maximum evaluation time 120
n_bins Number of bins 100
n_instance Number of problem instances 8
n_items Number of items 100
bin_width Bin width 100
bin_height Bin height 100

Example Usage#

from llm4ad.task.optimization.bp_2d_construct import BP2DEvaluation

evaluator = BP2DEvaluation()

def determine_next_assignment(remaining_items, point_matrices):
    selected_item = max(remaining_items, key=lambda x: x[0] * x[1])
    for bin_idx, point_matrix in enumerate(point_matrices):
        bin_width = len(point_matrix)
        bin_height = len(point_matrix[0]) if bin_width > 0 else 0
        if bin_width >= selected_item[0] and bin_height >= selected_item[1]:
            for x in range(bin_width - selected_item[0] + 1):
                for y in range(bin_height - selected_item[1] + 1):
                    if all(point_matrix[x + dx][y + dy] == 0
                           for dx in range(selected_item[0])
                           for dy in range(selected_item[1])):
                        return selected_item, bin_idx
    return selected_item, None

result = evaluator.evaluate_program('', determine_next_assignment)