Combien rapporte un kilo de farine de plus ?
L’analyse de sensibilité dit comment la meilleure réponse change quand une donnée du problème change un peu. Le prix caché d’une limite est le gain obtenu en la relâchant d’une unité.
Il aide à décider où investir. Vous saurez dire si la boulangerie gagne plus avec un kilo de farine ou avec une heure de pétrissage.
À la fin de cette leçon
Remarque
Je peux dire de combien le gain optimal change quand une limite augmente d’une unité.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Sensibilité | l’effet d’un petit changement de donnée sur la réponse | |
| Prix caché | le gain apporté par une unité de plus d’une limite | 10 euros par kg |
| Contrainte saturée | une limite entièrement utilisée par le meilleur plan | |
| Marge | ce qui reste d’une limite non utilisée | |
| Ressource | ce qui est limité, comme la farine ou le temps |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le prix caché mesure la valeur d’une limite
Le meilleur plan de la boulangerie rapporte 260 euros. Si l’on avait un kilo de farine en plus, le gain passerait à 270 euros : cette limite vaut donc 10 euros le kilo.
De la même façon, une heure de plus de pétrissage rapporte 20 euros. Le prix caché de la farine est 10 euros le kilo, celui du temps 20 euros l’heure.
Exemple travaillé : une unité de plus
| Limite | Valeur actuelle | Après un de plus | Gain optimal | Prix caché |
|---|---|---|---|---|
| Farine (kg) | 10 | 11 | 270 au lieu de 260 | 10 |
| Temps (heures) | 8 | 9 | 280 au lieu de 260 | 20 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer un prix caché avec Python
# Le gain optimal de la boulangerie pour une farine donnée.
# Les sommets viennent de la leçon 2 : on essaie le sommet des deux limites.
def gain_optimal(farine, temps):
# x + 2 y = temps et 2 x + y = farine se croisent en :
x = (2 * farine - temps) / 3
y = (2 * temps - farine) / 3
return 40 * x + 50 * y
avant = gain_optimal(10, 8)
apres = gain_optimal(11, 8)
print("gain avec 10 kg", round(avant, 2))
print("gain avec 11 kg", round(apres, 2))
print("un kilo de plus rapporte", round(apres - avant, 2))
Lire les prix cachés dans SciPy
docker exec jupyter python3 -c "from scipy.optimize import linprog; res = linprog([-40, -50], A_ub=[[2, 1], [1, 2]], b_ub=[10, 8]); print([round(-m, 2) for m in res.ineqlin.marginals])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une limite non utilisée ne vaut rien
Ajoutons une règle : au plus 6 fournées de pain. Le meilleur plan en fait 4. Cette limite n’est pas saturée : il en reste 2, sa marge.
Un kilo de farine de plus aide, mais une fournée de pain de plus en permis n’aide pas. Le prix caché d’une limite non saturée vaut zéro.
Voir les prix cachés et les marges
docker exec jupyter python3 -c "from scipy.optimize import linprog; res = linprog([-40, -50], A_ub=[[2, 1], [1, 2], [1, 0]], b_ub=[10, 8, 6]); print([round(-m, 2) for m in res.ineqlin.marginals]); print([round(v, 2) for v in res.ineqlin.residual])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Comparer 10, 11 et 20 kg de farine
docker exec jupyter python3 -c "from scipy.optimize import linprog; print([round(-linprog([-40, -50], A_ub=[[2, 1], [1, 2]], b_ub=[b, 8]).fun, 2) for b in (10, 11, 20)])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que le prix caché vaut pour n’importe quelle quantité. Avec 20 kg de farine, le gain est 320 euros et non 360. Le prix ne vaut que pour un petit changement : plus loin, le temps limite à son tour.
Pour aller plus loin
Dans votre carnet, calculez le gain optimal avec 12 kg de farine, puis avec 13 kg. Comparez avec 10 euros par kilo.
Dites jusqu’à combien de kilos le prix de 10 euros semble tenir, et ce qui change ensuite.