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.
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