--- title: Maintenance Scheduling (Python) emoji: 🔧 colorFrom: gray colorTo: green sdk: docker app_port: 8080 pinned: false license: apache-2.0 short_description: SolverForge Maintenance Scheduling problem --- # Maintenance Scheduling (Python) Assign maintenance jobs to crews and schedule them over time, avoiding conflicts and meeting deadlines. - [Prerequisites](#prerequisites) - [Run the application](#run-the-application) - [Test the application](#test-the-application) ## Prerequisites 1. Install [Python 3.10, 3.11 or 3.12](https://www.python.org/downloads/). 2. Install JDK 17+, for example with [Sdkman](https://sdkman.io): ```sh $ sdk install java ``` ## Run the application 1. Git clone the solverforge-quickstarts repo and navigate to this directory: ```sh $ git clone https://github.com/SolverForge/solverforge-quickstarts.git ... $ cd solverforge-quickstarts/fast/maintenance-scheduling-fast ``` 2. Create a virtual environment: ```sh $ python -m venv .venv ``` 3. Activate the virtual environment: ```sh $ . .venv/bin/activate ``` 4. Install the application: ```sh $ pip install -e . ``` 5. Run the application: ```sh $ run-app ``` 6. Visit [http://localhost:8080](http://localhost:8080) in your browser. 7. Click on the **Solve** button. ## Problem Description The maintenance scheduling problem assigns maintenance jobs to crews over a planning period while respecting constraints: ### Hard Constraints - **Crew conflict**: A crew can only work on one job at a time - **Min start date**: Jobs cannot start before their ready date - **Max end date**: Jobs must complete before their deadline ### Soft Constraints - **Before ideal end date**: Slight penalty for finishing too early (maintenance cycles restart sooner) - **After ideal end date**: Heavy penalty for finishing late (risk of missing deadline) - **Tag conflict**: Avoid scheduling jobs with the same tag (e.g., same area) at overlapping times ## Test the application 1. Run tests: ```sh $ pytest ``` ## More information Visit [solverforge.org](https://www.solverforge.org).