• Aerospace

Planet Labs Quantum Optimization for Satellite Imaging Task Scheduling

Planet Labs

Planet Labs applied quantum annealing and QAOA to the satellite task scheduling problem across its 200+ Earth observation constellation, formulating imaging assignments as a QUBO to maximize high-priority target coverage while respecting per-satellite energy budgets and downlink windows.

Key Outcome
14% improvement in high-priority target coverage vs greedy baseline scheduler on 48-hour planning horizon across 20 satellites.

The Problem

Planet Labs operates one of the world’s largest Earth observation constellations: more than 200 Dove and SuperDove satellites in low Earth orbit. Every day, operators must decide which imaging tasks to assign to which satellites during their brief ground-track visibility windows.

The complexity is substantial. Each satellite has:

  • A short, predictable visibility window over each target (typically 1 to 4 minutes per orbit)
  • A fixed energy budget governed by battery charge and solar panel capacity
  • One or more downlink windows per day when captured imagery can be transmitted to ground stations
  • A ranked list of priority targets that may have competing time windows

A naive greedy heuristic assigns each task to the first available satellite with capacity. This works, but leaves systematic gaps: two satellites may each grab low-priority targets in a window where one could have captured a high-priority target the other could not reach. Optimal scheduling is NP-hard in the general case, closely related to the generalized assignment problem.

For a 48-hour planning horizon across 20 satellites and hundreds of candidate targets, the combinatorial space exceeds what branch-and-bound can solve to optimality in real-time planning cycles.

QUBO Formulation

Quantum annealing on D-Wave and QAOA both operate on Quadratic Unconstrained Binary Optimization (QUBO) problems. The satellite scheduling problem was mapped to QUBO form as follows.

Define a binary variable x[i][s][t] = 1 if imaging task i is assigned to satellite s during time window t, and 0 otherwise. The objective has two terms: maximize the sum of priority weights for completed tasks, and penalize energy budget violations.

The penalty for energy constraint violations was encoded quadratically. If satellite s has energy budget E_s and task i costs e_i energy units, the constraint sum_i(e_i * x[i][s][t]) <= E_s becomes a penalty term:

import dimod
from dwave.system import LeapHybridSampler

# Illustrative QUBO construction for satellite task scheduling
# Tasks: list of (task_id, priority, energy_cost, time_window)
# Satellites: list of (sat_id, energy_budget)

def build_satellite_qubo(tasks, satellites, visibility, lambda_energy=5.0, lambda_conflict=10.0):
    """
    Build QUBO for satellite task scheduling.
    
    Variables: x[(task_id, sat_id, window_id)] in {0, 1}
    Objective: maximize sum(priority * x) subject to energy and
               single-assignment constraints.
    """
    bqm = dimod.BinaryQuadraticModel(vartype='BINARY')
    
    # Reward terms: encourage high-priority assignments
    for task_id, priority, energy_cost, window_id in tasks:
        for sat_id, energy_budget in satellites:
            var = (task_id, sat_id, window_id)
            if visibility.get((task_id, sat_id, window_id), False):
                # Negative bias = reward for selecting this assignment
                bqm.add_variable(var, -priority)
    
    # Constraint 1: each task assigned at most once
    for task_id, priority, energy_cost, window_id in tasks:
        assigned_vars = [
            (task_id, sat_id, window_id)
            for sat_id, _ in satellites
            if visibility.get((task_id, sat_id, window_id), False)
        ]
        # Penalize any pair both selected for the same task
        for i, v1 in enumerate(assigned_vars):
            for v2 in assigned_vars[i+1:]:
                bqm.add_interaction(v1, v2, lambda_conflict)
    
    # Constraint 2: energy budget per satellite per planning period
    for sat_id, energy_budget in satellites:
        sat_vars = [
            ((tid, sat_id, wid), ecost)
            for tid, _, ecost, wid in tasks
            if visibility.get((tid, sat_id, wid), False)
        ]
        # Quadratic penalty for over-budget
        for i, (v1, c1) in enumerate(sat_vars):
            for v2, c2 in sat_vars[i+1:]:
                penalty = lambda_energy * c1 * c2 / (energy_budget ** 2)
                bqm.add_interaction(v1, v2, penalty)
    
    return bqm


# Submit to D-Wave hybrid solver
bqm = build_satellite_qubo(tasks, satellites, visibility)
sampler = LeapHybridSampler()
result = sampler.sample(bqm, time_limit=20)
best_sample = result.first.sample

The penalty weights (lambda_energy, lambda_conflict) were tuned empirically by sweeping across a set of held-out scheduling scenarios and checking constraint satisfaction rates.

Satellite Visibility Encoding

Visibility windows were precomputed using two-line element (TLE) propagation via the sgp4 library. For each (target, satellite, 10-minute time slot) triple, visibility was encoded as a Boolean flag. This reduced the variable space significantly: only feasible (task, satellite, window) triples became QUBO variables, cutting the problem size by roughly 85% compared to a fully dense formulation.

The visibility precomputation ran classically and took under a minute for a 48-hour horizon. The quantum annealing step then operated on the reduced QUBO, which for 20 satellites and 300 candidate targets produced approximately 1,200 to 1,800 active binary variables.

D-Wave Hybrid vs Greedy Baseline

The classical greedy baseline sorted tasks by priority and assigned each to the earliest available satellite with sufficient energy budget. This is a common operational approach: simple, fast, and deterministic.

The D-Wave Advantage hybrid solver (LeapHybridSampler) uses a combination of classical heuristics and quantum annealing on D-Wave’s Pegasus topology. For problems in this size range, the hybrid solver handles variable reduction, embedding, and result post-processing automatically.

Key comparison metrics across a set of 30 synthetic 48-hour planning scenarios:

MetricGreedyD-Wave Hybrid
High-priority target coverage61%75%
Energy constraint violations2.1%0.8%
Average solve time (20 satellites)0.3 s18 s
Tasks completed per horizon214231

The 14% improvement in high-priority coverage came primarily from cases where two satellites had overlapping visibility windows over a priority target cluster. Greedy assigned whichever satellite appeared first in the sorted list; the quantum solver correctly identified that holding one satellite in reserve for the priority cluster produced a net gain in weighted coverage.

QAOA Complement

For smaller subproblems (5 to 8 satellites, one planning pass), the team also explored QAOA using Qiskit’s optimization module. QAOA at p=2 depth matched the quality of classical simulated annealing for these reduced instances, but required error-mitigated execution on IBM simulators. At current hardware noise levels, QAOA did not outperform D-Wave hybrid on the full-scale problem.

The research team treated QAOA as a longer-horizon investment: as gate fidelities improve, a fully gate-based approach becomes more flexible for adding new constraint types (inter-satellite coordination, downlink bandwidth sharing) without reformulating the annealing hardware graph.

Operational Context

Planet Labs does not operate real-time quantum planning in production. This research established the QUBO formulation and benchmarked solver quality as a readiness assessment. The 18-second solve time for a 20-satellite horizon is compatible with planning cycles that run once per orbit (approximately 90 minutes), leaving ample margin.

The team identified the main near-term barrier as QUBO variable count scaling: a full 200-satellite constellation with 1,000 candidate targets produces variable counts that exceed current D-Wave hybrid practical limits without further problem decomposition.