Un carico di bombole di gas

Un carico di bombole di gas da ripartire su tre camion è la base su cui un interessante articolo sul sito indiano DeccanHerald.com propone un esempio di insegnamento creativo della matematica. Ecco il problema:

Ventuno bombole di gas devono essere caricate su tre camion. Sette bombole sono piene, sette sono piene a metà e sette sono vuote. Una bombola piena pesa 50 kg e una bombola vuota pesa 20 kg. Come dovrebbero essere caricate sui camion in modo che ogni camion porti lo stesso peso?

L’approccio suggerito dall’articolo è decisamente bello, mostrando come costruire la soluzione riducendo prima il problema a una sua versione elementare. Per un’analisi completa del problema sono ricorso invece a una soluzione bovina, senza nessuna creatività. E, sorpresa, spunta una seconda soluzione.
Nota: ho reso accessibile il codice descritto nel seguito su Google Colab.


Un carico di bombole: primi passi obbligati

L’enunciato del problema lascia due dettagli da determinare subito: il peso di una bombola semi-piena e il peso da caricare su ciascun camion. Qui basta un po’ di aritmetica.
Se una bombola vuota pesa 20 e una piena pesa 50, allora il peso del gas è di 50 – 20 = 30 kg. Una bombola piena a metà peserà quindi 20 + 30/2 = 35 kg.
Il peso totale da suddividere in tre sarà, quindi, di:

7 × (50 + 35 + 20) = 7 × 105 = 735 kg

Quindi a ogni camion spetteranno: 735  ⁄  3 = 245 kg.

C’è un non detto nell’enunciato, che si può essere tentati di assumere come richiesto: non è necessario che le 21 bombole siano equi-distribuite tra i tre camion anche come numero (7, 7, 7), è richiesto solo che i carichi abbiamo peso uguale.

La soluzione creativa

Prima di analizzare come distribuire l’intero carico di bombole, l’articolo propone di esaminare il caso in cui ci siano solo 3 bombole, rispettivamente una piena, una semi-piena e una vuota, situazione che rappresentiamo così:

(1,1,1)

È evidente che non c’è soluzione possibile.
Bene, passiamo al caso di 6 bombole, 2 piene, 2 semi-piene e 2 vuote (2,2,2). Il peso da ripartire è di 210 kg, quindi occorre caricare 70 kg su ciascun camion.
Se si osserva che una bombola piena più una vuota pesano come due semi-piene, si intuisce subito la soluzione:

(2,2,2) = (1,0,1) + (1,0,1) + (0,2,0)

Cosa accade con 9 bombole (3,3,3)?
Ancora più semplice, perché si possono caricare i 3 camion tutti allo stesso modo:

(3,3,3) = (1,1,1) + (1,1,1) + (1,1,1)

Cosa accade al crescere del numero di bombole, fermo restando che le piene, le semi-piene e le vuote siano sempre in numero uguale? Beh, basta utilizzare i due risultati appena trovati.
Ad esempio, per il caso di 21 bombole, si può osservare che 21 = 6 + 6 + 9 e quindi che una soluzione si trova ripartendo prima 6 bombole, poi altre 6 e infine le 9 rimanenti. Quindi i tre camion avranno carichi, rispettivamente, di:

  • (1,0,1) + (1,0,1) + (1,1,1) = (3,1,3);
  • (1,0,1) + (1,0,1) + (1,1,1) = (3,1,3);
  • (0,2,0) + (0,2,0) + (1,1,1) = (1,5,1).

È facile osservare che ciascun carico è di 245 kg:

  • 3 × 50 + 35 + 3 × 20 = 245 kg;
  • 50 + 5 × 35 + 20 = 245 kg.

Il caso generale

In realtà abbiamo in mano gli strumenti per risolvere il caso generale di un qualunque numero di terne di bombole (piena, semi-piena, vuota), purché maggiore di 1.
Il numero di terne è pari? Esempio: 8. Allora 24 = 6 + 6 + 6 + 6.
Dispari? Esempio: 11. Allora 33 = 6 + 6 + 6 + 6 + 9. Ma anche: 33 = 6+ 9 + 9 + 9.

Più soluzioni possibili

Tornando al caso delle 21 bombole, si può osservare che si può sfruttare la composizione dei carichi da 6 e 9 in un modo lievemente diverso:

  • (1,0,1) + (1,0,1) + (1,1,1) = (3,1,3);
  • (1,0,1) + (0,2,0) + (1,1,1) = (2,3,2);
  • (0,2,0) + (1,0,1) + (1,1,1) = (2,3,2).

Questa seconda soluzione non compare nell’articolo, probabilmente perché complica il discorso, senza essere funzionale allo scopo dell’articolo.
Domanda: si possono elencare in modo esaustivo tutte le soluzioni? Ne esistono che prevedano un numero di bombole diverso da camion a camion?

Un approccio esaustivo

Lasciando da parte la creatività, proviamo un approccio semplice-semplice, che analizzi in modo esaustivo il problema. E per evitare la fatica di carta e penna, magari con errori annessi, ricorriamo a qualche riga di codice Python.

Cominciamo da una domanda di base: in quanti modo posso comporre il carico di 245 kg, combinando i tre tipi di bombole, senza altri vincoli? Proviamo tutte le possibili combinazioni.

peso_p = 50
peso_v = 20
peso_sp = (50+20)/2
ideale = 7 * (peso_p + peso_sp + peso_v)/3
#
print ('quali combinazioni di bombole sommano a {} kg?'.format(ideale))
for piene in range(0,8):
  for semipiene in range(0,8):
    for vuote in range(0,8):
      peso = piene * peso_p + semipiene * peso_sp + vuote * peso_v
      if peso == ideale:
        print ('{} piene, {} semi-piene, {} vuote'.format(piene, semipiene, vuote))

Ricordo che range(0,8) enumera tutti gli interi da 0 a 7 compresi.
Ed ecco l’output di questo primo passo:

quali combinazioni di bombole sommano a 245.0 kg?
0 piene, 3 semi-piene, 7 vuote
0 piene, 7 semi-piene, 0 vuote
1 piene, 5 semi-piene, 1 vuote
2 piene, 3 semi-piene, 2 vuote
3 piene, 1 semi-piene, 3 vuote

Una prima importante risposta ci arriva già da questo primo passaggio: tutte le combinazioni sono costituite da 7 bombole, tranne una, la prima, di 10 bombole. Se questa combinazione facesse parte di una soluzione, però, dovremmo avere almeno un’altra combinazione con meno di 7 bombole, per compensare il suo eccesso. Poiché non è così, le uniche possibili soluzioni prevederanno, tutte, 7 bombole per camion.

Cominciamo a complicare il codice

È preferibile inserire le combinazioni di carico di bombole che sommano a 245 kg in una lista, più utile per l’elaborazione, piuttosto che stamparle via via che vengono trovate. Questo si fa in modo abbastanza semplice, basta sostituire l’ultimo tratto di codice:

      if peso == ideale:
        carichi.append((piene, semipiene, vuote))
print (carichi)
print ('la lista carichi ha {} elementi'.format(len(carichi)))

In questo modo la stampa avviene in un colpo solo, alla fine dell’analisi delle possibili combinazioni.

[(0, 3, 7), (0, 7, 0), (1, 5, 1), (2, 3, 2), (3, 1, 3)]
la lista carichi ha 5 elementi

Il passaggio finale

Avendo 5 possibili modi di caricare ciascun camion e 3 camion, le possibili combinazioni di carico saranno 53 = 125. Tutte queste combinazioni rispetteranno il peso richiesto per ciascun camion, ma non necessariamente il numero totale di bombole utilizzate sarà di 7 bombole per tipo. Quindi è sufficiente aggiungere qualche riga di codice che verifichi questa ulteriore condizione.
Ecco il programma completo:

peso_p = 50
peso_v = 20
peso_sp = (50+20)/2
ideale = 7 * (peso_p + peso_sp + peso_v)/3
carichi = []
#
for piene in range(0,8):
  for semipiene in range(0,8):
    for vuote in range(0,8):
      peso = piene * peso_p + semipiene * peso_sp + vuote * peso_v
      if peso == ideale:
        carichi.append((piene, semipiene, vuote))
#
print ('Possibili carichi per i tre camion:')
for i in range(0,len(carichi)):
  for j in range(0,len(carichi)):
    for k in range(0,len(carichi)):
      c_i = carichi[i]
      c_j = carichi[j]
      c_k = carichi[k]
      piene = c_i[0] + c_j[0] + c_k[0]
      semipiene = c_i[1] + c_j[1] + c_k[1]
      piene = c_i[2] + c_j[2] + c_k[2]
      if piene == 7 and semipiene == 7 and vuote == 7:
        print (c_i, c_j, c_k)

E questo è l’output del programma:

Possibili carichi per i tre camion:
(1, 5, 1) (3, 1, 3) (3, 1, 3)
(2, 3, 2) (2, 3, 2) (3, 1, 3)
(2, 3, 2) (3, 1, 3) (2, 3, 2)
(3, 1, 3) (1, 5, 1) (3, 1, 3)
(3, 1, 3) (2, 3, 2) (2, 3, 2)
(3, 1, 3) (3, 1, 3) (1, 5, 1)

Esistono quindi 6 possibili combinazioni di carico, in realtà riconducibili a due, se non si tiene conto delle possibili permutazioni tra i camion:

  • (1, 5, 1) (3, 1, 3) (3, 1, 3);
  • (2, 3, 2) (2, 3, 2) (3, 1, 3).

Le uniche soluzioni sono quindi due: quella trovata con il ragionamento creativo dell’articolo e la sua variante trovata successivamente.


L’articolo l’ho letto agli inizi febbraio, l’idea di giocarci con Python è rimasta nel buffer mentale per un po’. Quindi, giuro, non mi ha motivato l’emergenza delle forniture alternative di gas. E comunque, nella vita reale le bombole andrebbero movimentate piene (andata) o vuote (ritorno).
Vale la pena di notare che la seconda soluzione l’ho trovata eseguendo il programma, poi l’ho dedotta come variante non menzionata nell’articolo.
Ricordo infine che provare a giocare con il codice è molto semplice: basta avere un account Google e utilizzare Google Colab, magari proprio partendo da questo semplice problema.

Immagine di apertura di kobitriki da Pixabay.

Scritto da:

Pasquale

Mi chiamo Pasquale Petrosino, radici campane, da alcuni anni sulle rive del lago di Lecco, dopo aver lungamente vissuto a Ivrea.
Ho attraversato 40 anni di tecnologia informatica, da quando progettavo hardware maneggiando i primi microprocessori, la memoria si misurava in kByte, e Ethernet era una novità fresca fresca, fino alla comparsa ed esplosione di Internet.
Tre passioni: la Tecnologia, la Matematica per diletto e le mie tre donne: la piccola Luna, Orsella e Valentina.
Potete contattarmi scrivendo a: p.petrosino@inchiostrovirtuale.it