Constructive Heuristics for Capacitated Facility Location Problem (CFLP)

Constructive Heuristics for Capacitated Facility Location Problem (CFLP)#

Problem#

The Capacitated Facility Location Problem (CFLP) involves assigning customers to facilities while respecting capacity constraints.

  • Given: Set of facilities with capacities, set of customers with demands, assignment costs

  • Objective: Minimize total assignment cost while satisfying capacity constraints

  • Constraints: Each customer must be assigned to exactly one facility, facility capacities must not be exceeded

Algorithm Design Task#

Constructive heuristics iteratively assign customers to facilities.

  • Inputs: Current assignments, remaining customers, remaining capacities, customer demands, assignment costs

  • Outputs: (customer_id, facility_id) tuple

Evaluation#

  • Dataset: 16 instances, 50 facilities, 50 customers

  • Fitness: Average total cost (minimized)

Template#

template_program = '''
import numpy as np

def select_next_assignment(assignments: List[List[int]], remaining_customers: List[int],
                          remaining_capacities: List[int], customer_demands: List[int],
                          assignment_costs: List[List[int]]) -> Tuple[int, int]:
    """
    Constructive heuristic for the Capacitated Facility Location Problem.

    Args:
        assignments: Current assignments of customers to facilities.
        remaining_customers: List of customer indices not yet assigned.
        remaining_capacities: Remaining capacities of facilities.
        customer_demands: List of customer demands.
        assignment_costs: 2D list of assignment costs.

    Returns:
        A tuple containing: (selected_customer, selected_facility)
    """
    for customer in remaining_customers:
        min_cost = float('inf')
        selected_facility = None
        for facility in range(len(remaining_capacities)):
            if remaining_capacities[facility] >= customer_demands[customer]:
                if assignment_costs[facility][customer] < min_cost:
                    min_cost = assignment_costs[facility][customer]
                    selected_facility = facility
        if selected_facility is not None:
            return customer, selected_facility
    return None, None
'''

task_description = '''
Given facilities with capacities and customers, iteratively assign customers to facilities
while respecting capacity constraints and minimizing total costs.
Design a novel algorithm to select the next assignment in each step.
'''

Configuration Parameters#

Parameter Description Default
timeout_seconds Maximum evaluation time 60
n_instance Number of problem instances 16
n_facilities Number of facilities 50
n_customers Number of customers 50
max_capacity Maximum facility capacity 100
max_demand Maximum customer demand 20

Example Usage#

from llm4ad.task.optimization.cflp_construct import CFLPEvaluation

evaluator = CFLPEvaluation()

def select_next_assignment(assignments, remaining_customers, remaining_capacities,
                          customer_demands, assignment_costs):
    for customer in remaining_customers:
        min_cost = float('inf')
        selected_facility = None
        for facility in range(len(remaining_capacities)):
            if remaining_capacities[facility] >= customer_demands[customer]:
                if assignment_costs[facility][customer] < min_cost:
                    min_cost = assignment_costs[facility][customer]
                    selected_facility = facility
        if selected_facility is not None:
            return customer, selected_facility
    return None, None

result = evaluator.evaluate_program('', select_next_assignment)