Skip to content
JAOT

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

Construction Planning in JAOT Builder

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