Skip to content

Bilevel client generator

BilevelClientGenerator(clients_per_route, random_count=False, min_budget_factor=1.2, max_budget_factor=1.8, possible_weights=None, seed=42)

Bases: EntityProcessor

Generate synthetic bilevel clients on each route.

For every route \((i,j)\) with \(i \neq j\), generates a random number of clients, each with a weight \(a_{ij}^z\) (sampled from possible_weights) and a budget \(b_{ij}^z = c_{ij} \cdot a_{ij}^z \cdot \text{factor}\), where the factor is uniformly sampled from \([\text{min\_budget\_factor}, \text{max\_budget\_factor}]\).

Parameters:

Name Type Description Default
clients_per_route int

Number of clients per route (or max if random_count is True).

required
random_count bool

If True, each route gets a random number of clients between 1 and clients_per_route.

False
min_budget_factor float

Minimum multiplier for budget generation.

1.2
max_budget_factor float

Maximum multiplier for budget generation.

1.8
possible_weights List[float]

List of possible client weights to sample from.

None
seed int

Random seed for reproducibility.

42
Source code in src/oracle_paper/data/generator/bilevel_client_generator.py
def __init__(
    self,
    clients_per_route: int,
    random_count: bool = False,
    min_budget_factor: float = 1.2,
    max_budget_factor: float = 1.8,
    possible_weights: List[float] = None,
    seed: int = 42,
):
    self.clients_per_route = clients_per_route
    self.random_count = random_count
    self.min_budget_factor = min_budget_factor
    self.max_budget_factor = max_budget_factor
    self.possible_weights = possible_weights or list(range(1,21))
    self.rng = random.Random(seed)