# MOSOF — Multi-Objective Sensor Optimisation Framework

A clean reference implementation of the Multi-Objective Sensor Optimisation
Framework (MOSOF), matching the notation and three-objective formulation
of Suslu et al. (2026), *Sensors* 26(1), 160.

This repository is **a pedagogical re-implementation for portfolio and
teaching purposes** — not the production research code. The mathematical
formulation, sensor-family parameters, and validation strategy are drawn
from the published papers; the implementation is a fresh write-up against
pymoo's NSGA-II driver, so the code reads cleanly and runs in seconds.

## What MOSOF does

MOSOF selects a subset of candidate sensors from a larger pool to optimise
three competing objectives simultaneously:

| Objective              | Direction | Notes                                            |
|------------------------|-----------|--------------------------------------------------|
| Diagnostic performance | maximise  | NDCI-weighted coverage of the fault dictionary   |
| Suite cost             | minimise  | Σ unit cost over selected sensors                |
| Suite reliability      | maximise  | Series-equivalent MTBF: 1 / Σ (1 / MTBF\_i)      |

The output is a **Pareto front** — the set of suites where you can't
improve one objective without worsening another. Decision-makers then pick
a **knee** point: the suite where the marginal cost of an additional
sensor stops being worth the diagnostic gain.

## Run the demo

```bash
pip install -r requirements.txt
python mosof_demo.py
```

The demo:

1. Generates a synthetic 30-sensor candidate pool covering four aircraft
   subsystems (Engine, Fuel, EPS, ECS), parameterised after Section 4.3 of
   the thesis (MTBF medians, cost ranges, diagnostic coverage).
2. Runs NSGA-II for 200 generations with population 100.
3. Extracts the non-dominated Pareto front in (performance, cost, MTBF)
   space.
4. Selects a knee solution using the maximum perpendicular-distance
   heuristic against the line between front extremes.
5. Prints suite composition and writes `pareto_front.csv`.

Expected runtime: ~5 seconds on a laptop. No GPU needed.

## File layout

```
.
├── README.md           # this file
├── requirements.txt    # numpy, pymoo
└── mosof_demo.py       # the demo entry point (one file, ~180 lines)
```

## Citation

If you build on this code, please cite the underlying papers:

```bibtex
@article{Suslu2026MOSOF,
  author  = {Suslu, Burak and Ali, Fakhre and Jennions, Ian K.},
  title   = {MOSOF with NDCI: A Cross-Subsystem Evaluation of an Aircraft for an Airline Case Scenario},
  journal = {Sensors},
  volume  = {26},
  number  = {1},
  pages   = {160},
  year    = {2026},
  doi     = {10.3390/s26010160}
}

@article{Suslu2025NDCI,
  author  = {Suslu, Burak and Ali, Fakhre and Jennions, Ian K.},
  title   = {NDCI Integration to Multi-Objective Sensor Optimisation Framework — An ECS Case},
  journal = {Sensors},
  volume  = {25},
  number  = {9},
  pages   = {2661},
  year    = {2025},
  doi     = {10.3390/s25092661}
}
```

## License

MIT.
