Je travaille sur une bibliothèque d'algorithmes d'approximation open-source pour les graphes et les réseaux utilisant certains paquets populaires de python comme base. L'objectif principal est d'inclure des algorithmes d'approximation à jour pour les problèmes NP-Complets sur les graphes et les réseaux. La raison de ceci est 1) Je n'ai pas vu un bon paquet consolidé (moderne) qui couvre ceci et 2) ce serait un outil pédagogique agréable pour apprendre des algorithmes d'approximation sur des problèmes d'optimisation de NP-Hard.Algorithmes d'approximation de tests unitaires
En construisant cette bibliothèque, j'utilise des tests unitaires pour vérifier la santé mentale (comme le ferait tout bon développeur). Je suis quelque peu prudent au sujet de mes tests unitaires dans la mesure où, par leur nature même, les algorithmes d'approximation peuvent ne pas renvoyer la bonne solution. Actuellement, je résous à la main quelques petites instances, puis je m'assure que le résultat retourné correspond à cela, mais ce n'est pas souhaitable, ni évolutif au sens de l'implémentation. Quel serait le meilleur moyen d'obtenir des algorithmes d'approximation de test unitaire? Générer des instances aléatoires et s'assurer que les résultats retournés sont inférieurs à la limite garantie par l'algorithme? Cela semblerait avoir de faux positifs (le test a juste eu de la chance ce temps, pas garanti pour toutes les instances d'être en dessous de la limite).
Si vous générez des "instances aléatoires" pour les problèmes NP-complets, comment connaître la réponse réelle afin de tester les limites? À mon humble avis, vous devez toujours choisir soigneusement vos cas de test. Choisissez des cas que vous pouvez, en tant qu'homme, repérer la vraie réponse, mais cela peut ou peut ne pas s'avérer difficile pour, ou au moins exercer, l'algorithme d'approximation. De tels cas peuvent toujours être générés par programme afin d'être suffisamment grands pour être réalistes. Ils ne devraient pas être _random_. –
S'étendant sur le commentaire de @Ray Toal, il y a quelques types de problèmes difficiles qui sont faciles si vous avez généré le problème; par exemple, factoriser * pq * est difficile, sauf si vous connaissez déjà * p * et * q * parce que vous les avez générés. Un principe similaire peut-il être appliqué à vos problèmes graphiques/réseau? –
+1 Tom c'est exactement ce que je veux dire en générant par programmation des cas connus. J'hésite un peu à ajouter une réponse pour le moment parce que je ne suis pas une autorité dans ce domaine; peut-être quelqu'un peut venir par qui a de l'expérience ici. J'essayais juste de mettre un drapeau rouge autour du mot «aléatoire». –