A demo of the dynamic-pricing model developed for the SUM project. The model and methodology are described in CSI_Report_D1_Mesut_Can_Koseoglu.pdf.
The core deliverable is the sum_nsm_dynamic_pricing Python package: it
generates optimization-ready mobility instances from GTFS and GBFS data, runs OpenTripPlanner-based
routing, solves the bilevel dynamic-pricing optimization model, and exports summary metrics.
- Build station inputs from GTFS and GBFS (
stations.json). - Build multimodal hubs with clustering (
hubs.geojson). - Query OpenTripPlanner (OTP) for OD routes (
od_routes.json). - Build the optimization instance file (
Instance_*.json). - Run the bilevel optimization (
optimization_instance_results.json). - Compute summary metrics (
optimization_metrics.json).
If OTP is unavailable, route generation and the downstream steps are blocked.
| Path | Description |
|---|---|
sum_nsm_dynamic_pricing/ |
The Python package — the core deliverable. |
demo_sum_nsm_dynamic_pricing.ipynb |
Demo notebook: optimization and metrics on a generated instance. |
data/sum_nsm_dynamic_pricing/geneva_1km_mon08h/ |
Sample Geneva inputs and outputs (stations, hubs, instance, results, metrics, web_demo/). |
CSI_Report_D1_Mesut_Can_Koseoglu.pdf |
Model document. |
- Python 3.10+
- Gurobi with an active license (
gurobipyis a required dependency) - OpenTripPlanner running and reachable from your machine
From the repository root:
cd sum_nsm_dynamic_pricing
python -m pip install --upgrade pip
python -m pip install -e .This installs the package in editable mode for local development.
Run the example pipeline script (sum_nsm_dynamic_pricing/examples/geneva_pipeline.py):
python sum_nsm_dynamic_pricing/examples/geneva_pipeline.pyThe script runs instance generation, optimization, and metrics export. It expects a GTFS zip at
./tpg_gtfs.zip and writes outputs to ./output_geneva.
For an interactive walkthrough of the optimization and metrics step, open demo_sum_nsm_dynamic_pricing.ipynb.
from pathlib import Path
from sum_nsm_dynamic_pricing import (
DonkeyRepublicProvider,
InstanceParams,
InstancePipeline,
OptimizerParams,
PipelineConfig,
)
config = PipelineConfig(
center_lat=46.2044,
center_lon=6.1432,
radius_m=2000,
output_dir=Path("./output_geneva"),
gtfs_path=Path("./tpg_gtfs.zip"),
gbfs_path=None,
seed=42,
)
pipeline = InstancePipeline(config=config, gbfs_provider=DonkeyRepublicProvider())
params = InstanceParams()
instance_path = pipeline.run_all(params)
solution_path = pipeline.optimize(OptimizerParams(), instance_path=instance_path)
metrics_path = pipeline.summarize_optimization(solution_path, params)A one-call run_pipeline(config, params) helper is also exported for the instance-generation step.
By default, outputs are written to the configured output_dir:
stations.jsonhubs.geojsonod_routes.jsonInstance_*.jsonoptimization_instance_results.jsonoptimization_metrics.jsongurobi/(solver logs and model artifacts)
A complete example output set is included under data/sum_nsm_dynamic_pricing/geneva_1km_mon08h/.
From the repository root:
cd sum_nsm_dynamic_pricing
python -m pip install --upgrade build
python -m buildBuild artifacts are generated in sum_nsm_dynamic_pricing/dist/. Install the wheel locally with:
python -m pip install dist/*.whl