
Le problème du voyageur de commerce ( Javascript )
#1
Posté 15 mai 2018 - 09:29
- Mike118, ashira, thermo_nono et 1 autre aiment ceci
#3
Posté 15 mai 2018 - 10:17

Maintenant, j'avoue, je suis flemmard. J'utilise ces lib pour aller plus vite. Si ça te fait envie.
http://underscorejs.org
https://lodash.com
https://caolan.github.io/async/
#5
Posté 16 mai 2018 - 10:49
Bonjour,
Sympa le sujet t intéressant.
Une petite remarque en passant:
Il me fallait prendre un problème pour lequel il n'existe pas d'algorithme connu à ce jour permettant de trouver la solution exacte.
C'est pas vraiment vrai
/* mode ressort ses cours d'algorithmique et complexité */
Cette classe de problème est appelée NP-complet, et on pense (mais personne ne l'a démontré jusqu'à présent) que ce types de problèmes n'a pas de solution qui fonctionne en temps polynomial, ie on ne connait pas à l'heure actuelle un algorithme en temps polynomial pour résoudre ce problème.
C'est une bien grande phrase pour dire qu'en gros plus on augmente les variables d'entrées du pb et plus la complexité augmente vite (pas en temps polynomial, ie pas avec une relation du type y = x^qqc + ....)
Le truc "marrant" c'est que si un jour, qqu trouve un algo en temps polynomial pour un seul de ces problèmes (le voyageur de commerce, le sac à dos, ...), alors tous ces problèmes NP-complets ont une solution en temps polynomial. Bref c'est le saint graal des chercheurs sur la complexité et algorithmique xD
Bref ça veut dire que souvent c'est problèmes qui sont facilement calculables pour une entrée pas trop grosse, dans ton cas avec pas trop de villes à visiter (mettons maxi 7 sur ton PC), mais le temps explose si on passe de 6 à 7 et après de 7 à 8 etc.
En reprenant le voyageur de commerce, le nombre de chemins à explorer est (en fonction de n, n étant le nombre de ville):
1/2 (n-1)!
(avec ! étant la factorielle)
ce qui nous donne pour n:
3 => 1
4 => 3
5 => 12
6 => 60
7 => 360
8 => 2 520
10 => 181 440
20 => 6,082 e16
30 => 4,421 e30
50 => 3,041 e62
75 => 1,240 e109
Bref on voit bien que ça grimpte vite...
Pour mieux situer, si un calcul prend mettons 1ns (1 milliardieme de seconde), pour 3 villes, la résolution prendra 1ns, pour 4, 3ns.
Mais pour 10 ce sera déjà 181 440 ns, soit environ 181 µs
pour 20 ce sera 6,082 e16 ns soit presque 61 milliards de secondes, ce qui est environ 46 ans...
pour 24, on approche l'âge de l'univers (ici plus de 9 milliards d'années)
pour 25, on dépasse et de beaucoup l'âge de l'univers (plus de 230 milliards d'années)
Bref même avec une puissance de calcul très (très très...) élevée, vouloir faire toutes les combinaisons de du problème du voyageur de commerce avec plus de 23 villes reste techniquement très très difficile voir impossible.
Edit: Par conte attention, ce que j'ai mis au dessus est valable si on veut vérifier tout et avoir l'ensembles des solutions, sur ce pb il me semble qu'il faille le faire puisqu'on ne connait pas la meilleure solution à atteindre (la longueur du chemin optimal), par contre pour certains problèmes du même type (donc NP complets) on connait la valeur optimum à trouver et la si c'est juste de l'optimisation, une seule solution est nécessaire ce qui peut réduire énormément les temps de calcul.
#6
Posté 16 mai 2018 - 01:29
Bonjour.
Ces explications sont très claires, merci.
j'aurais donc plutôt dû écrire :
Il me fallait prendre un problème pour lequel il n'existe pas d'algorithme connu à ce jour permettant de trouver la solution exacte dans un délai raisonnable.
Ceci dit, je me demandais dans qu'elle mesure on pouvait utiliser ce genre d'algorithme pour faire apprendre à un robot à marcher...
Exemple pour un quadrupède : Apprendre à se mettre debout, avancer, tourner > Calcul des angles de chaque articulation, timing des mouvements, ...
Didier.
#7
Posté 16 mai 2018 - 03:02
Oui mais bon c'était un peu pour chipoter, parce que c'est ce que tu avais dit un peu après en disant que la méthode "brute force" permet de trouver la solution optimale.
Et un point aussi, même un programme de complexité de temps polynomial peut être très très couteux en temps, si le nombre de variables d'entrée est élevé, ou si le polynome impliqué est très élevé (xbcp, genre x500) mais je connais pas d'algo polynomiaux ayant une complexité aussi élevée, après même un algo en o(n3) peut couter déjà très cher.
Je me souviens avoir fait des essais d'implémentation de calculs RSA sur une carte à puce (en Java Card), de mémoire nous avions implémenter cela avec une complexité en O(n3), c'est à dire que le temps était fonction du cube de la taille de l'entrée (et des patates mais avec une taille suffisament grande c'est le premier facteur du polynome qui est significatif).
Ben déjà la c'était beaucoup mais beaucoup trop mal optimisé (je sais pas si on pouvait faire beaucoup mieux, j'en suis pas sur) pour être exploitable même sur des clés de "petite" taille (par exemple 1024 bits), on avait des durées de calcul (estimées, on s'est pas amusé à tuer une carte pour ça ) à plus de 40h pour faire un pauvre diffie hellman (qui utilise l'équivalent d'un RSA, avec des clefs 1024bits de mémoire).
Bien sur c'est parce que dans notre cas une carte à puce est beaucoup beaucoup moins puissante qu'un PC, sur PC, cela ne prend même pas une seconde.
Pour apprendre à marcher, un algo génétique fonctionne, ya des vidéos sur YT (de mémoire) du résultat. pour le reste je sais pas si on peut appliquer.
#9
Posté 16 mai 2018 - 04:48
Il y a l'ouvrage de Nulentout qui décrit son expérience avec un petit quadrupède :
et là la présentation faites par jekert avec le même quadrupède.
sur la boutique tu as tout ce qu'il te faut pour réaliser le petit quadrupède de l'ouvrage :
convertisseur 5V7A
Interrupteur On Off
paire de cosse pour interrupteur ( 0,30€)
gaine thermo retractable 5mm
Câble
connecteur XT60
Batterie lipo 2S ( 10,80€ )
Chargeur de lipo
Alarme pour batterie
Tout est dispo en stock mais tout n'a pas encore été ajouté en fiche produit =)
( lipo 2S conseillé car plus léger que 3s et suffisant )
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#10
Posté 16 mai 2018 - 09:26
Re
Merci pour la nomenclature. La structure permettrait-elle de supporter un Raspi 3B ?
J'ai, rapidement, parcouru les liens concernant le quadrupède de Jekert...
Whaouu, bravo à lui. Je suis à des lieues de ce niveau ( et pas besoin d'un algo pour en calculer la distance exacte ).
Jusqu'à présent j'avais fait KRT1 ( un robot roulant ) mais contrairement à certain robot qui cherchent à grimper des escaliers
ce crétin à réussi à les descendre tout seul et très rapidement. Résultat des courses il est HS.
Didier.
#11
Posté 16 mai 2018 - 10:58
Je pense qu'en terme de poids ça devrait passer, mais en terme de dimension le quadrupède me paraît un peu petit...
ça pourrait peut être se monter avec quelques adaptation mécanique à imaginer ( de base c'est pas prévu de monter un Pi dessus) et il ressemblerait à une grosse tortue je pense... x)
Je suis curieux d'avoir les avis de Jekert et Nulentout sur le sujet.
Après sinon tu peux faire un quadrupède avec de MG995 ... On peut imprimer un châssis en 3D ...
Pas mal de choses peuvent se faire ...
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#12
Posté 17 mai 2018 - 08:15
C'est vrai que les livres de Nulentout (qui porte donc mal son nom) sont vraiment superbes.
Pour le reste (RSA, DH), c'était complétement hors sujet (RSA est un algorithme de cryptographie pour (dé)chiffrer des données, Diffie Hellman un algo pour se trnamettre des clefs secretes), juste pour illustrer le fait que même avec un problème qui ne soit pas si "compliuqé" suivant le cas d'usage c'est déjà trop.
O(n3), ça veut dire que le temps d'execution de l'algorithme est fonction du cube de son entrée, et mine de rien même au cube ça grimpe très vite .
Bref j'arrête le hors sujet et je réittère mes félicitations pour tes recherches et leurs implémentations en JS, c'est super de partager ce genre de choses, surotu avec les explications fournies.
Répondre à ce sujet

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users