rohanbelsare's picture
Final Hackathon Deployment: Clean State
888cb3b
|
Raw History Blame Contribute Delete
11.1 kB
metadata
title: Smart Routing System
emoji: ๐Ÿš‘
colorFrom: red
colorTo: gray
sdk: docker
app_port: 7860
pinned: false

๐Ÿš‘ SmartER โ€” AI-Powered Healthcare Routing & Emergency Management

Hackathon: Meta PyTorch OpenEnv Hackathon x SST 2026 Framework: Meta's OpenEnv + PyTorch DQN Tech Stack: Python ยท FastAPI ยท React ยท Leaflet ยท Gymnasium


๐Ÿ“‹ Table of Contents

  1. Project Overview
  2. Folder Structure
  3. Quick Start (3 minutes)
  4. RL Environment Details
  5. Backend API
  6. Frontend Pages
  7. Training the DQN Model
  8. Simulation & Live Demo
  9. Deployment
  10. OpenEnv Submission

๐Ÿง  Project Overview

SmartER uses Reinforcement Learning to solve real-world emergency healthcare routing:

Problem RL Solution
Which hospital has capacity? State includes live bed counts
Which ambulance is nearest? State includes all GPS positions
Critical patient needs ICU? Reward function weights ICU access
Minimize response time? Distance + ETA encoded as penalties

Core RL Setup (OpenEnv-compatible):

  • Environment: HealthcareRoutingEnv (Gymnasium API)
  • State: Patient severity + location + hospital beds + ambulance positions
  • Actions: Discrete โ€” choose (hospital, ambulance) pair
  • Reward: +100 admit, +70 ICU for critical, +50 fast response, penalties for bad choices
  • Agent: Deep Q-Network (DQN) with PyTorch

๐Ÿ“ Folder Structure

healthcare_rl/
โ”œโ”€โ”€ openenv_env/            โ† ๐Ÿ† Core OpenEnv submission
โ”‚   โ”œโ”€โ”€ healthcare_env.py   โ† Gymnasium RL environment
โ”‚   โ”œโ”€โ”€ task.py             โ† OpenEnv Task + Grader
โ”‚   โ”œโ”€โ”€ register.py         โ† gym.make() registration
โ”‚   โ””โ”€โ”€ requirements.txt
โ”‚
โ”œโ”€โ”€ rl/                     โ† PyTorch DQN agent
โ”‚   โ”œโ”€โ”€ dqn_agent.py        โ† DQN network + replay buffer
โ”‚   โ”œโ”€โ”€ train.py            โ† Training loop
โ”‚   โ””โ”€โ”€ models/             โ† Saved model weights (created on train)
โ”‚
โ”œโ”€โ”€ backend/                โ† FastAPI REST + WebSocket server
โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ””โ”€โ”€ main.py         โ† All endpoints + simulation engine
โ”‚   โ”œโ”€โ”€ requirements.txt
โ”‚   โ””โ”€โ”€ Dockerfile
โ”‚
โ”œโ”€โ”€ frontend/               โ† React dashboard
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ App.jsx
โ”‚   โ”‚   โ”œโ”€โ”€ App.css
โ”‚   โ”‚   โ””โ”€โ”€ pages/
โ”‚   โ”‚       โ”œโ”€โ”€ Dashboard.jsx    โ† KPIs + charts
โ”‚   โ”‚       โ”œโ”€โ”€ MapView.jsx      โ† Live Leaflet map
โ”‚   โ”‚       โ”œโ”€โ”€ PatientForm.jsx  โ† Emergency intake
โ”‚   โ”‚       โ””โ”€โ”€ AdminPanel.jsx   โ† Hospital/ambulance management
โ”‚   โ”œโ”€โ”€ index.html          โ† Leaflet CDN loaded here
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”œโ”€โ”€ vite.config.js
โ”‚   โ””โ”€โ”€ Dockerfile
โ”‚
โ”œโ”€โ”€ data/
โ”‚   โ””โ”€โ”€ sample_data.json    โ† Seed data (hospitals, ambulances, patients)
โ”‚
โ”œโ”€โ”€ demo.py                 โ† Terminal demo (no server needed)
โ”œโ”€โ”€ docker-compose.yml
โ””โ”€โ”€ README.md

โšก Quick Start

Option A โ€” Terminal Demo (no setup needed)

# 1. Install Python dependencies
pip install gymnasium numpy torch

# 2. Run the demo
python demo.py

# Options:
python demo.py --episodes 5 --steps 20   # longer demo
python demo.py --random                  # compare with random policy
python demo.py --fast                    # no delay between steps

Option B โ€” Full Stack (Backend + Frontend)

Step 1: Backend

cd backend
pip install -r requirements.txt

# Copy RL modules to backend path
export PYTHONPATH=../openenv_env:../rl:$PYTHONPATH

cd api
uvicorn main:app --reload --port 8000

API is now live at http://localhost:8000 Interactive docs: http://localhost:8000/docs

Step 2: Frontend

cd frontend
cp .env.example .env          # sets VITE_API_URL=http://localhost:8000
npm install
npm run dev

UI is now live at http://localhost:5173

Option C โ€” Docker (one command)

docker-compose up --build

Frontend: http://localhost:3000 Backend: http://localhost:8000


๐Ÿค– RL Environment

State Space

The environment builds a flat numpy array with:

  • Patient: severity (normalised), latitude, longitude, traffic factor
  • Per hospital (ร—5): bed availability, ICU availability, distance, wait time
  • Per ambulance (ร—4): distance to patient, availability flag

Total observation size: 4 + 5ร—4 + 4ร—2 = 32 floats

Action Space

Discrete(20) โ€” one action per (hospital, ambulance) combination.

action = hospital_id * num_ambulances + ambulance_id

Reward Function

+100  patient admitted
+70   critical patient (severity โ‰ฅ 8) assigned ICU bed
+50   ambulance ETA < 10 minutes
+20   ambulance ETA < 20 minutes
-100  no bed available at hospital
-50   ambulance is busy
- distance_penalty (up to -40)
- wait_time_penalty (up to -30)
- severity_delay_penalty (critical patient + high ETA)

Usage

from openenv_env.healthcare_env import HealthcareRoutingEnv

env = HealthcareRoutingEnv(render_mode="human")
obs, info = env.reset()

for _ in range(100):
    action = env.get_greedy_action()      # or your RL policy
    obs, reward, terminated, truncated, info = env.step(action)
    if terminated or truncated:
        obs, info = env.reset()

๐Ÿš€ Training the DQN Model

cd rl

# Quick training (300 episodes)
python train.py

# Production training
python train.py --episodes 1000 --steps 150 --lr 0.0005

# With console rendering
python train.py --episodes 100 --render

The trained model is saved to rl/models/dqn_healthcare.pth.

Once trained, the backend API will automatically load it and use DQN instead of the greedy fallback.


๐ŸŒ Backend API

Method Endpoint Description
GET / Health check
POST /add_patient Register patient + get RL assignment
GET /get_hospitals Live hospital bed counts
GET /get_ambulances Live ambulance GPS positions
POST /assign_resources RL assignment without persisting
PUT /update_ambulance_location Update GPS position
PUT /update_hospital_beds Update bed availability
GET /get_live_tracking Full snapshot (map view)
GET /stats Dashboard statistics
GET /simulation/start Start auto simulation
GET /simulation/stop Stop simulation
WS /ws/live Real-time WebSocket push

Example โ€” Add a patient:

curl -X POST http://localhost:8000/add_patient \
  -H "Content-Type: application/json" \
  -d '{"name":"Ravi Kumar","severity":9.2,"lat":12.972,"lon":77.601}'

๐Ÿ—บ๏ธ Frontend Pages

Page Description
Dashboard KPI cards, bed occupancy bar chart, ambulance status pie, recent patients, simulation toggle
Live Map Leaflet map with moving ๐Ÿš‘ ambulances, ๐Ÿฅ hospitals (color-coded by occupancy), ๐Ÿค• patients. WebSocket updates every 2 seconds
New Emergency Patient intake form with severity slider โ†’ instant RL dispatch result with reasoning
Admin Panel Edit hospital beds/ICU/wait times inline, view ambulance statuses, full assignment history

๐ŸŽฎ Simulation & Live Demo

  1. Open the Dashboard tab
  2. Click โ–ถ๏ธ Start Simulation
  3. Switch to Live Map โ€” watch ambulances move in real-time
  4. New simulated patients appear every ~6 seconds
  5. Each patient is automatically assigned by the RL agent

For judges: the simulation creates realistic emergency scenarios with varying severity levels and traffic conditions to showcase the RL decision-making.

๐ŸŒŸ Core Features

๐Ÿง  AI-Powered Routing (PyTorch DQN)

The system's dispatch engine is powered by a custom-trained Deep Q-Network (DQN) built with PyTorch.

  • Smart Dispatch: Instead of using basic distance-based greedy algorithms, the AI evaluates patient severity, hospital bed/ICU availability, and real-time distance to make optimal routing decisions.
  • Seamless Integration: The FastAPI backend automatically detects and loads the trained model weights (rl/models/dqn_healthcare.pth) at startup.

๐Ÿ™๏ธ 3D Cyberpunk Radar (Three.js)

The live tracking map features a fully interactive, real-time 3D cityscape of Solapur built with Three.js.

  • Dynamic Visuals: Procedurally generated hospital buildings, pulsing patient spheres, and hovering ambulances with directional aiming.
  • Two-Phase Routing: Visualizes the complete emergency lifecycle in real-timeโ€”blue dotted paths when en-route to the patient, and green paths during hospital transport.
  • Interactive: Full drag, rotate, and zoom capabilities to monitor the dispatch grid.

โ˜๏ธ Deployment

Frontend โ†’ Vercel

cd frontend
npm run build
# Deploy dist/ folder to Vercel
vercel deploy

Backend โ†’ Render

  1. Create new Web Service on Render
  2. Set build command: pip install -r backend/requirements.txt
  3. Set start command: uvicorn backend.api.main:app --host 0.0.0.0 --port $PORT
  4. Set env var: PYTHONPATH=./openenv_env:./rl

๐Ÿ† OpenEnv Submission

The openenv_env/ folder contains the complete OpenEnv-spec submission:

# Verify submission
cd openenv_env
python register.py         # test gym.make() works
python task.py             # run grader on random + greedy policies

Grading criteria (100 pts total):

  • 40 pts โ€” Mean episode reward
  • 30 pts โ€” Success rate (% assignments that succeed)
  • 20 pts โ€” ICU assignment rate for critical patients
  • 10 pts โ€” Ambulance utilisation

Expected scores:

  • Random policy: ~25โ€“35 pts
  • Greedy policy: ~55โ€“65 pts
  • Trained DQN: ~75โ€“90 pts

๐Ÿงช Running Tests

# Test RL environment
python -c "
from openenv_env.healthcare_env import HealthcareRoutingEnv
env = HealthcareRoutingEnv()
obs, _ = env.reset()
print('Obs shape:', obs.shape)
obs, r, term, trunc, info = env.step(0)
print('Reward:', r, '| Info:', info)
print('โœ… Environment OK')
"

# Test grader
cd openenv_env && python task.py

# Test backend (requires uvicorn running)
curl http://localhost:8000/stats

๐Ÿ‘ฅ Team & Acknowledgements

Built for Meta PyTorch OpenEnv Hackathon x SST 2026.

Team Members:

  1. Rohan Belsare
  2. Rajat Sahuji
  3. Sanchita Patil

Tech Stack: