Multi-Project Resource Allocation

Organizations rarely run a single project. They run portfolios of projects competing for the same limited resources: people, budget, equipment, and time.

Why Resource Allocation Is Hard

Without systematic allocation:

  • Critical projects lack resources
  • Low-priority projects consume scarce talent
  • Resource conflicts cause delays across all projects
  • Overloaded employees burn out and quit

A 10% improvement in resource allocation efficiency can increase portfolio throughput by 25% or more.

What Is Multi-Project Resource Allocation?

The problem: given a set of projects with resource requirements and a pool of limited resources, assign resources to projects to maximize total value.

| Resource Type | Example | Typical Constraint | |---------------|---------|:------------------:| | People | Engineers, designers | Max 10 engineers available | | Budget | Capital, operational | $500K total budget | | Equipment | Servers, lab space | 20 server rack units | | Time | Project deadlines | All projects done in 6 months |

How to Model Resource Allocation

Problem Setup

A consulting firm has 3 projects and 4 types of consultants. Each project needs specific hours from each consultant type.

import pulp

# Projects
projects = ["WebApp", "MobileApp", "DataPlatform"]

# Consultant types
roles = ["Senior", "Mid", "Junior", "Designer"]

# Available hours per consultant type (per month)
available = {"Senior": 160, "Mid": 320, "Junior": 480, "Designer": 160}

# Hours needed per project per role
# (project, role): hours needed
hours_needed = {
    ("WebApp", "Senior"): 80,
    ("WebApp", "Mid"): 160,
    ("WebApp", "Junior"): 240,
    ("WebApp", "Designer"): 40,
    ("MobileApp", "Senior"): 120,
    ("MobileApp", "Mid"): 80,
    ("MobileApp", "Junior"): 160,
    ("MobileApp", "Designer"): 80,
    ("DataPlatform", "Senior"): 160,
    ("DataPlatform", "Mid"): 240,
    ("DataPlatform", "Junior"): 80,
    ("DataPlatform", "Designer"): 40,
}

# Revenue per project
revenue = {"WebApp": 200000, "MobileApp": 250000, "DataPlatform": 300000}

# Cost per hour per role
cost = {"Senior": 150, "Mid": 100, "Junior": 60, "Designer": 120}

# Create problem
prob = pulp.LpProblem("Resource_Allocation", pulp.LpMaximize)

# Decision variables: hours of each role assigned to each project
x = {}
for p in projects:
    for r in roles:
        x[(p, r)] = pulp.LpVariable(f"x_{p}_{r}", lowBound=0)

# Whether each project is selected (binary)
selected = {}
for p in projects:
    selected[p] = pulp.LpVariable(f"selected_{p}", cat="Binary")

# Objective: maximize profit (revenue - cost)
prob += pulp.lpSum(
    revenue[p] * selected[p] - pulp.lpSum(cost[r] * x[(p, r)] for r in roles)
    for p in projects
), "Maximize_Profit"

# Constraint 1: Resource availability
for r in roles:
    prob += pulp.lpSum(x[(p, r)] for p in projects) <= available[r], f"Resource_{r}"

# Constraint 2: Link selection to hours
M = 10000  # Large number
for p in projects:
    prob += pulp.lpSum(x[(p, r)] for r in roles) <= M * selected[p], f"Select_{p}"
    prob += pulp.lpSum(x[(p, r)] for r in roles) >= hours_needed[(p, r)] * selected[p], f"MinHours_{p}"

# Constraint 3: At most 2 projects selected
prob += pulp.lpSum(selected[p] for p in projects) <= 2, "Max_Projects"

# Solve
prob.solve()

print(f"Status: {pulp.LpStatus[prob.status]}")
print(f"Total Profit: ${pulp.value(prob.objective):,.0f}")
print()

for p in projects:
    if pulp.value(selected[p]) == 1:
        print(f"{p}: SELECTED")
        total_hours = sum(pulp.value(x[(p, r)]) for r in roles)
        total_cost = sum(pulp.value(x[(p, r)]) * cost[r] for r in roles)
        print(f"  Hours: {total_hours:.0f}, Cost: ${total_cost:.0f}")
        for r in roles:
            h = pulp.value(x[(p, r)])
            if h and h > 0:
                print(f"    {r}: {h:.0f} hrs")

Advanced Constraints

Minimum Resource Utilization

# Each selected project must use at least 50% of its requested hours
for p in projects:
    total_requested = sum(hours_needed[(p, r)] for r in roles)
    prob += pulp.lpSum(x[(p, r)] for r in roles) >= 0.5 * total_requested * selected[p]

Maximum Allocation per Role

# No single project gets more than 60% of any role
for r in roles:
    for p in projects:
        prob += x[(p, r)] <= 0.6 * available[r]

Phased Allocation

# Months 1-2: focus on WebApp, Months 3-4: focus on MobileApp
# Model with time-phased variables

Real-World Applications

| Industry | Resources | Projects | Typical Size | |----------|-----------|----------|:------------:| | Consulting | Consultants by skill level | Client engagements | 50-200 | | Software | Engineers by specialty | Product features | 20-100 | | Construction | Labor, equipment, materials | Building projects | 10-50 | | RD | Scientists, lab equipment | Research programs | 30-80 | | Marketing | Designers, copywriters, budget | Campaigns | 15-40 |

Compare: Manual vs ILP Allocation

| Aspect | Manual (Spreadsheet) | ILP Optimization | |--------|:-------------------:|:----------------:| | Time to schedule | 2-3 days | 30 seconds | | Optimality | ~70% | 95%+ | | Constraint handling | Prone to errors | 100% consistent | | What-if analysis | Hours per scenario | Seconds per scenario | | Scalability | Falls apart at 20 projects | Handles 1000+ |

The Vibe Coding Approach

"I have 3 projects with different resource needs across 4 consultant types. Each consultant type has limited hours per month. Maximize profit. At most 2 projects can be selected."

The AI will generate the complete PuLP resource allocation model.

Summary

Multi-project resource allocation is a critical business problem that ILP solves efficiently. The model balances resource constraints with project selection to maximize overall value.

Key takeaways:

  • Resources include people, budget, equipment, and time
  • Binary variables model project selection
  • Continuous variables model resource allocation quantity
  • Big-M constraints link selection to allocation
  • Multiple constraint types model real business rules
  • ILP finds optimal solutions in seconds vs days manually

What's Next: Supply Chain Optimization

The next chapter extends resource allocation to supply chain networks - optimizing inventory, production, and distribution across multiple locations.

Sensitivity Analysis

After finding the optimal allocation, ask "what-if" questions:

What if we hire another Senior consultant?

  • Increase available["Senior"] by 160 hours
  • Re-run the model
  • Is the additional profit worth the hiring cost?

What if a project deadline is moved?

  • Adjust the hours_needed or add time constraints
  • See how resource allocation shifts

What if budget is cut by 20%?

  • Reduce available hours proportionally
  • Which projects get descoped or delayed?

Practical Tips

| Tip | Why | |-----|-----| | Start with a simplified model | Get a baseline before adding complexity | | Test with historical data | Validate the model against past decisions | | Run what-if scenarios | Understand sensitivity before committing | | Combine with human judgment | ILP is a decision support tool, not a replacement | | Update regularly | Re-run as project requirements change |

Summary

Multi-project resource allocation with ILP enables organizations to maximize portfolio value under real-world constraints.

Unlock Full Tutorial

This chapter is paid content. Join the project to unlock over 5000 words of deep analysis, including 10+ god-tier Prompts and real Source Code examples!