Manual
Nyttobaserat resesök
Det här är den interaktiva versionen av dokumentet "Nyttobaserat resesök i OTP4DRT – instruktion" (2026-07-04), som i sin tur bygger på "Konceptet Nyttobaserat Resesök" och två omgångar cross-model peer-review. Varje ?-prick i reseplaneraren länkar hit; varje experiment här länkar tillbaka in i planeraren med rätt förinställningar.
Konceptet: rutt ≠ pris ≠ rang
Planeraren är byggd som flygsök är byggt – i separata steg ovanpå en oförändrad routingmotor. Varje sökresultat prissätts på två axlar (resenärens upplevda kostnad 👤 och huvudmannens produktionskostnad 🏭) och rangordnas efter en sammanvägd nytta.
- 1 Kandidatgenerering. OpenTripPlanner + DRT-leginjektion. Behörighets- och zonfilter körs FÖRE rangordning, som hårda villkor.
- 2 Prissättning. Varje kandidatresa bryts ner viktoberoende: åkminuter per färdsätt, gångminuter, väntminuter, DRT-minuter, antal byten. Nedbrytningen följer med i API-svaret.
- 3 Rangordning. En skalär "bäst"-poäng = R × viktade resenärsminuter + produktionskostnad + byteskostnad. Allt linjärt i vikterna.
- 4 Presentation. Skalära vinnaren pekas ut men hela fronten visas: flikar, båda kostnadsaxlarna på varje kort, Pareto-graf. Inget alternativ döljs av poängen.
Att nedbrytningen är viktoberoende och kostnaden linjär i vikterna är det som gör labbet möjligt: webbläsaren räknar om exakt samma matematik som servern när du drar i ett reglage – ingen ny sökning behövs. Tidsvärdet R är därmed en explicit, granskbar policyparameter, inte en konstant begravd i en motor.
Flikar, kostnadschips och vinnarmärken
Ovanför resultatlistan finns tre flikar – flygsökets presentation:
- ⚖️ Bäst – lägst sammanvägd nytta med de vikter som just nu är inställda i labbet.
- ⚡ Snabbast – kortast total restid.
- 💰 Billigast – lägst produktionskostnad.
Varje resekort visar två kostnadschips – 👤 resenärskostnad och 🏭 produktionskostnad – plus märken för vad kortet vinner. Att byta flik ändrar bara ordningen; inga resor tillkommer eller försvinner.
Om urvalet: servern rangordnar hela kandidatmängden med de vikter som gällde vid sökningen och skickar de ~20 bästa – flikarna och labbet arbetar inom det urvalet. "Sök om med dessa vikter" låter servern göra om urvalet med labbets aktuella vikter. För Närtrafik räknas restiden från bokningsfönstrets start, så väntetiden hemma ingår i "Snabbast".
De tre formlerna
- Nyttobaserad (tidsslagsviktad) – forskningsförankrade vikter per tidsslag: gångminuter räknas ~1,45×, väntminuter ~1,5×, varje byte kostar ett straff i ekvivalenta minuter. Standardvalet.
- NKK (platt kundtid) – formeln som publicerad i boken: all kundtid väger lika (RK = R·t), inga tidsslagsvikter. Finns med just för att kunna jämföras mot den viktade på riktiga resor.
- Dagens – den gamla heuristiken (restid × DRT-andel), kvar som referens för hur planeraren rangordnade före nyttomodellen.
Formelbytet räknar om listan direkt – kandidaterna är desamma, bara poängen ändras.
Resenärsaxeln 👤
Resenärens upplevda kostnad = R × tidsslagsviktade minuter. Reglagen:
- Tidsvärde R (kr/min)
- Avvägningsratten mellan resenärstid och produktionskostnad. Bokens publicerade värde är R=1; forskningspresetens värde ligger i samma härad men verkar genom viktade minuter. Dra uppåt för att ge resenärstermen mer tyngd.
- 🚶 Gångvikt (×)
- Hur mycket längre en gångminut känns än en åkminut. Litteraturvärde ~1,45× (Wardman 2016). Gäller bara den nyttobaserade formeln – NKK låser den till 1×.
- ⏳ Väntevikt (×)
- Motsvarande för väntminuter, ~1,5× (ASEK 8.0). Slår på vänte- och bokningsfönstertid.
- 🔁 Bytesstraff (min)
- Obehaget av själva bytet, utöver bytesväntetiden – uttryckt i ekvivalenta minuter (~10 min är litteraturens standardvärde).
Produktionsaxeln 🏭
Huvudmannens kostnad för att producera resan: minuttaxa per färdsätt plus fast byteskostnad. Bokens taxor: PT 2 kr/min, DRT 8 kr/min, byte 15 kr.
Värt att veta: med de publicerade taxorna dominerar den här axeln rangordningen. För renodlade DRT-minuter väger resenärstermen så lite som ~11 % (delad taxa, 1/(1+8)) ner till ~5 % (solotaxa, 1/(1+18)); på blandresor med lång linjetrafikdel blir andelen högre. Se experiment 1 nedan.
Dispatch-scenariot (marginalkostnad)
Kryssrutan "marginalkostnad" byter DRT-prissättning från statisk kr/min till en fast kostnad per DRT-insats – en demonstration av sömmen där ett dispatch-system (DARP) ska koppla in sin verkliga marginalkostnad: vad kostar det att infoga just den här resan i flottan just nu? Den varierar 5–20× över dygnet. Statisk taxa är rätt först när dispatch-data saknas, vilket är fallet i stora delar av Närtrafiken i dag.
Pareto-grafen 📈
Varje punkt är en resa: x-axeln är produktionskostnad, y-axeln resenärskostnad – närmare origo är bättre. Blå punkter är icke-dominerade (ingen annan resa är bättre på båda axlarna – Pareto-fronten, streckad linje), grön är vinnaren med aktuella vikter och grå är dominerade. Siffran i punkten är listpositionen. Klicka på en punkt för att markera resan i listan.
Förinställningarna
- NKK som publicerad – bokens taxor (R=1, PT 2 kr/min, DRT 8 kr/min, byte 15 kr) och platt kundtid. Utgångspunkten för all jämförelse.
- Forskningsvikter – tidsslagsviktade minuter med litteraturens värden (Wardman; ASEK 8.0).
- Resenärsfokus – R höjt till 10 kr/min så att resenärstermen dominerar; bra för att se den andra extremen.
Tre experiment värda att göra 🧪
Varje kort öppnar reseplaneraren med en färdig sökning, labbet öppet och rätt formel förinställd – det enda du behöver göra är att dra i reglaget som experimentet handlar om.
1 · Produktionsdominansen
Med de publicerade taxorna (förinställningen "NKK som publicerad") avgörs ordningen i praktiken av produktionskostnaden – för DRT-minuterna väger resenärstermen så lite som ~5–11 %. Dra tidsvärdet R uppåt och se var rangordningen flippar. Det är analysens centrala fynd, förnimbart med reglage i stället för i en rapport.
Öppna med NKK-formeln →2 · Tidsslagsviktningen
Växla NKK ↔ Nyttobaserad på en sökning med gång- eller väntetunga alternativ. NKK ser dem som likvärdiga med en "len" resa på samma klocktid – den viktade gör det inte. Formelväljaren sitter överst i labbet.
Öppna med nyttobaserad formel →3 · Dispatch-sömmen
Marginalkostnaden är förifylld på 30 kr per DRT-insats. Dra den mot noll (ledig flotta, bil i närheten) och se DRT-alternativen klättra i listan. Det visar varför en statisk kr/min för DRT blir fel så fort dispatch-data finns.
Öppna med marginalkostnad på →Affärsregelpanelen ⚙️
Kugghjulet i sökpanelen öppnar affärsreglerna för DRT-tjänsterna: max omvägskvot, bytesmarginal, hastighetsfaktor, antal kandidathållplatser med mera – per tjänst, ovanpå serverns standardvärden.
Viktig skillnad mot labbet: reglerna styr kandidatgenereringen på servern och kräver en ny sökning för att slå igenom. Labbets vikter styr rangordningen av redan hämtade kandidater och slår igenom direkt. Regler = vilka resor som finns; vikter = i vilken ordning de visas.
Vad som avviker från NKK som publicerad
Konceptet och flygsöksmetaforen är behållna rakt av. Det som ändrats – med motivering ur peer-reviewen:
| # | Bokens formulering | Implementationen | Varför |
|---|---|---|---|
| 1 | All kundtid prissätts platt: RK = R·t oavsett om resenären sitter, går eller väntar | Tidsslagsviktade minuter: gång 1,45×, väntan 1,5×, bytesstraff ~10 ekvivalenta minuter. Den platta varianten finns kvar som formelval "NKK" | 50+ års tidsvärdesforskning (Wardman 2016; ASEK 8.0): platt viktning underskattar ansträngande resor med 20–40 % |
| 2 | En hopslagen skalär (NKK) är svaret | Två separata axlar (resenärskostnad, produktionskostnad) + skalären som default-pekare. Pareto-fronten visas alltid | Skalären blandar två aktörers kostnader; separata axlar gör avvägningen synlig och överprövbar |
| 3 | KTK = statisk kr/min per transportslag, även för DRT (8/18 kr/min) | Statisk taxa är dokumenterad fallback; en marginalkostnads-söm (dispatch) är inbyggd och demonstrerbar i labbet | DRT-kostnaden är marginalkostnaden att infoga resenären i flottan – den varierar 5–20× över dygnet |
| 4 | R differentieras per resenärstyp | R är en öppen ratt, lika för alla. Profilanpassning via tidsslagsvikterna, inte grundvärdet av tid | Lägre R för en grupp gör gruppens tid "billigare" → systematiskt sämre resor för dem som behöver DRT mest. Regressivt; ASEK avråder |
| 5 | B(h): bytestillägg per hjälpmedelstyp | Inte implementerad. Ersätts på sikt av neutrala logistiska parametrar (boarding-tid, ramp-krav) | Hälsodata direkt i en routingformel är GDPR art 9-mark; logistiska parametrar ger samma effekt utan känsliga data |
| 6 | STDK ingår men definieras inte matematiskt | Inte implementerad ännu. Föreslagen operationalisering: asymmetrisk schedule-delay (Small 1982) | En odefinierad term kan inte implementeras; förslaget väntar på konceptägarens bekräftelse |
| 7 | b·(m−1)·(1+ΣB(h)) – oklart om per resenär/fordon/total | Byten kostar på båda axlarna: fast byteskostnad (kr) på produktionsaxeln, bytesstraff (ekvivalenta minuter) på resenärsaxeln. Per resenär och resa | Enda tolkningen som är konsistent med bokens exempel |
| 8 | Boken lutar åt "villkor som aktiva parametrar" (vikter) | Behörighet, zoner och kvalitetsgolv är hårda filter före rangordningen – de kan aldrig viktas bort | En vikt kan underskrida en rättighetsnivå; ett villkor kan inte. Neutraliserar gatekeeper-risken boken själv flaggar |
Öppna frågor till konceptägaren
- Är produktionsdominansen avsiktlig? Med bokens taxor är NKK i praktiken en produktionskostnadsmodell med resenärstermen som tiebreaker. Om det är avsikten bör den kommuniceras som kostnadsmodell-med-kvalitetsgolv; om inte visar R-ratten vilken kvot som krävs för att resenärstermen ska bita.
- Vem äger R-ratten? Huvudmannen, resenären eller uttalad policy? Nu är den en öppen parameter; någon måste äga den innan skarp drift.
- STDK – bekräfta eller korrigera den föreslagna operationaliseringen (asymmetrisk schedule-delay, Small 1982), så implementeras den.