L'algorithme de Cheapest Insertion (ou algorithme d'insertion au moindre coût) est une méthode heuristique utilisée principalement pour résoudre le problème du voyageur de commerce (TSP - Traveling Salesman Problem). Ce problème fondamental en optimisation combinatoire consiste à déterminer le circuit le plus court qui permet de visiter un ensemble de villes exactement une fois avant de revenir au point de départ.
Contrairement aux méthodes exactes qui garantissent une solution optimale mais sont impraticables pour les grands ensembles de données, cet algorithme offre un excellent compromis entre qualité de solution et temps de calcul, ce qui explique sa popularité dans les applications pratiques de logistique, de planification d'itinéraires et d'optimisation de réseaux.
L'idée centrale de l'algorithme est de construire progressivement une solution en commençant par un petit sous-circuit initial, puis en insérant itérativement les villes restantes à l'endroit qui minimise l'augmentation de la longueur totale du circuit.
L'algorithme débute avec un sous-circuit initial, généralement composé de deux ou trois villes. Ce sous-circuit peut être créé en sélectionnant les villes les plus proches les unes des autres, ou simplement en choisissant des villes arbitraires selon le contexte du problème.
Pour chaque ville non encore incluse dans le circuit, l'algorithme calcule le coût d'insertion à chaque position possible du circuit existant. Ce coût est défini comme l'augmentation de la longueur totale du circuit qui résulterait de l'insertion.
Mathématiquement, si nous avons une arête (i,j) dans le circuit actuel et que nous envisageons d'insérer une ville k entre i et j, le coût d'insertion est calculé comme:
\[ \text{Coût d'insertion} = c_{ik} + c_{kj} - c_{ij} \]où \(c_{xy}\) représente le coût (ou la distance) entre les villes x et y.
La ville qui peut être insérée avec le coût minimal est sélectionnée et ajoutée au circuit à la position correspondante. Cette étape transforme le circuit existant en y intégrant la nouvelle ville.
Les étapes 2 et 3 sont répétées jusqu'à ce que toutes les villes aient été intégrées dans le circuit.
Une fois toutes les villes intégrées, le circuit complet est obtenu. Dans certaines implémentations, des optimisations supplémentaires peuvent être appliquées, comme des procédures d'amélioration locale (2-opt, 3-opt).
Considérons un problème avec 5 villes (A, B, C, D, E) et la matrice de distances suivante:
| A | B | C | D | E | |
|---|---|---|---|---|---|
| A | 0 | 12 | 19 | 8 | 15 |
| B | 12 | 0 | 7 | 14 | 11 |
| C | 19 | 7 | 0 | 16 | 9 |
| D | 8 | 14 | 16 | 0 | 18 |
| E | 15 | 11 | 9 | 18 | 0 |
Nous commençons avec un sous-circuit initial A-D-A (les deux villes les plus proches). Ensuite, nous calculons le coût d'insertion pour chaque ville restante (B, C, E) à chaque position possible dans le circuit actuel.
Pour la ville B, le coût d'insertion entre A et D serait:
c_AB + c_BD - c_AD = 12 + 14 - 8 = 18
Et entre D et A:
c_DB + c_BA - c_DA = 14 + 12 - 8 = 18
En procédant de manière similaire pour les villes C et E et en choisissant le coût minimal, nous construisons progressivement le circuit complet.
Voici un exemple d'implémentation de l'algorithme de Cheapest Insertion en Python :
def cheapest_insertion(distances):
n = len(distances)
# Commencer avec un sous-circuit de deux villes
# Trouver les deux villes les plus proches
min_dist = float('inf')
start_i, start_j = 0, 0
for i in range(n):
for j in range(i+1, n):
if distances[i][j] < min_dist:
min_dist = distances[i][j]
start_i, start_j = i, j
# Initialiser le tour avec ces deux villes
tour = [start_i, start_j, start_i]
unvisited = set(range(n)) - {start_i, start_j}
# Insérer les villes restantes une par une
while unvisited:
best_cost = float('inf')
best_city = None
best_position = None
# Pour chaque ville non visitée
for k in unvisited:
# Pour chaque position possible dans le tour
for i in range(len(tour) - 1):
# Calculer le coût d'insertion
cost = distances[tour[i]][k] + distances[k][tour[i+1]] - distances[tour[i]][tour[i+1]]
if cost < best_cost:
best_cost = cost
best_city = k
best_position = i + 1
# Insérer la meilleure ville à la meilleure position
tour.insert(best_position, best_city)
unvisited.remove(best_city)
return tour, calculate_tour_length(tour, distances)
def calculate_tour_length(tour, distances):
return sum(distances[tour[i]][tour[i+1]] for i in range(len(tour)-1))
L'algorithme de Cheapest Insertion est l'une des nombreuses heuristiques développées pour résoudre le problème du voyageur de commerce. Voici comment il se compare à d'autres approches populaires :
Ce graphique radar compare l'algorithme de Cheapest Insertion à d'autres heuristiques populaires pour le TSP sur différents critères de performance. On peut voir que l'algorithme offre un excellent équilibre entre la qualité de solution, le temps d'exécution et la facilité d'implémentation.
L'algorithme de Cheapest Insertion est largement utilisé dans de nombreux domaines où l'optimisation d'itinéraires est cruciale :
Dans le secteur de la logistique, l'algorithme est utilisé pour optimiser les routes de livraison, réduisant ainsi les coûts opérationnels et l'empreinte carbone.
En milieu industriel, l'algorithme peut être appliqué pour optimiser les séquences d'opérations sur des machines, minimisant les temps de configuration et maximisant la productivité.
Les services d'urgence peuvent utiliser cet algorithme pour déterminer les itinéraires les plus efficaces pour les véhicules d'intervention, réduisant les temps de réponse critiques.
Dans le domaine du tourisme, l'algorithme peut aider à planifier des itinéraires optimaux pour visiter plusieurs attractions, maximisant l'expérience du voyageur tout en minimisant les temps de déplacement.
La vidéo suivante propose une explication détaillée du fonctionnement de l'algorithme de Cheapest Link, qui est étroitement lié à l'algorithme de Cheapest Insertion:
Cette vidéo illustre étape par étape comment construire un circuit en utilisant l'algorithme de Cheapest Link, ce qui permet de mieux comprendre les principes sous-jacents également présents dans l'algorithme de Cheapest Insertion.
Au fil du temps, plusieurs variantes et améliorations de l'algorithme de base ont été développées pour répondre à des besoins spécifiques :
Cette variante considère non seulement le coût d'insertion minimal, mais aussi la différence entre le meilleur et le deuxième meilleur coût d'insertion pour chaque ville. Cela permet de prioriser l'insertion des villes qui auraient un coût beaucoup plus élevé si elles n'étaient pas insérées à leur meilleure position.
Cette version modifiée maintient une stabilité de calcul même pour un grand nombre de villes, ce qui la rend particulièrement adaptée aux problèmes de grande taille où les performances peuvent se dégrader avec l'algorithme standard.
L'algorithme est souvent combiné avec d'autres méthodes comme le 2-opt ou le 3-opt pour raffiner la solution obtenue. Ces techniques d'amélioration locale peuvent significativement augmenter la qualité de la solution finale.
Illustration de l'algorithme Cheapest Link, similaire au Cheapest Insertion
Exemple d'application de l'algorithme avec étapes détaillées