Module 6 ended with a promise: the case study is yours to choose. Over six modules you watched Rutalia — our fictional last-mile logistics company — turn real problems into models, models into algorithms, and algorithms into measurable decisions. Now it is your turn to walk that same road with a problem of your own. This first lesson of the capstone project has a single goal: that you leave it with a written, validated, realistic specification of your project. It may sound like a small step, but this is the phase where most self-taught projects die: whoever starts coding without a specification usually ends up with one enormous script that answers no question at all. Here we will define what makes a capstone project good, browse a catalog of ideas, learn to write the specification with a concrete template, and apply that template in full to the Rutalia reference project that will accompany us through the whole module.

Contents

  1. What makes a capstone project good: integrative, measurable, bounded
  2. A catalog of project ideas
  3. The specification template
  4. The Rutalia reference project, fully specified
  5. Validating the specification before writing any code

What makes a capstone project good

A capstone project for this course is not "a program that works". It is a documented algorithmic experiment: you pose a problem, solve it by combining techniques from the course, and prove with numbers that your solution beats a simple alternative. Three properties define it:

Integrative

It must combine techniques from at least 2-3 different modules of the course. This is not academic whim: in module 6 you saw that real problems are never solved by a single algorithm. Rutalia's operational day (06-01) chained clustering, the Hungarian algorithm, nearest neighbor and 2-opt; the recommendation system (06-04) mixed collaborative filtering with classification metrics. A project that only implements Dijkstra is a one-lesson exercise, not a capstone project.

Measurable

There must be a numeric success metric and a baseline to compare it against. The baseline is the dumbest solution that solves the problem end to end: routes in random order, "always predict the mean", assignment in arrival order. Without a baseline you can claim nothing: is an 18% error good? It depends on whether the trivial solution scores 19% or 60%.

Bounded

Between 20 and 40 hours of work. Any less and there is no time to integrate several modules with serious measurement; any more and the self-taught student abandons it. The tool for bounding is the "out of scope" section of the specification: writing down explicitly what you will not do is as important as writing down what you will.

Property Control question Warning sign
Integrative How many course modules do I really use? "I only need one algorithm from module X"
Measurable Which number will I compare against which baseline? "You'll see that it works well"
Bounded Does it fit in 20-40 hours with what I already know? "First I have to learn Kubernetes"

A catalog of project ideas

You can follow the Rutalia reference project as is, adapt it to another domain, or pick a different idea. This catalog gives you eight proven starting points; all of them satisfy the three properties if they are bounded well. Difficulty is indicative (★ = doable in ~20 h, ★★★ = demands the full 40 h).

# Domain Problem Course algorithms involved Difficulty
1 Logistics Delivery planner with predicted travel times (the reference project) Regression (05-03), clustering (05-05), matching (03-06), TSP heuristics + 2-opt (06-01), complexity analysis (01-02) ★★
2 Social networks Community and influencer detector on a synthetic interaction graph BFS (03-02), PageRank and communities (06-02), Jaccard similarity (06-02), graph representation (03-01) ★★
3 Big data Log aggregation engine for data that does not fit in memory (top-K errors, deduplication) External merge sort, Bloom filter, top-K with a heap (06-03), advanced structures (01-04) ★★
4 ML Customer churn predictor on a synthetic dataset, with bias analysis Classification and metrics (05-02), cross-validation (05-01), your own neural network (05-04), ethics and drift (06-04) ★★
5 Games/puzzles Sliding-puzzle solver (8-puzzle/15-puzzle) with heuristic comparison A* and state spaces (04-03), backtracking and B&B (02-03), heaps (01-04), complexity (01-02)
6 Scheduling Timetable generator (shifts or classrooms) with hard and soft constraints Integer linear programming (02-01, 06-01), backtracking (02-03), genetic algorithms as an alternative (02-04) ★★★
7 Infrastructure Minimum-cost fiber network design with weak-point analysis MST (03-04), max flow/min cut (03-05), shortest paths (03-03) ★★
8 Optimization Serious metaheuristic shoot-out (genetic vs. ant colony vs. B&B) on knapsack or TSP instances All of module 2, rigorous measurement (01-01/01-02), binary search on the answer (04-01) ★★★

Tips for choosing:

  • Pick a domain you know or that draws you in. You are going to spend 20-40 hours with it; motivation is the self-taught learner's scarcest resource.
  • Don't choose by difficulty, choose by clarity of the metric. Project 5 (★) measured well is worth more than project 6 (★★★) half done.
  • Porting the reference project to your own domain is legitimate and recommended: the same "predict → cluster → assign → order → compare" scheme works for deliveries, maintenance technicians, sales visits or waste collection.

The specification template

The specification is a one- or two-page document you write before the first line of code. Copy it verbatim and fill in every field:

# Project specification: <name>

## 1. Goal
One sentence: what problem I am solving and for whom (fictional).

## 2. Input data
- What data I need (entities, fields, approximate volume).
- How I get it: SYNTHETICALLY GENERATED (preferred) or a public
  dataset with a clear license. NEVER real personal data: not from
  customers, not from colleagues, not scraped. If the domain calls
  for names or addresses, invent generic values (customer_0042,
  zone_C).
- Fixed random seed so the generation is reproducible.

## 3. Planned algorithms
| Phase | Technique | Course lesson |
|---|---|---|
| ... | ... | ... |

## 4. Success metric
The number (or the 2-3 numbers) that will decide whether the project
works, and on which instances it is computed.

## 5. Baseline
The end-to-end trivial solution I compare against.

## 6. Out of scope
Explicit list of what this project does NOT include.

## 7. Milestone plan
| Milestone | Verifiable deliverable | Estimated hours |
|---|---|---|
| M0 | ... | ... |

Two notes on the fields people neglect the most:

  • Data (field 2). The default option in this course is to generate it synthetically, as we did with the 2000-delivery dataset in module 5: you control the volume, the distribution and the seed, and there is zero ethical or legal risk. If you use public data, check the license and that it is anonymized at the source. Using real data about people — even "just for testing" — is out of scope for this project, no exceptions.
  • Milestones (field 7). Every milestone must produce something runnable or measurable, not "make progress on X". "M2: the regression model predicts times with test MAE < 4 min" is a milestone; "M2: work on the model" is not.

The reference project: a delivery planner with predicted travel times

We now apply the template, complete and with no blanks, to the project we will build in 07-02 and evaluate in 07-03. Note the level of concreteness: this is the standard your specification must reach.

# Project specification: Delivery planner with predicted travel
# times for Rutalia

## 1. Goal
Plan Rutalia's delivery day (assign orders to couriers and order
their routes) using travel times PREDICTED from historical data
instead of fixed distances, and demonstrate how much it improves
over a naive plan.

## 2. Input data
- Synthetic history of 3000 trips: origin, destination (coordinates
  on a 10x10 km grid), hour of day, weekday, actual travel time in
  minutes. Time is generated as distance/speed + rush-hour penalty
  + Gaussian noise.
- Day instances: 80 orders with coordinates and 5 couriers,
  generated on the same grid.
- Everything synthetic, generated by our own numpy script,
  seed = 42. No personal data: orders are order_001..080.

## 3. Planned algorithms
| Phase | Technique | Course lesson |
|---|---|---|
| Estimate per-leg time | Linear regression with gradient descent | 05-03 |
| Time matrix | Apply the model to all pairs | 05-03 |
| Group orders by zone | k-means (k = number of couriers) | 05-05 |
| Assign groups to couriers | Hungarian algorithm | 03-06 |
| Order each route | Nearest neighbor + 2-opt improvement | 06-01 |
| Predict and verify cost | Asymptotic analysis + measurement | 01-01, 01-02 |

## 4. Success metric
- Total route time (sum over the 5 couriers, in minutes) on
  10 day instances with 5 different seeds.
- Time model MAE on a 20% test split (target < 4 min).
- Overall success: cut total time >= 30% versus the baseline.

## 5. Baseline
Assignment in arrival order (orders handed out in blocks of 16
consecutive ones per courier) and route in the original order, with
times estimated as Euclidean distance / fixed average speed.

## 6. Out of scope
- Delivery time windows and vehicle capacities (full VRP).
- Real-time traffic; the model is static per hour of day.
- Graphical interface and real maps; everything is synthetic
  coordinates.
- OR-Tools or other external solvers: implemented with what the
  course covered (cited as future work).

## 7. Milestone plan
| Milestone | Verifiable deliverable | Estimated hours |
|---|---|---|
| M0 | Data generator + baseline runnable end to end | 4 |
| M1 | Travel-time regression trained, test MAE reported | 6 |
| M2 | Clustering + Hungarian assignment integrated in the pipeline | 6 |
| M3 | Nearest neighbor + 2-opt, full comparison against baseline | 6 |
| M4 | Experiments with 5 seeds, results tables, report | 6 |
| Total | | 28 |

Validating the specification

Before signing off on the specification, put it through this feasibility checklist. Every "no" is a mandatory revision, not a detail:

  • [ ] Does a trivial baseline exist? You must be able to write it in less than an afternoon. If even the dumb solution is hard, the problem is badly bounded.
  • [ ] Can the metric be computed by a script? If measuring success requires human judgment ("the routes look reasonable"), it is not a metric.
  • [ ] Can the data be generated or obtained in under 1 hour? A 50-line numpy synthetic generator qualifies; "I'll find a dataset online" does not qualify until the dataset is downloaded and loaded.
  • [ ] Does every planned algorithm have its lesson in the table? If a technique appears that the course has not covered, either replace it or justify it as a small extension.
  • [ ] Do the milestone hours add up to between 20 and 40? And no milestone exceeds 8 hours: if one does, split it.
  • [ ] Does the "out of scope" section have at least 3 entries? If you cannot think of any, you have not yet thought about everything the project could swallow.

A useful technique: write the final table of your report before you start (columns: variant, total time, improvement %, compute time). If you know exactly which table you want to be able to fill in at the end, every intermediate decision becomes easier.

Common Mistakes and Tips

  • Mistake: the platform project. "I'll build a website with login where orders get uploaded and…" — that is a web development project, not an algorithms project. Anything that is not generating data, running algorithms and measuring results goes into "out of scope".
  • Mistake: the retroactive metric. Deciding how to measure after implementing invites self-deception: you will end up choosing the metric your solution looks good on. Metric and baseline are fixed here, in writing.
  • Mistake: real data "because it's more authentic". Beyond the ethical and legal problem (remember 06-04: bias, privacy, the EU AI Act), real data brings endless cleaning that eats your hour budget. Synthetic data lets you control the difficulty.
  • Mistake: silent scope creep. The symptom is the phrase "while I'm at it, I'll add…". The antidote is rereading section 6 of your specification every time you say it.
  • Tip: keep the specification short and frozen. One to two pages. Once it passes the checklist, treat it as a contract with yourself: changes get written down and justified, never improvised.
  • Tip: if you are torn between two ideas, specify both. It's 30 minutes per template, and the checklist almost always decides on its own which one is feasible.

Exercises

The exercises in this module are the milestones of your own project: they do not have a single solution, but self-assessment criteria.

Exercise 1: choose and justify

Choose your project (from the catalog, adapted, or your own) and write one paragraph justifying that it is integrative (which 2-3 modules does it combine and how do their outputs chain together?), measurable (which number, against which baseline?) and bounded (what do you leave out?).

Exercise 2: write the full specification

Fill in the 7-section template for your project, with the level of detail of the Rutalia example: an algorithms table with lessons, a metric with instances and a numeric target, and a milestone plan with hours.

Exercise 3: validate and fix

Run the feasibility checklist over your specification. For every point that fails, change the specification (not the checklist) and write down what you changed.

Solutions

Exercise 1 — self-assessment criteria. Your paragraph is solid if: (a) it names concrete lessons, not vague modules ("I use k-means from 05-05", not "I use ML"); (b) it explains the chaining — the output of one technique is the input of the next, like time matrix → clustering → assignment in Rutalia; (c) the metric fits in one sentence with a numeric target. Failure sign: if on rereading you would not know where to start coding, it is too vague.

Exercise 2 — reference solution. Compare your document with Rutalia's section by section and ask yourself: is my section just as concrete? In particular: the data section must include volume, fields and seed; the algorithms table must have one row per pipeline phase; every milestone must be verifiable by a third party who only reads the deliverable. If your full specification runs under half a page, it lacks concreteness; if it exceeds two pages, there is platform in it.

Exercise 3 — self-assessment criteria. The expected outcome is that something changed: in practice, no first specification passes the checklist clean. The most common adjustments (and a good sign that you are really validating) are: trimming the data scope, replacing an uncovered algorithm with one from the course, and splitting a 12-hour milestone in two. If your checklist came out perfect on the first try, re-examine the trivial-baseline point more harshly: that is where optimism sneaks in the most.

Conclusion

You now have the hardest part: a chosen project and a validated specification that fits on one page and in 20-40 hours. We have seen that a good capstone project is integrative (2-3 chained modules), measurable (metric + baseline fixed up front) and bounded (with an explicit "out of scope"), and we have left the Rutalia reference project — the delivery planner with predicted travel times — fully specified as a yardstick. In the next lesson (07-02) it is time to turn paper into code: we will set up the project structure, build first the baseline that works end to end, and add the algorithmic layers one by one, measuring at every milestone. The specification you just wrote will be the map; keep it in sight.

© Copyright 2026. All rights reserved