This archive is distributed in association with the INFORMS Journal on Computing under MIT License.
The software and data in this repository are a snapshot of the software that was used in the research reported in the paper Stationary Coupled-Flow Approximation for Time-Varying Retrial Queues by Ö. Schmiel, B. Legros, and R. Stolletz.
To cite the contents of this repository, please cite both the paper and this repo, using their respective DOIs.
https://doi.org/10.1287/ijoc.2025.1626
https://doi.org/10.1287/ijoc.2025.1626.cd
Below is the BibTeX for citing this snapshot of the repository.
@misc{Schmiel2026,
author = {Ömer Schmiel and Benjamin Legros and Raik Stolletz},
publisher = {INFORMS Journal on Computing},
title = {{Stationary Coupled-Flow Approximation for Time-Varying Retrial Queues}},
year = {2026},
doi = {10.1287/ijoc.2025.1626.cd},
url = {https://github.com/INFORMSJoC/2025.1626},
note = {Available for download at https://github.com/INFORMSJoC/2025.1626},
}
This repository contains the implementation of the Stationary Coupled-Flow (SCF) approximation for the analysis of time-dependent and stationary queueing systems with retrials after reneging.
All source code in this repository was written by the authors for this project, unless otherwise noted.
It includes:
- a stationary SCF calculation (stationary limit) under constant arrival rates;
- a time-dependent SCF calculation under time-dependent arrival rates;
- relevant formulas for the calculation of performance measures and retrial time discretization;
- precomputed retrial dictionaries for exponential, Erlang, hyperexponential, and deterministic retrial time distributions.
The default executable script, main.py, first prints stationary-limit performance measures and then runs the time-dependent sinusoidal experiment for several retrial-time distributions.
main.py: runs stationary and time-dependent experiments.algorithms/scf.py: SCF algorithms for stationary-limit and time-dependent calculations.problems/sinus.py: sinusoidal offered-load and arrival-rate problem generator.utils/utils.py: relevant formulas for the calculation of performance measures.utils/utils_retrials.py: retrial-time probability calculations.retrial_dictionary/: compressed.pbz2precomputed retrial dictionaries used by the time-dependent experiments.results/: generated automatically whenmain.pyruns; Excel files are written underresults/<YYYY-MM-DD>/SCF/<problem-name>/.
Install the Python dependencies with:
pip install -r requirements.txtRecommended environment: Python 3.11 with the package versions listed in requirements.txt.
From the repository root, run:
python main.pyThe script executes:
run_stationary_limit(), which returns relevant stationary performance measures (abandonment probability, utilization, expected queue length, and expected orbit size) based on the stationary limit of the SCF approximation for given parameter combinationsrun_time_dependent(), which returns the sinusoidal time-dependent example for exponential, Erlang, hyperexponential, and deterministic retrial time distributions.
Precomputed retrial dictionaries from retrial_dictionary/ can be used when matching files are available. If a matching dictionary is not available, these are computed using utils/utils_retrials.py.
To modify experiments, edit the parameter values in run_time_dependent() or run_stationary_limit() in main.py.
main.py writes time-dependent SCF output to Excel files in:
results/<YYYY-MM-DD>/SCF/<problem-name>/
Each workbook is named according to the retrial-time distribution and parameters, for example:
SCF_exponential_mean120_cv1.xlsx
SCF_erlang_mean120_cv0.5.xlsx
Each workbook contains:
Performance Measures: time-indexed arrival rates, server and service parameters, utilization, queue length, orbit size, and abandonment probability.Retrial Specifics: metadata describing the problem set, retrial distribution, and retrial-specific parameters.
The time-dependent analysis utilizes precomputed retrial dictionaries from retrial_dictionary/ when matching files are available. If a matching dictionary is not available, the code attempts to compute the dictionary at runtime using utils/utils_retrials.py.
To change the experiment, edit the parameter values in run_time_dependent() or run_stationary_limit() in main.py.
