Ce que j’aurais aimé savoir avant de développer un autorouter
(blog.autorouting.com)"Leçons essentielles pour créer l’automaticien de routage le plus rapide du monde"
Utiliser l’algorithme A* partout
- A* est l’algorithme le plus puissant et le plus flexible pour les problèmes de recherche
- Il peut être utilisé non seulement sur une simple grille 2D, mais aussi dans des problèmes très variés
- A* est une "recherche informée" qui explore en priorité les nœuds proches de la destination, plus rapidement et plus efficacement que BFS
- Dans le code existant, la plupart des usages de DFS ou BFS peuvent être remplacés par A*
- Pour améliorer les performances, on peut exécuter plusieurs instances de A* et allouer davantage de ressources aux configurations les plus performantes
L’algorithme compte plus que le langage de programmation
- Développer un autorouter en Javascript ne posait absolument aucun problème
- Le cœur de l’optimisation consiste à réduire le nombre d’itérations
- Plus que les performances du langage, l’important est de savoir "à quel point on peut concevoir rapidement un algorithme intelligent"
- Javascript est plus favorable à des algorithmes intelligents qu’à l’obsession de l’optimisation bas niveau
Le Spatial Hash Indexing est plus efficace que les structures en arbre
- Les structures de données arborescentes comme les quadtrees sont en général lentes
- Un Spatial Hash Index regroupe les objets spatialement proches en hachant leur position
- Les structures basées sur le hachage offrent des performances de recherche proches de O(1)
- Pour être efficace, il faut bien choisir la taille des cellules, ce qui n’est pas très difficile
Le partitionnement spatial et le cache sont 1000 fois plus importants que l’algorithme
- Même les cartes électroniques complexes présentent majoritairement des motifs répétitifs
- Comme dans le développement de jeux, mettre en cache des résultats précalculés peut améliorer radicalement les performances
- Les structures cacheables et le partitionnement spatial seront au cœur des futurs autorouters
- Le stockage devient rapidement moins cher, et quelques Go de cache peuvent déjà apporter un gros gain de performances
Sans visualisation, impossible de résoudre les problèmes
- Pour chaque problème, la première étape consistait à créer un outil de visualisation
- La visualisation a permis d’accélérer le débogage d’un facteur supérieur à 10
- Même de simples étapes algorithmiques, une fois visualisées, permettent d’identifier rapidement la cause d’un problème
Les outils de profiling de Javascript sont extrêmement utiles
- L’onglet Performance des outils de développement Chrome permet de voir le temps passé par portion de code
- Même sans framework supplémentaire, on peut facilement analyser Flame Chart, usage mémoire, etc.
- Ce sont des outils très précieux pour le débogage des performances
Éviter les fonctions récursives
- Les fonctions récursives sont généralement synchrones et difficiles à convertir vers A*
- Une implémentation itérative est plus rapide et facilite le suivi des nœuds visités
- Dans une fonction récursive, modifier l’état est difficile et inefficace
- Il vaut mieux écrire avec des boucles autant que possible
Mieux vaut éviter les algorithmes de Monte Carlo
- Les algorithmes fondés sur l’aléatoire sont non déterministes et difficiles à déboguer
- Des heuristiques spécialisées pour le domaine offrent toujours de meilleures performances
- Aucun concepteur de PCB ne trace des pistes au hasard → ce n’est pas une approche réaliste
- Cela peut néanmoins être utile au début pour se faire une intuition
Ancrer chaque étape de l’algorithme dans l’espace réel du problème
- Normaliser les sous-algorithmes par rapport à l’origine rend la compréhension du flux global plus difficile
- Visualiser les entrées et sorties de chaque étape permet d’identifier laquelle introduit une erreur
- Il est important de conserver un repère cohérent tout au long du déroulement de l’algorithme
Visualiser le processus itératif sous forme d’animation
- Cela permet de voir visuellement à quel point l’algorithme explore de manière inefficace
- L’animation est très efficace pour réduire le nombre d’itérations et améliorer l’efficacité
- Les situations problématiques deviennent faciles à repérer, par exemple une recherche coincée dans une boucle infinie
On peut se passer de grille grâce aux mathématiques d’intersection
- Utiliser des mathématiques vectorielles au lieu d’une grille est bien plus rapide
- Dans bien des cas, les opérations mathématiques sont plus rapides que les accès mémoire
- Grâce aux LLM, les mathématiques de détection d’intersection sont devenues faciles à implémenter
- L’usage inutile d’une grille est une source de baisse de performances
Mesurer la probabilité d’échec à chaque étape permet de prioriser les chances de résolution
- On peut estimer la probabilité d’échec pour chaque nœud de partitionnement spatial
- Les nœuds les plus susceptibles d’échouer à l’étape suivante peuvent alors être restructurés ou réexplorés en priorité
- La probabilité d’échec se mesure clairement et offre plus de potentiel d’amélioration que de simples heuristiques
- Augmenter la probabilité globale de résolution peut être plus efficace que viser uniquement l’optimisation
Weighted A* peut multiplier la vitesse par 100
- A* classique garantit le chemin optimal, mais il est lent
- Weighted A* explore de manière plus gloutonne et peut accélérer fortement l’exécution
- Il suffit de définir la pondération avec
f(n) = g(n) + w * h(n) - Même si l’optimalité en souffre légèrement, le problème peut être résolu bien plus vite
- C’est une technique souvent utilisée dans le développement de jeux et qui mérite d’être étudiée
1 commentaires
Commentaires sur Hacker News
Écarter trop vite la méthode de Monte-Carlo est une grosse erreur
Je suis plutôt dans le camp du « ne faites pas confiance aux auto-routeurs »
L’article mentionne un point important sur la visualisation et les effets de cache
Excellente discussion sur l’auto-routage
95 % de l’attention devrait porter sur la réduction du nombre d’itérations
Les QuadTree et les structures de données arborescentes en général sont très lents
Presque tout correspond aux heuristiques du développement de jeux
« indexation par hachage spatial > structures de données arborescentes » est pertinent dans ce domaine, mais ne doit pas être accepté comme une vérité universelle
Je me souviens des mots-clés appris à l’université
Pour quelqu’un qui n’est pas directement impliqué dans les problèmes spatiaux 2D/3D, la plus grande leçon est la valeur de la visualisation