Caricamento efficiente del bus


10

Questo è qualcosa che ho fatto per una compagnia di viaggi in autobus molto tempo fa e non sono mai stato contento dei risultati. Recentemente stavo pensando a quel vecchio progetto e ho pensato di rivisitare quel problema.

Problema:

La compagnia di autobus ha diversi autobus con diverse capacità passeggeri (ad es. 15 autobus da 50 passeggeri, 25 autobus da 30 passeggeri ... ecc.). Si sono specializzati nell'offrire trasporto a gruppi molto grandi (oltre 300 passeggeri per gruppo). Poiché ogni gruppo deve viaggiare insieme, è necessario gestire la propria flotta in modo efficiente per ridurre gli sprechi.

Ad esempio, 88 passeggeri sono meglio serviti da tre autobus da 30 passeggeri (2 posti vuoti) che da due autobus da 50 passeggeri (12 posti vuoti). Un altro esempio, 75 passeggeri sarebbero meglio serviti da un autobus da 50 passeggeri e un autobus da 30 passeggeri, un mix di tipi.

Qual è un buon algoritmo per farlo?


3
Per non essere pignoli, ma sospetto dal punto di vista della compagnia di autobus, 2 50 autobus passeggeri sarebbero più efficienti poiché i costi del gas vanno solo verso 2 autobus invece di 3. Quindi è davvero così?
Dunk,

8
Sembra il problema dello zaino , che è NP-difficile. In pratica, lo spazio di ricerca per un determinato percorso dovrebbe essere piuttosto piccolo.
chrisaycock,

@Dunk - Sarò il primo ad ammettere che non ho idea della logistica degli autobus e dei tour, ma questo era il loro requisito. Avevano persino un consulente ben pagato che lo faceva manualmente.
Sistema inattivo

I posti vuoti sono irrilevanti, ciò che conta sono i costi operativi. Quindi guarda la risposta di Philosodad.
Loren Pechtel,

@LorenPechtel - Come ho detto prima, non impongo le regole di business, le ho solo implementate.
System Down

Risposte:


8

Questo è (in qualche modo) un esempio del problema dell'imballaggio del cestino, che viene spesso confuso con il problema dello zaino. Nell'imballaggio del cestino, hai contenitori di una certa capacità e stai cercando di distribuire oggetti di varie dimensioni nei contenitori. L'idea è di utilizzare il minor numero possibile di bin.

Non stai esattamente cercando di ridurre al minimo il numero di bin, ma stai cercando di ridurre al minimo il numero di posti vuoti. Ed è possibile che tu stia cercando di ridurre al minimo il numero di posti vuoti in tutta la flotta, ovvero, hai quattro gruppi di tour di varie dimensioni e vuoi sistemarli tutti con il minor numero di posti vuoti. Non riesco a pensare a un'istanza subito, ma immagino che potrebbe essere possibile costruire una flotta e un gruppo di gruppi di tour in modo tale da farti stare meglio con una soluzione scadente per alcuni gruppi perché ti ha permesso di evitare usando una soluzione ancora peggiore per qualche altro gruppo.

La situazione peggiora. Che cosa succede se si dispone di 20,30 e 50 autobus passeggeri. Ognuno utilizza diverse quantità di carburante, ma è più efficiente far funzionare uno 50 piuttosto che eseguire un 20 e un 30. Ma dalla nostra singola misura (minimo numero di posti vuoti), ha senso correre per un 50 tour passeggeri.

Inoltre, autobus con numeri strani, come 28 o 39, inclinerebbero molte delle nostre scorciatoie.

Quindi, a seconda della complessità della situazione, potresti fare una di queste due cose:

Primo, ed esaustivo albero di ricerca: usa ogni possibile combinazione di autobus. Se hai solo 3 o 4 bus, questa è probabilmente una soluzione ragionevole. Altrimenti, qualcosa come la riduzione della migliore adattamento produrrebbe risultati ragionevoli, ma non ottimali.


Non riesco a immaginare perché questa risposta sia stata sottoposta a downgrade. Upoting per compensare. Molto bene.
David Conrad,

1

Ecco una soluzione rapida e sporca in Python:

def add50(passengers, buses):
    proposed = buses + [50]
    if sum(proposed) < passengers:
        return add50(passengers, proposed)
    return proposed

def add30(passengers, buses):
    proposed = buses + [30]
    if sum(proposed) < passengers:
        proposed30 = add30(passengers, proposed)
        proposed50 = add50(passengers, proposed)
        return proposed30 if sum(proposed30) < sum(proposed50) else proposed50
    return proposed

print add30(88, [])
print add30(75, [])
print add30(105, [])

Quando lo eseguo, ottengo:

[30, 30, 30]
[30, 50]
[30, 30, 50]

Il codice sta effettuando una ricerca approfondita nei possibili scenari. Poiché l'ordine non ha importanza ( [30, 50]è uguale a [50, 30]), possiamo ridurre lo spazio di ricerca aggiungendo solo autobus della stessa dimensione o più grandi. Ecco perché add30()può chiamare add50(), ma non viceversa.


0

Risponderò dal punto di vista del cliente. Non vorrei un algoritmo hard coded per questa applicazione. Ci sono troppe variabili che possono cambiare nel tempo. Sebbene nulla dei tuoi autobus possa cambiare il peso dei fattori potrebbe cambiare o potrebbero essere scoperti nuovi fattori che non avevo mai pensato (ad esempio nel tempo, le leggi e altri costi del conducente).

Per questo motivo, vorrei essere in grado di creare la mia tabella di ricerca in base a un intervallo del numero di passeggeri richiesti e di creare le mie impostazioni per le migliori combinazioni di autobus. Esempio: 31-50 = 1 X 50, 51-60 = 2 X 30. È davvero necessario calcolarlo? È più facile cambiare le impostazioni rispetto a una serie di formule che includono sedili, gas e driver. Individua la combinazione migliore, falla finita e lascia molto spazio all'utente affinché possa modificare queste impostazioni come ritiene opportuno.

Nuovi fattori potrebbero essere scoperti. Gli autobus più grandi pagano una tariffa esponenzialmente più alta sui pedaggi? Posso ottenere conducenti meno costosi per autobus di piccole dimensioni quando una nuova legge per la certificazione e le licenze extra si applica ai conducenti di autobus con più di 30 passeggeri?

Assumono un nuovo consulente con una logica diversa dalla loro formula e potrebbe essere necessario riscrivere la tua app. Vuoi dire che devi considerare il costo del parcheggio?


Questo non funziona: 31-50 = 50 posti autobus, a meno che non siano già utilizzati per altri gruppi o fuori servizio o non disponibili per altri motivi. La compagnia di autobus dalla domanda, con 15 autobus da 50 passeggeri, molto probabilmente avrà più clienti alla volta.
Saluti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.