Ho un problema che possiamo modellare come la miscelazione di acqua a due differenti temperature per ottenere un certo flusso ad una certa temperatura.
Schematicamente:
Ho una riserva infinita di acqua calda (diciamo 100°C) e acqua fredda (diciamo 0°C).
Ho inoltre 5 rubinetti con i quali posso regolare il flusso.
L'obbiettivo è ottenere in uscita una portata e una temperatura ben definite (per esempio 0.5 l/min a 4°C).
I rubinetti hanno una portata limitata sia in basso che in alto. Possono però essere chiusi completamente.
Per esempio il rubinetto 1 può fornire o 0 l/min o qualsiasi valore tra 0.0006 e 0.03 l/m.
A valle dei rubinetti 1 e 2 si forma una miscela che viene poi controllata dal rubinetto 3. La somma del flusso di 1 e 2 deve sempre essere maggiore al flusso impostato in 3. Miscela in eccesso viene smaltita attraverso il troppopieno.
Valgono tutte le semplificazioni del caso (miscelazione perfetta e istantanea, capacità termica del sistema nulla...)
Se mettessimo una persona con un minimo di pazienza davanti a questo sistema, sarebbe in grado in poco tempo di impostare i flussi per ottenere il risultato desiderato in uscita.
Ma come affrontare il problema se a risolverlo deve essere un computer?
La prima idea che mi è venuta è di cercare di ottenere il flusso usando solo 4 e 5.
Se ci riesco, bene. Altrimenti entra in gioco 3.
Già solo questo passaggio porta però ad un'esplosione delle possibilità: il flusso richiesto in ognuno dei due rubinetti può essere
a) troppo basso
b) accettabile
c) troppo alto
Sono 9 possibili combinazioni, di cui una (accettabile e accettabile) risolve il problema. Tutte le altre 8 necessitano di una correzione dei flussi impostati e l'intervento del rubinetto 3 (di conseguenza anche di 1 e 2).
E qui abbiamo 1, 2 e 3 che possono assumere gli stati a), b) o c). Sono 27 possibilità, che vanno moltiplicate con 8 e portano a 216 possibilità. Se mi metto a programmarlo in modo classico mi diventa una giungla ingestibie di if-else if- else if-...-else.
Stavo quindi pensando ad un approccio di backtracking, ma non sono sicuro che sia poi tanto piú facile.
Ammetto che mi è anche passato per la testa di calcolare una look-up table, ma non è proprio elegante e tenendo conto delle caratteristiche dei "rubinetti" veri, verrebbe una LUT di 2.4 terabytes

Idee?
Boiler