32 lines
1.7 KiB
Markdown
32 lines
1.7 KiB
Markdown
# 006 – Inspiration-Algorithmus: gewichteter Mix (offene Gewichtung)
|
||
|
||
**Status:** proposed (Gewichtung offen, Algorithmus fix)
|
||
|
||
**Kontext.** „Inspiration" schlägt **jeweils 5** Gerichte aus dem Archiv vor,
|
||
neue 5 auf Button. Der Betreiber möchte einen **Mix aus drei Kriterien**:
|
||
lange nicht gekocht, seltene (wenige Auftritte) und beliebte (häufig gekocht).
|
||
Genauere Gewichtung und die Definition von „seltene" / „beliebte" werden bei
|
||
der Implementierung festgelegt.
|
||
|
||
**Entscheidung (Prinzip).** Score-Funktion `score(g)` mit drei Termen:
|
||
1. **Staleness**: `now - max(gegessen_am)` (normiert an die älteste
|
||
`gegessen_am`) → gewichtet mit `w_slow` (>0, primär, z. B. 0.5).
|
||
2. **Rarity**: `1 / (auftritt_count + 1)` (auftritt = Anzahl aller Einträge
|
||
mit gleichem `name`) → gewichtet mit `w_rare` (sekundär, z. B. 0.3).
|
||
3. **Popularity**: `auftritt_count / max(auftritt_count)` → gewichtet mit
|
||
`w_hot` (tertiär, z. B. 0.2).
|
||
|
||
`score = w_slow*stale + w_rare*rare + w_hot*hot`, Sortierung absteigend.
|
||
`w_slow + w_rare + w_hot = 1.0`; konkrete Werte in `config/inspirations.yaml`
|
||
und per ADR-006-Bis (Patch) fixieren, wenn die App läuft.
|
||
|
||
**Konsequenzen.**
|
||
- + Alle drei Nutzerintentionen (Alte, Seltene, Beliebte) sind vertreten.
|
||
- + Gewichte prozentual änderbar, ohne Code.
|
||
- − „Beliebte" ist kontraintuitiv, wenn der Nutzer genau das **nicht**
|
||
möchte (z. B. „mööchte etwas Neues"). Dann `w_hot=0`.
|
||
- Offene Fragen:
|
||
- [ ] Gewichte `w_slow/w_rare/w_hot` (Default: 0.5/0.3/0.2?)
|
||
- [ ] „Auftritt" zählt **Alle Zeit** oder **letzte N Tage**? (Vorschlag: alle Zeit)
|
||
- [ ] Deduping gegen die letzte 5er-Ladung? (Vorschlag: ja, Session-basiert)
|