Facility Layout & Assembly Line Balancing
Arranging work for smooth flow. Learn layout types (process, product, cellular, fixed-position), from–to charts and load–distance analysis, systematic layout planning (SLP) and relationship charts, material handling, cycle/takt time, precedence diagrams, line balancing heuristics (largest candidate rule, ranked positional weight), efficiency and balance delay, mixed-model lines and U-lines — with Python balancing an 8-task line.
Layout determines how far materials and people travel, how visible problems are, and how much WIP piles up between steps. Moving from a functional layout to a product-flow or cellular layout often cuts lead time by 50–90%.
On assembly lines, work must be divided among stations so each finishes within the takt time set by customer demand. Line balancing assigns tasks to stations while respecting precedence, minimising the number of stations and idle time.
An analogy
Line balancing is like dividing chores among housemates so everyone finishes at about the same time: if one person has much more to do, everyone else waits (the bottleneck) and the household's pace is set by the slowest.
Layout types
Choose by volume and variety:
- Process (functional) layout — machines grouped by type; flexible, long flows, high WIP (job shops, hospitals)
- Product (line) layout — equipment in sequence; efficient for high volume, low variety (assembly lines)
- Cellular layout — cells of dissimilar machines for part families (group technology); short flows, lean
- Fixed-position layout — product stays, resources come to it (aircraft, ships, buildings)
Designing layouts
Collect product–quantity data and routings; build from–to charts of material flows; evaluate layouts by load × distance; use systematic layout planning (SLP) with activity relationship charts (A, E, I, O, U, X closeness ratings) and space requirements; iterate with block layouts, then detailed layouts including aisles, handling equipment (conveyors, AGVs, forklifts) and safety.
Line balancing
Compute takt time from demand; draw the precedence diagram; assign tasks to stations without exceeding the cycle time or violating precedence; aim for the minimum number of stations and balanced loads. Measure efficiency and balance delay. If a single task exceeds takt, parallel stations or task redesign are needed.
Advanced line design
Mixed-model lines build several variants with sequencing to smooth workload (heijunka); U-shaped lines let operators tend stations on both sides, improving balance and flexibility; buffers decouple stations with variable times; stochastic task times require lower target loads; SALBP/ALBP integer programs optimise; simulation validates throughput under breakdowns and variability.
Formulas
- Takt time:
T_takt = available production time / required output - Minimum stations:
N_min = ⌈Σtᵢ / C⌉ - Efficiency:
E = Σtᵢ / (N·C) - Balance delay:
BD = (N·C − Σtᵢ) / (N·C) - Load–distance score:
LD = Σ (loads_ij × distance_ij)
Worked example: Takt time
Given: 450 min available, demand 300 units
Find: Takt.
- 450/300
Answer: 1.5 min/unit
Worked example: Minimum stations
Given: Σt = 7.2 min, C = 1.5 min
Find: N_min.
- ⌈7.2/1.5⌉ = ⌈4.8⌉
Answer: 5 stations
Worked example: Load–distance
Given: Flows 100 trips at 30 m, 40 trips at 50 m
Find: LD score.
- 100 × 30 + 40 × 50
Answer: 5000 trip-m (compare alternatives)
Largest-candidate-rule line balancing
import math
# Assembly line balancing with the largest-candidate rule
tasks = {"A": (0.20, []), "B": (0.40, ["A"]), "C": (0.70, ["A"]), "D": (0.10, ["B"]),
"E": (0.30, ["B", "C"]), "F": (0.50, ["C"]), "G": (0.40, ["D", "E"]), "H": (0.30, ["F", "G"])}
demand_per_shift, shift_min = 420, 420
cycle = shift_min / demand_per_shift # takt time, min/unit
total = sum(t for t, _ in tasks.values())
print(f"takt time {cycle:.2f} min, work content {total:.2f} min, theoretical min stations {math.ceil(total/cycle)}")
done, stations = set(), []
while len(done) < len(tasks):
load, st = 0.0, []
while True:
cand = [k for k, (t, pre) in tasks.items() if k not in done and all(p in done for p in pre) and load + t <= cycle + 1e-9]
if not cand: break
k = max(cand, key=lambda k: tasks[k][0])
st.append(k); done.add(k); load += tasks[k][0]
stations.append((st, load))
for i, (st, load) in enumerate(stations, 1):
print(f"station {i}: {'+'.join(st):7s} load {load:.2f} min, idle {cycle-load:.2f}")
eff = total / (len(stations) * cycle)
print(f"{len(stations)} stations, line efficiency {eff*100:.1f}%, balance delay {(1-eff)*100:.1f}%")
# takt time 1.00 min, work content 2.90 min, theoretical min stations 3
# station 1: A+C load 0.90 min, idle 0.10
# station 2: F+B+D load 1.00 min, idle 0.00
# station 3: E+G+H load 1.00 min, idle 0.00
# 3 stations, line efficiency 96.7%, balance delay 3.3%The heuristic reaches the theoretical minimum of 3 stations with 96.7% efficiency. At each step it picks the longest task whose predecessors are done and which still fits. Other heuristics (ranked positional weight, Kilbridge–Wester) or integer programming handle harder instances; real lines also consider zoning, tools and ergonomics.
Common mistakes
- Wrong: Balancing to average task times with high variability. — Right: Allow margin or buffers for variable tasks.
- Wrong: Ignoring precedence or zoning constraints. — Right: Include tool, space and quality constraints.
- Wrong: Functional layout for high-volume flow. — Right: Use product or cellular layouts.
Applications
- Automotive & appliances: Mixed-model assembly lines.
- Electronics: SMT and final assembly cells.
- Hospitals: Department adjacency to cut walking.
- Warehouses: Slotting fast movers near dispatch.
Key takeaways
- Match layout to volume and variety.
- Takt = available time / demand.
- Balance to N_min = ⌈Σt/C⌉ with high efficiency.
- Evaluate layouts by load × distance.
Going further
- SALBP integer programming: Exact line-balancing models.
- Heijunka sequencing: Levelled mixed-model schedules.
- Facility layout optimisation: Quadratic assignment and CRAFT heuristics.