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