Constructive Heuristics for Set Covering Problem (SCP)

Constructive Heuristics for Set Covering Problem (SCP)#

Problem#

The Set Covering Problem (SCP) is a classic combinatorial optimization problem.

  • Given: A universal set of elements and a collection of subsets

  • Objective: Select minimum number of subsets that cover all elements

  • Constraints: Each element must be covered by at least one selected subset

Algorithm Design Task#

Constructive heuristics iteratively select subsets to cover remaining elements.

  • Inputs: Selected subsets, remaining subsets, remaining elements

  • Outputs: Next subset to select

Evaluation#

  • Dataset: 16 instances, 50 elements, 50 subsets

  • Fitness: Average number of subsets used (minimized)

Template#

template_program = '''
import numpy as np

def select_next_subset(selected_subsets: List[List[int]], remaining_subsets: List[List[int]], remaining_elements: List[int]) -> List[int] | None:
    """
    A heuristic for the Set Covering Problem.

    Args:
        selected_subsets: List of already selected subsets.
        remaining_subsets: List of remaining subsets to choose from.
        remaining_elements: List of elements still to be covered.

    Returns:
        The next subset to select, or None if no subset can cover any remaining elements.
    """
    max_covered = 0
    best_subset = None

    for subset in remaining_subsets:
        covered = len(set(subset).intersection(remaining_elements))
        if covered > max_covered:
            max_covered = covered
            best_subset = subset

    return best_subset
'''

task_description = '''
The task involves selecting a minimum number of subsets from a collection that
covers all elements in a universal set.
Help me design a novel algorithm to select the next subset in each step.
'''

Configuration Parameters#

Parameter Description Default
timeout_seconds Maximum evaluation time 30
n_instance Number of problem instances 16
n_elements Number of elements 50
n_subsets Number of subsets 50
max_subset_size Maximum subset size 8

Example Usage#

from llm4ad.task.optimization.set_cover_construct import SCPEvaluation

evaluator = SCPEvaluation()

def select_next_subset(selected_subsets, remaining_subsets, remaining_elements):
    max_covered = 0
    best_subset = None
    for subset in remaining_subsets:
        covered = len(set(subset).intersection(remaining_elements))
        if covered > max_covered:
            max_covered = covered
            best_subset = subset
    return best_subset

result = evaluator.evaluate_program('', select_next_subset)