Quantum + AI planning for donor organ transport.
This effort is supported by Qollab & IonQ.
Donor organs are sometimes lost because transport fails, not for medical reasons. A flight is delayed, the plan breaks, and the organ runs past its safe time outside the body (its cold-ischemia limit). A heart has about 4 hours. A liver has about 12. A kidney has about 24.
This is a recognized problem. HRSA asked MITRE to study organ transportation logistics and recommend standards to reduce organs going unused for logistics reasons, and HRSA says it is building the data foundation to better understand transport failures.
Planning organ transport is hard because each organ has its own clock, vehicles are limited, and delays happen after the plan is made. Classical models for multi-organ routing exist. Quantum optimization has been applied to organ matching (kidney exchange). We did not find prior work applying it to organ transport. That is the gap this project explores.
AI predicts, quantum decides, humans approve.
All numbers come from saved runs in the results/ folder.
10,000 simulated transports, same random delays for every method:
| How the plan is made | Any organ late |
|---|---|
| Basic dispatch (cheapest option on the timetable, ignores delay risk) | 12.3% |
| Q-Organ Route (AI risk, plan once) | 5.3% |
| Q-Organ Route + re-planning | 1.0% |
Across 10 runs of 10,000 transports, the averages were 12.5%, 5.1% and 1.0%. Almost all failures are hearts, which have the shortest limit. Proof run on Qollab: results/qollab_full_run_ionq_aria1.txt.
Share of 4,096 samples that were the exact best plan (normal day / jet delayed 2.5 h). Random guessing gives 0.2%.
| Method | Simulator | Normal day | Jet delayed |
|---|---|---|---|
| Standard QAOA | Ideal (Qollab built-in) | 4.0% | 4.8% |
| Standard QAOA | IonQ Aria 1 noise model | 3.1% | 3.4% |
| XY-mixer QAOA | Ideal (Qiskit Aer) | 25.5% | 21.8% |
| XY-mixer QAOA | IonQ Aria 1 noise model | 9.4% | 8.5% |
| XY-mixer QAOA + AI risk | IonQ Aria 1 noise model | 10.6% | 9.9% |
QAOA found the best plan in every run. The XY mixer is about 4 to 6 times better than standard QAOA on an ideal simulator, and about 2.5 to 3 times better under IonQ noise.
Trained on Dec 1–21, tested on 186,734 flights from Dec 22–31 that the model never saw.
| AI model | Route average | |
|---|---|---|
| Ranking risky flights (AUC, higher is better) | 0.645 | 0.587 |
| Probability error (Brier, lower is better) | 0.1994 | 0.2075 |
| Delay length error (minutes, lower is better) | 57.5 | 60.8 |
The gain is modest. The model has no weather data yet.
BTS flight data ──► AI delay model ──► risk_table.py
│
scenario (organs, limits, vehicles) ◄──────┘
│
▼
QUBO (cost = time used vs. limit + cost + penalties)
│
├──► Classical check: brute force, OR-Tools CP-SAT
│
└──► QAOA (Qiskit): XY mixer + CVaR
│ trained on a statevector simulator
▼
IonQ Aria 1 noise model (one 18-qubit job: both scenarios side by side)
│
▼
Best plan ──► failure simulation ──► simulator app + transport log
The quantum part, in plain words:
requirements.txt lists only scipy. Qiskit and NumPy are already included on Qollab. OR-Tools does not install there, so that check is skipped automatically.
pip install -r requirements-full.txt scikit-learn pandas
python main.py # full pipeline (ideal Aer simulator, OR-Tools check included)
python failure_sim.py # failure simulation only
python ai_delay_model.py "On_Time_Reporting_Carrier_On_Time_Performance_(1987_present)_2025_12.csv"
The flight data is free from the BTS On-Time download page (choose December 2025, Prezipped File).
app/index.html is a self-contained page. Open it in a browser. Move the delay sliders to watch the plan re-solve, press Play transport to animate the trip, and press Simulate 10,000 transports to measure failures. The quantum numbers in the app are from the recorded IonQ runs. A web page can’t call IonQ live, so the sliders check each new plan with an exact solver, which confirms the same answers QAOA found.
Accessibility: text meets color-contrast guidelines in light and dark mode, every control works by keyboard with a visible focus outline, the map has alt text, and status is shown in words as well as color (“Within limit”, “Tight”, “Over limit”). Animation is skipped for people who turn on reduced motion.
| File | What it does |
|---|---|
main.py |
Runs everything (entry point on Qollab) |
scenario.py |
Organs, limits, transport options, AI risk hookup |
qubo.py |
Builds the QUBO and converts it to a quantum Hamiltonian |
qaoa_solve.py |
QAOA with XY mixer and CVaR; one-job sampling on IonQ |
baseline.py |
Classical checks: brute force and OR-Tools |
ai_delay_model.py |
Trains the delay model on BTS data |
risk_table.py |
The model’s predictions, used by the planner |
failure_sim.py |
Simulates 10,000 transports and counts missed limits |
app/index.html |
Interactive simulator with transport log |
results/ |
Saved output from every run |
Libraries: Qiskit, qiskit-ionq, SciPy, NumPy, scikit-learn, pandas, OR-Tools (local check only), Qiskit Aer (local only). Fonts in the simulator app: Barlow Condensed, Source Sans 3 and JetBrains Mono from Google Fonts.
Templates: none. The project was built from scratch during the hackathon window.
AI assistance: This project was built with help from Claude (Anthropic). At my direction, Claude researched the literature, wrote the code, debugged most errors, suggested scenario values. I chose the problem, decided what to research, directed the project, made the design decisions, and ran and verified all results on Qollab and IonQ’s simulators.
MIT License. See LICENSE.
Author: Patrick Charles (Qollab: Charpat160)