Dare la priorità alle visite nelle vicinanze con gli attributi di transizione

Questo esempio mostra come utilizzare gli attributi di transizione per dare la priorità alle route in cui i ritiri e le consegne nelle vicinanze vengono eseguiti dallo stesso veicolo in un unico blocco di tempo. Per saperne di più sugli attributi di transizione, consulta la sezione Modellare la logica di business con attributi di transizione.

In questo esempio:

  • Le consegne delle spedizioni A, B e C sono vicine l'una all'altra sulla stessa strada.
  • Altre consegne si trovano più avanti sulla strada.
  • Le consegne non hanno orari di consegna specifici.
  • Indipendentemente dalla pianificazione delle visite, il veicolo deve percorrere questa strada due volte: una volta al mattino sulla strada dal deposito e una volta alla sera sulla strada di ritorno.
  • La distanza e la durata complessive del percorso sono sempre le stesse, indipendentemente da quando vengono eseguite le consegne A, B e C.

Esempio con consegne di spedizioni sulla stessa strada. Ci sono tre
spedizioni A, B e C sulla strada dal deposito verso altre spedizioni. A si trova a
1000 metri dal deposito, B a 50 metri più lontano dal deposito e C a 30
metri più lontano nella stessa direzione. Ci sono altre spedizioni a 1000 metri di distanza da
C.

In questa situazione e per una richiesta che utilizza solo il costo orario e il costo per chilometro, la route ottimizzata potrebbe prevedere la gestione di A e B al mattino e di C alla sera e il costo della soluzione sarebbe lo stesso di se tutte e tre le consegne fossero gestite contemporaneamente.

Costo per chilometro con una soglia

Per raggruppare le visite nelle vicinanze, devi prima selezionare una distanza di soglia. Si tratta della distanza massima tra due visite che consideri vicine. Questo esempio utilizza una soglia di 100 metri che corrisponde approssimativamente a un isolato in un'area urbana. Puoi aumentare o diminuire la soglia in base alle esigenze della tua attività e alle preferenze dei tuoi autisti.

Per raggruppare le visite nelle vicinanze entro 100 metri l'una dall'altra, imposta un costo elevato per i primi 100 metri di ogni transizione e un costo inferiore per i metri aggiuntivi della transizione. Poiché i primi 100 metri sono i più costosi, l'ottimizzatore ottiene i maggiori risparmi utilizzando transizioni più brevi della soglia di 100 metri, anche se ciò significa estendere la lunghezza complessiva della route.

Per configurare i costi, aggiungi una nuova voce a ShipmentModel.transition_attributes con le seguenti proprietà:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Il tag #unused_tag# non deve essere utilizzato da spedizioni o veicoli per trovare la corrispondenza con tutte le transizioni possibili. Per saperne di più, consulta la sezione Come trovare la corrispondenza con tutte le richieste di visita.

Come funziona un costo elevato al di sotto della soglia

Questa sezione mostra in che modo il costo al di sotto e al di sopra della soglia influisce sul costo complessivo delle diverse soluzioni dello scenario di esempio.

Soluzione 1: esegui A e B lungo la strada di andata e C lungo la strada di ritorno

In questa soluzione, le spedizioni vengono suddivise in due attraversamenti di questa strada. Due di queste vengono consegnate al primo attraversamento e la rimanente al secondo. Esistono 5 transizioni:

Transizione Distanza Sotto la soglia Sopra la soglia
Distanza Costo Distanza Costo
deposito →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2,5 0 m 0
B→altro 1030 m 100 m 5 930 m 0,93
altro→C 1000 m 100 m 5 900 m 0,9
C→deposito 1080 m 100 m 5 980 m 0,98
Totale 450 m 22,5 3710 m 3,71

Il costo complessivo viene calcolato come la somma dei due costi per chilometro:

  • il costo per chilometro al di sotto della soglia (50) moltiplicato per la distanza totale percorsa al di sotto della soglia (450 m = 0,45 km),
  • il costo per chilometro al di sopra della soglia (1) moltiplicato per la distanza totale percorsa al di sopra della soglia (3710 m = 3,71 km).

Il costo complessivo è quindi 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Soluzione 2: esegui A, B e C lungo la strada di andata e niente sulla strada di ritorno

In questa soluzione, a differenza della soluzione 1, tutte e tre le spedizioni vengono consegnate "in gruppo" durante un attraversamento della strada. Nell'altro attraversamento, il veicolo non si ferma affatto. Anche in questo caso, esistono 5 transizioni, ma le loro lunghezze e composizioni sono diverse:

Transizione Distanza Sotto la soglia Sopra la soglia
Distanza Costo Distanza Costo
deposito →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2,5 0 m 0
B→C 30 m 30 m 1,5 0 m 0
C→altro 1000 m 100 m 5 900 m 0,9
altro→deposito 2080 m 100 m 5 1980 m 1,98
Totale 380 m 19 3780 m 3,78

Utilizzando lo stesso calcolo della soluzione 1, il costo complessivo è 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78 e l'esecuzione di tutte le visite in un unico blocco di tempo ha un costo inferiore rispetto all'esecuzione in due gruppi. Puoi rafforzare questo effetto aumentando DistanceLimit.cost_per_kilometer_below_soft_max.

Perché un costo per chilometro basso al di sotto della soglia non funziona

Poiché vuoi preferire le transizioni brevi a quelle lunghe, potresti essere tentato di assegnare un costo per chilometro elevato alle transizioni lunghe e mantenere il costo per chilometro basso per le transizioni brevi. Tuttavia, questo ha un effetto inverso: poiché i primi 100 metri della transizione sono i più economici, l'ottimizzatore utilizza questi metri "economici" al massimo effetto preferendo le transizioni che hanno una lunghezza pari o superiore a 100 metri.

Puoi vedere questo effetto nelle due soluzioni di esempio. Se scambi il costo per chilometro al di sotto e al di sopra della soglia, i costi della route cambiano:

Costo elevato al di sopra della soglia Costo elevato al di sotto della soglia
Soluzione 1 Soluzione 2 Soluzione 1 Soluzione 2
KM al di sotto della soglia 0,45 0,38 0,45 0,38
Costo per KM al di sotto della soglia 1,00 1,00 50,00 50,00
KM al di sopra della soglia 3,71 3,78 3,71 3,78
Costo per KM al di sopra della soglia 50,00 50,00 1,00 1,00
Costo totale 185,95 189,38 26,21 22,78

Per ogni versione, il costo totale inferiore delle due soluzioni è evidenziato in grassetto. Puoi notare che quando utilizzi un costo elevato al di sopra della soglia, il costo totale della route è ora più elevato per la route in cui le visite sono raggruppate, il che è l'opposto di ciò che volevi ottenere.