Constructive Heuristics for Knapsack Problem

Constructive Heuristics for Knapsack Problem#

Problem#

The Knapsack Problem is a classic combinatorial optimization problem where items with weights and values must be selected to maximize total value without exceeding capacity.

  • Given: A set of items, each with a weight and value, and a knapsack with limited capacity

  • Objective: Maximize the total value of selected items

  • Constraints: Total weight cannot exceed knapsack capacity

Algorithm Design Task#

Constructive heuristics iteratively select items to add to the knapsack. The task is to design the heuristic for selecting the next item in each iteration.

  • Inputs: Remaining capacity, remaining items (weight, value, index)

  • Outputs: Selected item (weight, value, index) or None

Evaluation#

  • Dataset: 32 instances, 50 items, capacity = 100

  • Fitness: Average total value (maximized)

Template#

template_program = '''
import numpy as np

def select_next_item(remaining_capacity: int, remaining_items: List[Tuple[int, int, int]]) -> Tuple[int, int, int] | None:
    """
    Select the item with the highest value-to-weight ratio that fits in the remaining capacity.

    Args:
        remaining_capacity: The remaining capacity of the knapsack.
        remaining_items: List of tuples containing (weight, value, index) of remaining items.

    Returns:
        The selected item as a tuple (weight, value, index), or None if no item fits.
    """
    best_item = None
    best_ratio = -1

    for item in remaining_items:
        weight, value, index = item
        if weight <= remaining_capacity:
            ratio = value / weight
            if ratio > best_ratio:
                best_ratio = ratio
                best_item = item

    return best_item
'''

task_description = '''
Given a set of items with weights and values, the goal is to select a subset of items
that maximizes the total value while not exceeding the knapsack's capacity.
Help me design a novel algorithm to select the next item in each step.
'''

Configuration Parameters#

Parameter Description Default
timeout_seconds Maximum evaluation time 20
n_instance Number of problem instances 32
n_items Number of items 50
knapsack_capacity Knapsack capacity 100

Example Usage#

from llm4ad.task.optimization.knapsack_construct import KnapsackEvaluation

evaluator = KnapsackEvaluation()

def select_next_item(remaining_capacity, remaining_items):
    # Greedy by value-to-weight ratio
    best_item = None
    best_ratio = -1
    for item in remaining_items:
        weight, value, index = item
        if weight <= remaining_capacity:
            ratio = value / weight
            if ratio > best_ratio:
                best_ratio = ratio
                best_item = item
    return best_item

result = evaluator.evaluate_program('', select_next_item)