Models
Model implementations for the Price-Setting Bilevel Hub Location Problem.
PS_HLP— Big-M reformulationPC_HLP— Fast Lagrange with recursive client aggregationPPC_HLP— Standard Lagrange with precedence constraintsPS_BHLP— Julia-based bilevel formulation
PC_HLP(n_hubs, alpha, data)
¶
Bases: BaseModel
Fast Lagrange Model — recursive client-aggregated formulation.
Unlike PS_HLP, this model uses aggregated client keys \((i,j,z)\) where \(z\) indexes a group of original clients. Clients are grouped by route \((i,j)\), ranked, and Lagrange multipliers \(\lambda_{ij}^z\) are computed recursively over segments. Price is not a Gurobi variable — it is inferred post-solve from the budget/weight ratio of the marginal client.
Variables:
| Symbol | Reproduces | Variable | Domain |
|---|---|---|---|
| \(x_{ik}\) | — | [AllocationVariable][bilevelpy.models.vars.hlp_vars.AllocationVariable] |
\(\{0,1\}\) |
| \(y_{ij}^z\) | — | RecursiveClientDecisionVariable |
\(\{0,1\}\) |
| \(X_{ijkm}^z\) | \(y_{ij}^z \cdot x_{ik} \cdot x_{jm}\) | RecursiveLinearXYVariable |
\(\{0,1\}\) |
Constraints:
| Constraint | Reference |
|---|---|
| HLP base | [NumberOfHubs][bilevelpy.models.constraints.hlp_constraints.NumberOfHubsConstraint], [SingleAllocation][bilevelpy.models.constraints.hlp_constraints.SingleAllocationConstraint], [AssignmentRestriction][bilevelpy.models.constraints.hlp_constraints.AssignmentRestrictionConstraint] |
| \(y = \sum X\), \(X \leq x\) | RecursiveLinearizationConstraint |
Objective (maximizes Lagrange-adjusted profit):
where \(K\) is the set of aggregated client keys and \(\lambda_{ij}^z\) are the recursive Lagrange multipliers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n_hubs
|
int
|
Number of hubs to open (\(p\)). |
required |
alpha
|
float
|
Cost scaling factor (\(\alpha\)). |
required |
data
|
MultiEntityDataset
|
Dataset with recursive Lagrange multipliers and grouped client keys. |
required |
Source code in src/oracle_paper/models/pc_hlp.py
PPC_HLP(n_hubs, alpha, data)
¶
Bases: BaseModel
Lagrange Model — standard Lagrange multiplier decomposition.
Uses Lagrange multipliers \(\lambda_{ij}^z\) to decompose the bilevel problem. Price is inferred post-solve (no price variable). Includes a precedence constraint ordering client decisions.
Variables:
| Symbol | Reproduces | Variable | Domain |
|---|---|---|---|
| \(x_{ik}\) | — | [AllocationVariable][bilevelpy.models.vars.hlp_vars.AllocationVariable] |
\(\{0,1\}\) |
| \(y_{ij}^z\) | — | ClientDecisionVariable |
\(\{0,1\}\) |
| \(X_{ijkm}^z\) | \(y_{ij}^z \cdot x_{ik} \cdot x_{jm}\) | LinearXYVariable |
\(\{0,1\}\) |
Constraints:
| Constraint | Reference |
|---|---|
| HLP base | [NumberOfHubs][bilevelpy.models.constraints.hlp_constraints.NumberOfHubsConstraint], [SingleAllocation][bilevelpy.models.constraints.hlp_constraints.SingleAllocationConstraint], [AssignmentRestriction][bilevelpy.models.constraints.hlp_constraints.AssignmentRestrictionConstraint] |
| \(y = \sum X\), \(X \leq x\) | LinearizationConstraint |
| \(y_{ij}^z \geq y_{ij}^{z+1}\) | [PrecendenceConstraint][oracle_paper.constraints.precedence_constraint.PrecendenceConstraint] |
Objective (maximizes Lagrange-adjusted profit):
Precedence constraint:
Ensures clients on the same route are accepted in ranked order (highest budget/weight ratio first).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n_hubs
|
int
|
Number of hubs to open (\(p\)). |
required |
alpha
|
float
|
Cost scaling factor (\(\alpha\)). |
required |
data
|
MultiEntityDataset
|
Dataset with Lagrange multipliers and client data. |
required |
Source code in src/oracle_paper/models/ppc_hlp.py
PS_BHLP(n_hubs, alpha, data)
¶
Bases: BaseModel
PS-BHLP solved via Julia Big-M reformulation.
Requires Julia ≥ 1.10 with JuMP, Gurobi, BilevelJuMP, and JSON on PATH.
Source code in src/oracle_paper/models/ps_bhlp.py
PS_HLP(n_hubs, alpha, data)
¶
Bases: BaseModel
Price-Setting Hub Location Problem with Big-M linearization.
The leader (hub operator) sets prices \(p_{ij}\) and allocates hubs \(x_{ik}\). The follower (clients) chooses routes \(y_{ij}^z\) to maximize their utility.
Variables:
| Symbol | Reproduces | Variable | Domain |
|---|---|---|---|
| \(x_{ik}\) | — | [AllocationVariable][bilevelpy.models.vars.hlp_vars.AllocationVariable] |
\(\{0,1\}\) |
| \(y_{ij}^z\) | — | ClientDecisionVariable |
\(\{0,1\}\) |
| \(X_{ijkm}^z\) | \(y_{ij}^z \cdot x_{ik} \cdot x_{jm}\) | LinearXYVariable |
\(\{0,1\}\) |
| \(p_{ij}\) | — | PriceVariable |
\(\mathbb{R}_{\geq 0}\) |
Constraints:
| Constraint | Reference |
|---|---|
| Exactly \(p\) hubs open | [NumberOfHubsConstraint][bilevelpy.models.constraints.hlp_constraints.NumberOfHubsConstraint] |
| Each node to one hub | [SingleAllocationConstraint][bilevelpy.models.constraints.hlp_constraints.SingleAllocationConstraint] |
| Only assigned to open hubs | [AssignmentRestrictionConstraint][bilevelpy.models.constraints.hlp_constraints.AssignmentRestrictionConstraint] |
| \(y = \sum X\), \(X \leq x\) | LinearizationConstraint |
| Price-revenue coupling | BigMConstraint |
Objective (leader maximizes profit):
where \(\tilde{c}_{ij}(x) = \sum_{k,m \in V} X_{ijkm}^z \bigl(\alpha\, c_{ik} + \alpha\, c_{km} + c_{mj}\bigr)\) is the transport cost through hubs \(k,m\).
Big-M constraint (couples price and decision):
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n_hubs
|
int
|
Number of hubs to open (\(p\)). |
required |
alpha
|
float
|
Cost scaling factor (\(\alpha\)). |
required |
data
|
MultiEntityDataset
|
Dataset with client weights, budgets, and transport costs. |
required |
Source code in src/oracle_paper/models/ps_hlp.py
get_transport_cost_sum(i, j, z)
¶
Compute the transport cost \(\tilde{c}_{ij}(x)\) for a route.