intermediate
fahrer-score
scoring
formel

Bewertungsformel

Wie pro-Fahrt- und rollierende Fahrer-Scores berechnet werden - Eingaben, Gewichte und das EWMA-Modell.

Levy Fleets TeamMay 18, 202610 min read

Bewertungsformel

Die Scoring-Pipeline lebt in src/lib/rider-score/. Der reine Kernel ist scoreFromSignals() in compute-trip-score.ts und ist unit-getestet. Der rollierende Score lebt in update-rolling-score.ts.

Score pro Fahrt

Jede abgeschlossene Fahrt erhalt einen Score von 0 bis 100, an beiden Enden abgeschnitten, in ride_safety_signals geschrieben mit einem weights_snapshot, damit historische Scores reproduzierbar bleiben.

Standardformel

score = clamp(
    20 * speed_compliance_pct
  + 15 * parking_compliance
  + 15 * (1 - geofence_violation_decay)
  + 10 * (1 - hard_brake_rate)
  + 10 * (1 - throttle_aggression_rate)
  + 10 * clean_end_bool
  + 10 * helmet_verified_bool
  + 10 * (1 - sidewalk_event_rate)    // Gewicht 0 bis CV ausgeliefert
  -  5 * open_violation_count
  -  2 * open_intervention_count,
  0, 100
)

Eingaben

SignalQuelleWas es misst
Geschwindigkeits-Complianceride_locations.speed vs. Zonenlimit% der GPS-Stichproben bei oder unter dem Zonenlimit
Park-Complianceride_zone_events Ende-EreignisBinar: endete die Fahrt in einer zugelassenen Parkzone?
Geofence-Verstosseride_zone_events mitten in der FahrtAnzahl, mit Rezenz abklingend
Hartes BremsenGPS-Verzogerungs-DeltasAnzahl der Verzogerungsereignisse uber Schwelle
Drossel-Aggressionride_locations.throttle_position% der Fahrt uber 85% Drossel
Sauberes Enderides.end_methodWahr wenn sauber beendet
Helm verifiziertrider_helmet_selfies.passed_atWahr wenn nicht-abgelaufenes Selfie vorliegt
Burgersteig-EreignisseCV-Pipeline (Projekt 4)Anzahl, Gewicht 0 bis CV ausgeliefert
Offene Verstosseviolations.ride_idJeder offene Verstoss entfernt 5 Punkte
Offene Interventionenrider_interventionsJede offene Intervention entfernt 2 Punkte

Anfanger-Regel

Bei Fahrten 1-3 ist der Fahrer in der Anfanger-Stufe. Der Score wird aufgezeichnet, treibt aber keine Interventionen und tragt noch nicht zum rollierenden Score bei.

Kurz-Fahrten-Ausschluss

Fahrten kurzer als 60 Sekunden oder 200 Meter werden vom rollierenden Score ausgeschlossen.

Normalisierung nach Fahrtlange

Pro-Fahrt-Scoring ist ratenbasiert. Eine lange Fahrt wird nicht bestraft, weil sie lang ist.

Rollierender Fahrer-Score

Der rollierende Score ist ein exponentiell gewichteter gleitender Durchschnitt der pro-Fahrt-Scores uber die letzten 90 Tage.

rolling_score = clamp(
  sum(trip_score_i * weight_i) / sum(weight_i),
  0, 100
)
wobei weight_i = exp(-ln(2) * age_days_i / halflife_days)
  • Fenster: 90 Tage, konfigurierbar.
  • Halbwertszeit: 30 Tage, konfigurierbar.
  • Kaltstart: weniger als 3 bewertete Fahrten = Anfanger-Stufe.

Gespeichert in rider_scores.rolling_score.

Stufen-Zuweisung

Standard-StufeRollierender Score
Platin90+
Gold80 bis 89
Silber70 bis 79
Bronze50 bis 69
Risikofahrerunter 50
Anfangerweniger als 3 bewertete Fahrten

Stufen-Ubergange losen Pramien-Vergaben und Interventionsleiter-Neubewertungen aus.

Reproduzierbarkeit

Jede pro-Fahrt-Score-Zeile tragt einen weights_snapshot JSON-Blob mit den genauen Gewichten, Schwellenwerten und Signalen.

Was wo lauft

CodeZweck
src/lib/rider-score/compute-trip-score.tsZieht Signale, berechnet Score pro Fahrt
src/lib/rider-score/update-rolling-score.tsEWMA, wahlt Stufe
src/lib/rider-score/post-ride.tsKoordinator, Soft-Fail
src/lib/rider-score/intervention-engine.tsBewertet die Leiter
src/lib/rider-score/reward-engine.tsStellt Pramien durch die Erstattungs-Pipeline aus

Was nicht passiert

  • Wir bewerten weder den Betreiber noch die Flotte.
  • Wir bestrafen keine Fahrten, die durch tote Batterie abgebrochen wurden.
  • Wir verwenden in v1 keinen Score uber Subkonten hinweg.

Weiter

Siehe Gewichte und Einstellungen zum Optimieren. Siehe Fehlerbehebung wenn ein Score nicht den Erwartungen entspricht.