Construction Project Planning
Overview
Construction project optimization helps builders schedule tasks, allocate crews, and sequence activities to finish projects on time and under budget. Construction projects involve dozens of interdependent tasks where delays in one activity cascade through the entire schedule. Optimization finds the fastest or cheapest way to complete the project while respecting task dependencies and resource limits.
With construction projects frequently running over schedule and over budget, even modest improvements in scheduling efficiency can prevent costly delays and idle equipment.
When to Use This
Best for: Project managers and site supervisors who need to create feasible schedules for construction projects with task dependencies, shared crews, and equipment constraints.
- Scenario: You have a construction project with many tasks that depend on each other, and you need to assign limited crews and equipment to minimize the total project duration or cost
- Industry: Residential and commercial construction, infrastructure, civil engineering, renovation, industrial plant construction
- ROI: Typical schedule compression of 10-20%, reduction in idle crew time by 15-30%, and better equipment utilization
Step-by-Step Walkthrough
1. Define project tasks
List every task with its estimated duration (in days or weeks). Examples: excavation (5 days), foundation (10 days), framing (15 days), electrical (8 days), plumbing (6 days), finishing (12 days).
2. Establish task dependencies
Specify which tasks must finish before others can start. Foundation cannot begin until excavation is complete. Electrical and plumbing can run in parallel after framing, but finishing requires both to be done.
3. Define available resources
List crews and equipment with their daily availability. You might have 3 general crews, 1 electrical crew, and 1 plumbing crew. Each task requires specific crew types.
4. Set the objective
Choose your goal:
- Minimize total project duration (most common)
- Minimize total project cost (when overtime and crew costs vary)
- Level resource usage to avoid peak-and-valley crew scheduling

5. Review the optimized schedule
The solver returns the start and end date for each task, which crews are assigned when, and the critical path (the sequence of tasks that determines the minimum project duration). Focus attention on critical path tasks -- any delay there delays the entire project.
Example Parameters
import httpx
API_URL = "https://api.jaot.io/api/v2"
headers = {"Authorization": "Bearer ok_live_your_key_here"}
# Minimize project makespan for 6 tasks with 3 crews
response = httpx.post(f"{API_URL}/solve", headers=headers, json={
"variables": [
# start_X = start day of task X
{"name": "start_excavation", "type": "continuous", "lb": 0},
{"name": "start_foundation", "type": "continuous", "lb": 0},
{"name": "start_framing", "type": "continuous", "lb": 0},
{"name": "start_electrical", "type": "continuous", "lb": 0},
{"name": "start_plumbing", "type": "continuous", "lb": 0},
{"name": "start_finishing", "type": "continuous", "lb": 0},
{"name": "project_end", "type": "continuous", "lb": 0},
],
"objective": {
"sense": "minimize",
"coefficients": {"project_end": 1},
},
"constraints": [
{
"name": "foundation_after_excavation",
"coefficients": {"start_foundation": 1, "start_excavation": -1},
"sense": ">=",
"rhs": 5,
},
{
"name": "framing_after_foundation",
"coefficients": {"start_framing": 1, "start_foundation": -1},
"sense": ">=",
"rhs": 10,
},
{
"name": "electrical_after_framing",
"coefficients": {"start_electrical": 1, "start_framing": -1},
"sense": ">=",
"rhs": 15,
},
{
"name": "plumbing_after_framing",
"coefficients": {"start_plumbing": 1, "start_framing": -1},
"sense": ">=",
"rhs": 15,
},
{
"name": "finishing_after_electrical",
"coefficients": {"start_finishing": 1, "start_electrical": -1},
"sense": ">=",
"rhs": 8,
},
{
"name": "finishing_after_plumbing",
"coefficients": {"start_finishing": 1, "start_plumbing": -1},
"sense": ">=",
"rhs": 6,
},
{
"name": "end_after_finishing",
"coefficients": {"project_end": 1, "start_finishing": -1},
"sense": ">=",
"rhs": 12,
},
],
})
result = response.json()
print(f"Minimum project duration: {result['objective_value']:.0f} days")
for var in result["variables"]:
print(f" {var['name']}: day {var['value']:.0f}")Templates
Next Steps
- Facility Location -- Optimize where to place warehouses, plants, or service centers
intermediate - Real Estate Investment -- Evaluate property development portfolios and acquisition strategies
intermediate - Workforce Scheduling -- Optimize crew shifts and assignments across job sites
intermediate