Un algo en o(n²) qui semble fonctionner très bien (mais n'est peut être pas optimal, voir à la fin de ce post).
Edit : Je propose de l'appeler "algo par insertion".
Soit donc :
- p0 : la production initiale
- E = {Mi(ci,pi)}
Trier E par ci/pi croissant et en cas d'égalité par ci croissant. Ce tri produit la liste L.
Construire un chemin C vide.
Puis pour chaque Mi de L
C = Meilleur( C, Mi, p0 )
Fin
Et Meilleur( C, Mi, p0 ) est défini par :
Début
- C = [M1, M2, ..., Mn]
- Prendre le meilleur (date de fin la plus petite) parmi :
C0 = [Mi, M1, M2, ..., Mn]
C1 = [M1, Mi, M2, ..., Mn]
C2 = [M1, M2, Mi, ..., Mn]
...
Cn = [M1, M2, ..., Mi, Mn]
Cn+1 = [M1, M2, ..., Mn, Mi]
Fin
Je n'ai pas de preuve pour cet algo. Je peux simplement dire qu'il donne les mêmes résultats (ou des résultats ayant le même score) que l'algo par combinaisons en o(2^n) sur les quelques tests que j'ai pu faire.
Intuitivement, c'est probablement seulement une heuristique.
... maintenant, il est peut être possible de démontrer qu'il y a sous certaines conditions une stabilité dans cette construction incrémentale qui conduise au résultat optimal ?
... ou bien trouver un contre exemple ?