L'explorateur - Détails (1) Dépôts

L'explorateur effectue des aller-retour dans le désert pour placer des dépôts de nourriture et finallement atteindre sa destination.
Le même genre de problèmes avec juste d'autres mots (bananes, éléphant, camion etc...).
Soit a l'autonomie en jours de l'explorateur, D la distance à parcourir (en jours).
Q la quantité totale de nourriture emportée au départ (en jours) S la quantité totale restante à l'arrivée
On peut se poser diverses questions reliant ces valeurs, et des buts différents :
  1. Stock initial Q minimum pour atteindre la destination D ? Durée totale du voyage ?
  2. Même question pour livrer une quantité donnée S à l'arrivée
  3. Distance maximum atteinte avec un stock Q au départ ?
  4. Quantité maximum S livrée à distance D avec un stock Q au départ ?
  5. Mêmes questions si les étapes sont d'un nombre entier de jours

Livraison

Il s'agit donc de livrer la quantité S à la distance D, ou simplement d'atteindre D avec S = 0.
Nous allons donner déja un script général pour cette question, les explications ensuite.
Autonomie a = jours/porteur, Distance D = jours
Quantité à livrer S = (en jours), Valeurs entières
 

Raisonnons à partir de la fin du voyage.
Si S ≤ a, il part simplement du dernier dépôt avec l'autonomie a et atteint sa destination avec un reste S0 = S = a - x0.
Cette dernière étape sera donc de distance x0 = a - S, partant du dernier dépôt qui était S1 = a.
Si S > a il faut effectuer déjà plusieurs voyages et il est ramené au cas général :

De façon générale en numérotant les étapes à partir de la fin, si xi est la distance de l'étape i, à l'issue de cette étape on veut constituer un stock Si-1 pour l'étape suivante i-1. (S0 = S).
Au départ de cette étape i on a le stock Si et le bilan, en effectuant ui allers et ui - 1 retours, est Si = Si-1 + (2ui - 1)xi      [1]
Bien entendu, on a l'encadrement (ui - 1)a < Si ≤ uia :
Inutile d'amasser plus qu'on ne pourra en emporter, et inutile de faire ui allers alors que ui - 1 suffiraient.
Soit (uia - Si-1) - a < (2ui - 1)xi ≤ uia - Si-1
Il faut aussi remarquer que si xi ≥ a/2, on ne peut rien laisser en dépôt, a - 2xi est donc > 0.
Bien entendu ce cas xi ≥ a/2 est tout de même possible, pour la dernière étape, avec u1 = 1 (aller simple) et S0 ≤ a, x1 = a - S0.
Le cas général (a - 2xi > 0) permet de résoudre en u, qui doit être un nombre entier : (Si-1 - xi)/(a - 2xi-1) ≤ ui < (Si-1 - xi)/(a - 2xi-1) + a/(a - 2xi-1)
Comme a/(a - 2xi) > 1 pour 0 < xi < a/2, il y a toujours au moins une valeur entière entre ces bornes.
On a bien entendu intérêt à choisir la plus petite valeur pour ui :
ui ≥ (Si-1 - xi)/(a - 2xi-1) > Si-1/a et donc ui sera le plus petit entier > Si-1/a.
Maintenant si xi ≥ 1 (étapes entières), cette borne est remontée d'autant et ui ≥ (Si-1 - 1)/(a - 2)

On en déduit alors xi comme la plus grande valeur (éventuellement entière) ≤ (uia - Si-1)/(2ui - 1).
Ce sera tout simplement cette valeur (uia - Si-1)/(2ui - 1) si pas de contrainte sur xi, le plus grand entier ≤ si xi est entier.

Cette valeur reportée dans l'équation [1] donne alors Si et de proche en proche les étapes successives en partant de la fin.
Enfin la première étape est éventuellement raccourcie, car inutile de dépasser le point de départ !

Etapes entières : ui ≥ (Si-1 - 1)/(a - 2)
sinon ui > Si-1/a
xi ≤ (uia - Si-1)/(2ui - 1), entier ou non
Si = Si-1 + (2ui - 1)xi

Le cas le plus simple est S = 0 (juste aller à distance D), et des étapes de durées quelconques.
On a alors simplement :
A une étape donnée, il part d'un dépôt contenant na, fait 2n-1 trajets xn et un bilan de :
na-(2n-1)xn = (n-1)a soit xn = a/(2n-1). La distance totale est :

 D = a(1 + 1/3 + 1/5 + 1/7 +...+ 1/(2N-1)) 
Cette série divergente permet d'atteindre une distance quelconque.
La durée totale est a + 3a/3 + 5a/5 + ... = Na, N (et donc Na) croît exponentiellement avec D/a.
et on est bien entendu limité par la quantité totale de nourriture présente sur Terre !

Avec D = 1.5 a, on obtient 1 + 1/3 + 1/5 = 1.5333 > D
La première étape est alors raccourcie à D - a(1 + 1/3) = a/6 = 3.33 jours de distance. (au lieu de a/5 = 4)
Il fera à cette distance un dépôt de 2a pour l'étape suivante (2 allers).
Il effectue la première étape en 3 allers et 2 retours et il consomme donc 5a/6
La quantité totale de nourriture à prévoir au départ est ainsi de 2a + 5a/6 = 17a/6 = 56.66 jours
Il peut répartir cette quantité à sa convenance entre les 3 voyages aller.
Et cette quantité étant intégralement consommée, c'est la durée totale de son voyage.

On peut se poser la question des quantités infimes que l'on obtient ainsi.
Avec D = 80 = 4a, il faut 419 étapes. La première étape est de 0.01 jours, qu'il faut effectuer 837 fois, pour déposer un stock de 8360×20 à la distance de 0.01 jours du départ. Quelle est la pertinence d'une telle procédure ?? (déplacer le stock, supposé ponctuel, de quelques dizaines de cm ??)
On peut ainsi imposer que la plus petite étape soit de 1 jour, et même que chaque étape soit d'un nombre entier de jours.
Si on accepte des étapes d'une demi- journée, d'une heure etc... il suffit de changer d'unité pour avoir la contrainte "étape entière".

Dans les mêmes conditions (juste atteindre la distance D), notre explorateur effectuera alors :
1ère étape de 4 jours, 3 allers et 2 retours partant avec Q = 58 pour effectuer un dépot de 2a = 38
2ème étape de 6 jours, 2 allers et un retour, pour effectuer un dépôt de 20 jours
(il a consommé en 3 trajets de 6 jours 18 jours de nourriture seulement)
Dernière étape de 20 jours, aller simple consommant ces 20 jours.

Lorsque D est trop loin (≥ 6a), le programme estime le nombre d'étapes par la formule

1 + 1/2 + 1/3 +...+ 1/N ≈ ln(N) + γ + 1/(2N)
Avec γ la constante d'Euler ≈ 0.57721566490153286...
et bien entendu, puisqu'on se limite ici à la seule somme des inverses des nombres impairs :
1 + 1/3 +... + 1/(2N+1) = 1 + 1/2 + 1/3 + ... + 1/(2N) + 1/(2N+1) - 1/2 (1 + 1/2 + 1/3 + .. + 1/N)
1 + 1/3 +...+ 1/(2N+1) ≈ ln(2N+1) - ln(N)/2 + γ/2 + 1/(4N+2) - 1/(4N)

En première approximation 1 + 1/3 +...+ 1/(2N+1)  ≈ ln(2√N) + γ/2
Cette valeur étant alors reportée dans l'équation du dessus pour obtenir une meilleure approximation de  ln((2N+1)/√N) et donc de N.

Si les étapes sont d'un nombre entier de jours, le nombre d'étapes est borné par D, et cette limitation n'a pas lieu, (mais la durée du voyage est tout aussi irréaliste).

Stock limité

Il s'agit ici d'utiliser "au mieux" le stock initial Q. Soit pour aller le plus loin possible, soit pour livrer la plus grande quantité S à la distance D.

La première étape consiste donc à partir avec des aller-retours à chargement plein (= a)
on fera alors Q/a allers (et un retour de moins) pour constituer le premier dépôt
Puis itérativement à partir de ce premier dépôt jusqu'à atteindre la distance D, ou l'inanition...
Le calcul est ici plus simple puisqu'il se fait "en avant" (dans le sens de la marche) et non plus en partant de la dernière étape.
Nous allons ainsi numéroter les étapes dans le sens de la marche.
La suite est triviale, de proche en proche.

Le problème devient plus intéressant si Q/a n'est pas un nombre entier... que faire du reste de la division de Q par a ?
C'est à dire Q = na + r, 0 ≤ r < a
Il y a deux stratégies possibles pour effectuer un dépôt de (n-1)a pour les étapes suivantes.
Soit on effectue n+1 allers et n retours pour effectuer un premier dépôt de na, puis à partir de ce dépôt les n allers et n-1 retours
distance du dépôt de (n-1)a : r/(2n+1) + a/(2n-1) (ceci montre d'ailleurs qu'il est toujours rentable d'utiliser le reste)
Soit on effectue les n+1 allers et n retours pour effectuer directement le dépôt de (n-1)a. à la distance (a+r)/(2n+1) = r/(2n+1) + a/(2n+1)
Comme il est évident que a/(2n-1) > a/(2n+1), la première stratégie est meilleure

S0 = Q = an + r,     0 < r < a
u0 = n+1,   x0 = r/(2n + 1)
S1 = an

Les étapes suivantes entrent dans le cas général où Q est un multiple de a :

 un+1 = un - 1, et le trajet est xn+1 = a/(2un - 1) 

On s'arrête quand Σxi ≥ D
La dernière étape est alors différente (si > D), car tout n'est pas consommé :
l'étape est raccourcie et on transfère plus que uN+1a à la destination (considérée comme dépôt pour une étape N+1).

Si le but est d'aller le plus loin possible, il suffit de mettre un D très grand (et impossible à atteindre) dans le script.


a = jours/porteur, Distance jours, Quantité initiale Valeurs entières
 

Si les étapes sont en nombre entier de jours, le reste n'est plus nul aux étapes ultérieures.
D'ailleurs le critère sur le reste n'est plus valable.
Il peut être plus rentable de ne pas consommer tout le reste, et de faire une étape plus courte pour déposer plus, quitte à en laisser au dépôt suivant. Ou au contraire d'allonger l'étape, quitte à partir avec un déficit à l'étape suivante.

Soit donc Sn = na + r le stock disponible au départ de l'étape n, r ≠0.
Le nombre de trajets au départ de cette étape étant un = n+1, soit en tout 2n+1 trajets de longueur xn.
Posons x = [r/(2n+1)], plus grand entier ≤ r/(2n+1) Il reste à choisir si xn = x ou x+1.

Enfin si r = 0, (ou si on laisse tomber le reste) un = n,     xn = ceil(a/(2n - 1)), plus petit entier ≥ a/(2n - 1)

 

Accueil Arithmétiques Géométrique Divers Thèmes Scripts Jeux Exercices Sujet précédent Sujet suivant Parent