✦ novel stages not found in standard MCDA tools
Click anywhere on the map to set your centre of interest; drag the radius slider to adjust the search area. The reach curve (top right) plots cumulative offer count vs. distance — its slope tells you where supply accumulates quickly, helping you pick a radius that is neither too tight (few options) nor too loose (distant, irrelevant offers diluting the set).
The histogram below shows how offers are distributed by distance band. Distance is handled in two complementary ways: the radius is a hard cut-off that keeps the candidate pool manageable, while distance can optionally become a soft preference criterion in Stage 2.
Click any column chip to activate it as a criterion; click its min/max badge to set whether lower or higher values are better (cost vs. benefit). The prototype shows the first six candidates across the selected criteria as inline sparkbars so you can immediately sense the trade-off landscape.
A correlation warning flags strongly correlated pairs (e.g. base rent and total rent, ρ = 0.81). Two near-identical criteria act like a single criterion counted twice, biasing dominance and the later NMF grouping. Dropping one of each correlated pair keeps the trade-off space informative. Here, five criteria were retained: Base rent, Service charge, Living space, Distance, and Price/m².
Each criterion is rescaled onto a common 0–1 "goodness" axis via a draggable, piecewise-linear curve drawn over the criterion's value histogram. The shape encodes preference: a steep segment means small differences matter a lot there; a flat segment signals near-indifference over that range.
Costs (rent, service charge, price/m², distance) get downward-sloping curves — lower is better. The living-space benefit gets an upward-sloping curve. Non-monotonic "hump" curves are also supported for criteria with an ideal mid-range. Because dominance and robustness are computed on these utilities, the curves are where your subjective priorities enter the analysis.
This is the methodological heart of SoftSky, marked NOVEL in the interface. A tolerance ε per criterion sets how large a utility gap must be before it counts as a genuine advantage rather than measurement noise. At ε = 0% you get the classical hard Pareto skyline; raising ε admits more near-optimal options, growing the frontier band.
Two parallel-coordinate plots (raw values left, utilities right) show all candidates in grey and SoftSky frontier members in violet. The green ε-band in each scatterplot cell marks the region just inside the 2-D skyline for that criterion pair — an option inside the band on any one pair is guaranteed to be on the global SoftSky frontier (a sufficient condition).
The frontier-size vs. ε curve at the bottom shows how many options are admitted as ε is scaled from 0× (strict skyline) to 3×. A gentle rise means the strict skyline is well-separated; a steep rise signals many near-ties — useful for choosing ε. The scatterplot matrix (second screenshot) lets you verify the ε-band reasoning pairwise across all criteria in both raw-value and utility spaces.
The explanation panel (third screenshot) details why tolerances are expressed as percentages of the utility range (so 5% means the same thing on rent, space, and distance alike), and how to read the violet frontier points and the green ε-band.
With 4,609 options on the tolerant frontier, the analyst still faces an overwhelming choice. Stage 5 groups them into constellations — qualitatively different kinds of good option. Each criterion's utility is binned into equal-frequency levels (e.g. very_bad / bad / good / very_good); every option becomes a short "document" of criterion=level tokens; Non-negative Matrix Factorisation (NMF) over this term-document matrix finds k = 7 recurring level patterns (topics), and each option is assigned to its strongest topic. The number of topics k and the number of levels can be adjusted.
This is genuine topic modelling: the constellation name comes from the top-weighted terms (e.g. Base rent €=very_bad · Living space m²=very_good · Service chg €=very_bad), and names are editable. Membership is the model's own argmax assignment — no separate decision-tree rule approximates it, so a constellation's definition and its members never diverge.
The overview screenshot shows the results: a spatial map (left, no background layer — dots are positioned by the offers' geocoordinates) coloured by constellation, and two parallel-coordinate profiles (centre and right) showing each constellation's mean criterion values and utilities, making trade-offs across kinds immediately legible.
Two further views inspect the structure of the constellation space:
The constellation cards (right two columns below) list the NMF term weights for each topic: the wider the bar, the more that criterion=level combination defines the constellation. A Show button on each card reveals the members in all linked views.
Clicking Show on a constellation highlights only its members across all views. The example here is the red constellation Price/m²=very_good · Distance km=very_bad · Living space m²=good · Service chg €=bad · Base rent €=good — spacious, good value per m², but farther out.
The spatial map and parallel coordinates (first screenshot) display the spatial distribution of the selected options alongside their profile in raw values and utilities. The profile shape — low rents, high price/m² utility, far distance — is immediately visible.
The criterion-space scatterplot matrix (second screenshot) confirms that the selected constellation (red) clusters tightly in the upper-right corners of the utility pairs that define it, while the full frontier set (grey) spreads across both Pareto-dominated and non-dominated regions. The teal skyline lines mark the 2-D strict skyline on each criterion pair.
The PC-SPLOM (third screenshot) positions the selected constellation (red) against the full frontier (grey) across PC1–PC5 pairs. The red cluster is well-separated from the rest, confirming that this constellation occupies a coherent and distinct region of utility space.
The criterion-space scatterplot matrix with skyline lines (fourth screenshot) provides the most direct geometric view: each cell shows one criterion pair; the teal lines trace the 2-D strict skyline; the selected constellation (red) hugs the frontier in the pairs that matter for its defining attributes, while looking dominated in the pairs it trades away.
Hovering any point opens a tooltip with all criterion values, utilities, ε-status per criterion, and SoftSky membership status.
Stage 6 computes the global tolerant frontier and displays it spatially. The left map shows every frontier contender coloured by constellation — the spatial signature of each kind of good option across Leipzig. The right map zooms into the selected constellation, with options coloured by their robustness margin ρ: violet/teal are deep inside or on the strict skyline, soft green were admitted only by the tolerance.
The status bar reports: 747 options on the strict skyline; 3,862 admitted by tolerance; 8,225 dominated. Options are distinguished by colour as robust, frontier, possible (with missing values), near-dominated, or dominated — giving the analyst a fine-grained view of how firmly each option sits on the frontier.
The paired parallel-coordinate plots (raw values top, utilities bottom; top = best) in the second screenshot show the trade-off shapes of the selected constellation's options, with robustness ρ as the rightmost axis. Brushing any axis filters the visible options and cross-highlights them on both maps.
Three feedback buttons at the bottom — adjust S_tol, adjust S_util, adjust S_ctx — send the analyst back to Stages 4, 3, or 2 with current results in context, closing the refinement loops that ATWL prescribes.
The final stage presents one constellation at a time, with its options ranked by either robustness (the signed margin ρ) or overall weighted utility. Criterion-weight sliders let the analyst fine-tune relative importance without rerunning anything. The map shows only the shortlisted options; hovering a table row cross-highlights the map point and vice versa.
In the first screenshot the list is sorted by robustness. Rank 1 has ρ = 2.27, meaning it sits well inside the strict skyline — no competitor beats it even at twice the tolerance on its best criterion. The constellation belongs to Price/m²=very_good · Distance km=very_bad · Living space m²=good · Service chg €=bad · Base rent €=good (586 options).
In the second screenshot the weights are adjusted (living space × 2.5, price/m² × 1.5) and the list is re-sorted by overall utility. The ranking shifts: the new top candidate (PLZ 04109, rank 1, ρ = 2.16) combines a very low distance (0.3 km), good living space, and good price efficiency — matching the reweighted preferences.
The third screenshot shows the detail tooltip opened on rank 1. It displays all criterion values (Base rent €395, Service €120, Living space 79 m², Distance 0.3 km, Price/m² €5.0) with their per-criterion utility percentiles, the overall utility score U, the robustness margin ρ = 2.16, and the constellation label. Non-criterion attributes (rooms, floor, amenities, year built) are shown below for completeness. The analyst can now shortlist real apartments to visit — the choice is made within a coherent kind rather than by comparing fundamentally different trade-off profiles.
The prototype loads a pre-geocoded CSV of Leipzig apartment rental offers (~12,800 rows after cleaning). You can supply your own city's data or use the built-in Leipzig dataset. The overview map shows every offer as a small grid cell, grouped by postcode area (PLZ), giving an immediate impression of where offers concentrate across the city.
The cleaning pipeline is shown on the right: geo-locatable rows, a plausibility filter (rent 50–10k, space 10–400 m², rooms 1–10), duplicate detection, and missing-value rates per column. This transparency lets you judge data quality before committing to any analysis.