Aller au contenu


Didier

Inscrit(e) (le) 11 févr. 2017
Déconnecté Dernière activité août 08 2018 08:01
-----

#98043 Reconnaissance de carte en lego mindstorm

Posté par Didier - 31 juillet 2018 - 08:44

Bonsoir à tous.

 

Les cartes collent entre elles... Peut-être qu"en les "talquant" elles glisseraient mieux.

 

Didier.




#95485 Le problème du voyageur de commerce ( Javascript )

Posté par Didier - 16 mai 2018 - 07:50

Bonjour.

 

Merci pour les liens.

 

En fait j'ai codé le programme sans librairie externe car je voulais bien comprendre le mécanisme de ces algorithmes.

 

Didier.




#95478 Le problème du voyageur de commerce ( Javascript )

Posté par Didier - 15 mai 2018 - 09:29

 
Bonsoir à tous.
 
Il y a quelque temps, sur un autre fil de ce forum parlant d'intelligence artificielle, j'ai déposé 2 ou 3 fichiers/programmes utilisant un algorithme d'évolution génétique.
 
Mais après réflexion je me suis rendu compte qu'il n'était pas nécessaire d'utiliser un tel algorithme pour résoudre les problèmes posés. (Sinon juste pour comprendre comment fonctionne cet algorithme).
 
En effet, la solution de ces problèmes étant connue d'avance, il "suffirait" de la coder directement.
 
Il me fallait prendre un problème pour lequel il n'existe pas d'algorithme connu à ce jour permettant de trouver la solution exacte.
 
J'ai donc retenu le "problème du voyageur de commerce".
(Voir Wikipédia pour plus d'informations sur ce problème).
 
 
En résumé :
 
Pour un nombre de lieux X, déterminer un plus court chemin qui passe par chaque lieu une et une seule fois.
 
 
J'ai donc codé un programme écrit en HTML et Javascript (sans aucune librairie extérieure) qui, par plusieurs approches, tente de répondre au problème.
 
 
- L'approche mode Recherche par Force brute (ou recherche exhaustive) utilise un algorithme testant tous les circuits possibles.
 
Chaque circuit possible est évalué, si le circuit actuel est meilleur, il est conservé et défini comme étant le meilleur circuit puis on recommence avec le circuit suivant.
 
Cet algorithme se termine lorsque tous les circuits possibles ont été testés. Il permet de définir, à coup sûr, le meilleur circuit. Mais il peut mettre très,très longtemps pour arriver à son terme.
 
Compte tenu de "l'explosion" du nombre de circuits possibles en fonction du nombre de lieux, cet algorithme ne fonctionnera dans le fichier que pour 7 lieux au maximum. 
 
 
- L'approche mode Lieu proche utilise un algorithme glouton par insertion.
 
Pour chaque lieu, un circuit est construit pas à pas en y insérant de nouveaux lieux.
 
Le circuit est composé du lieu de départ et celui qui en est le plus proche.
 
Les étapes suivantes consistent à insérer un lieu supplémentaire dans le circuit de manière optimale, c'est-à-dire qu’elle augmente au minimum la longueur totale du circuit.
 
Cet algorithme se termine lorsque tous les lieux de départ et les lieux à parcourir ont été testés.
 
Si l’insertion d'un lieu dans un circuit est optimale et rapide à calculer la solution finale n’est pas nécessairement optimale.
 
 
- L'approche mode Algorithme d'évolution génétique.
 
Les algorithmes génétiques s’inspirent de la théorie de l’évolution des espèces.
 
Comme dans la vie, les espèces peuvent se reproduire pour créer de nouveaux individus, et leur ADN peut subir des mutations au cours de leur vie. De plus, comme dans la nature, plus un individu est "fort", plus il a de chance de se reproduire.
 
Les grandes étapes de l'algorithme :
 
-1- Création au hasard de la population initiale (génération 1).
-2- Evaluation des individus de cette population (calcul des circuits, des meilleurs individus, tri de la population).
-3- Sélection des meilleurs individus et de quelques individus moins bons.
-4- Création des nouveaux individus par croisements des individus sélectionnés.
-5- Mutation de certains de ces nouveaux individus.
-6- Validation de la nouvelle population pour la génération suivante et retour à l'étape 2.
 
Cet algorithme ne se termine jamais. (Mais les résultats obtenus se stabilisent à un niveau 'acceptables').
 
Il est impossible de savoir si le circuit sélectionné est le meilleur de tous les circuits possibles.
 
 
- L'approche mode Algorithme de colonie de fourmis.
 
Les algorithmes de colonie de fourmis s’inspirent du comportement d'une colonie de fourmis.
 
Les fourmis sont capables de sélectionner le plus court chemin pour aller du nid à une source de nourriture grâce au dépôts et au suivi de pistes de marqueurs appelés phéromones.
Les phéromones sont déposées par les fourmis sur leur chemin. les fourmis ont tendance à suivre le chemin le plus marqué.
Les phéromones s'évaporent mais au fil du temps les fourmis choisiront la piste la plus courte entre le nid et la nourriture.
 
Les grandes étapes de l'algorithme :
 
-1- Création de la population initiale : Chaque fourmi est déposée sur un lieu du circuit choisi au hasard.
-2- Les fourmis parcourent le circuit en choisissant l'ordre des lieux à parcourir selon la puissance du marquage ou la distance entre les lieux.
-3- Le circuit de chaque fourmi est évalué
-4- La fourmi ayant trouvé le chemin le plus court dépose ses phéromones.
-5- Les fourmis sont repositionnées à leur point de départ et retour à l'étape 2.
 
Cet algorithme ne se termine jamais. (Mais les résultats obtenus se stabilisent rapidement à un niveau 'acceptables').
 
Il est impossible de savoir si le circuit sélectionné est le meilleur de tous les circuits possibles.
 
 
Le plus difficile pour moi dans ce projet a été de déterminer les meilleures valeurs pour les variables déterminantes pour l'algorithme d'évolution génétique et celui de la colonie de fourmis.
 
Pour l'algorithme génétique :
- Nombre initial de voyageurs
- Nombre des meilleurs voyageurs à retenir pour la génération suivante
- Probabilité pour qu'un un peu moins bon voyageur soit tout de même retenu pour la génération suivante
- Probabilité de mutation et type de la mutation 
     Renversement d'une partie de l'ADN
     Permutation de 2 gènes
     Hasard
 
Pour l'algorithme de la colonie de fourmis
- Nombre initial de fourmis
- Valeur d'une dose de phéromones et taux d'évaporation
- Valeurs minimum et maximum du marquage pour un chemin entre deux lieux
- Seuils pour le choix des chemins à emprunter
     Selon le marquage
     Selon la distance
     Hasard
 
Mes différents tests m'ont également montré que pour le problème posé l'algorithme de la colonie de fourmi semble donner les meilleurs résultats en un nombre "raisonnable" d'itérations.
 
En codant ce programme en Javascript j'ai appris comment trier un tableau, comment trouver des doublons et/ou des manquants dans un tableau, permuter des données, utiliser les index et pleins d'autres choses.
(A noter, je n'ai pas trouvé sur le net de fichier écrit en pur javascript - cad sans librairie spécifique - traitant ce problème).
 
Je vous laisse tester par vous même si vous le souhaitez.
 
Voici en pièce joint le fichier livré "en l'état".
Le fichier est limité à 50 lieux maximum ( modifiable ) car au delà de cette limite mon ordinateur ( un peu ancien ) rame sérieusement.
 
Voili, voilà.
 
Didier.
 
 

Fichier(s) joint(s)




#92348 IA et Algorithme d'apprentissage

Posté par Didier - 08 février 2018 - 07:39

Bonjour à tous.

 

C'est un sujet qui m'interpelle.

 

J'ai consulté pas mal de sites pour en connaitre en peu plus sur les AI et consorts.

 

J'ai écrit 5 programmes en pur HTML/Javascript ( sans librairie complémentaires ) en essayant d'y inclure un maximum de commentaires.

( Ils ne sont probablement pas codés dans les règles de l'art mais ils fonctionnent comme je le souhaitais )

 

Je vous les propose ici en l'état :

 

_EvolutionGénétique

 

L'appli retrouve un message écrit.

 

Fichier joint  _EvolutionGénétique.html   12,53 Ko   71 téléchargement(s)

 

_EvolutionGénétique2

 

Les individus apprennent à sauter quand il le faut.

 

Fichier joint  _EvolutionGénétique2.html   26,44 Ko   77 téléchargement(s)

 

_EvolutionGénétique3

 

Un truc genre "Poissons/Nourriture/Requins" ou "Les Gentils petits nécureuils et leurs noisettes contre les méchants loups".

 

Fichier joint  _EvolutionGénétique3.html   40,97 Ko   86 téléchargement(s)

 

_RéseauNeuronal

 

Au fil des cycles l'appli obtient de plus en plus souvent le résultat attendu.

 

Fichier joint  _RéseauNeuronal.html   16,36 Ko   82 téléchargement(s)

 

_FourmiDeLangton

 

Ben... Une fourmi de Langton ( et son autoroute ).

 

Fichier joint  _FourmiDeLangton.html   7,09 Ko   65 téléchargement(s)

 

 

Voili, voilà

 

Didier.




#80514 Librairie pour traiter des phrases

Posté par Didier - 18 mars 2017 - 06:31

Bonjour à tous.

 

Voici ce que je propose en Python...

 

Code extrait et adapté du programme que j'utilise pour communiquer avec mon robot KRT1

 

Ca vaut ce que ça vaut et il existe certainement mieux mais ça fonctionne pas trop mal.

 

Didier.

(A bientôt, peut-être)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
# Test d'un chatbot
 
# Importation des librairies nécessaires et suffisantes
import random
import time
 
#import os      # Seulement si l'on veut utiliser le TTS...
               # OK avec Raspberry Pi > Linux Rasbian Pixel + Pico TTS
               # "Dé-commenter" les lignes #os.system("... 
 
# Initialisation des variables
 
    # Variables modifiables
 
LeNom = "Crétin"                                        # Nom du robot
 
    # Variables de réglages
 
ColA = "\x1b[1;32;40m"                                  # Couleur des messages d'actions : Vert
ColK = "\x1b[1;36;40m"                                  # Couleur des messages de KRT1 : Bleu
ColM = "\x1b[1;31;40m"                                  # Couleur de mes messages : Rouge
ColX = "\x1b[1;30;40m"                                  # Couleur des autres messages : Noir                        
 
FCol = "\x1b[0m"                                        # Fin de la coloration du message
 
    # Variables utilisées par le système ( NE PAS MODIFIER - Touche pas à ça p'tit con ! )
 
MessageEcrit = ""                                       # Message vide
MonMessage = ""                                         # Message vide
 
# Dictionnaire - Orthographe non respectée pour tenter de trouver un meilleur phrasé TTS...
 
ReponsesAleatoires = ["Comment ?",
    "Avant peut-être, mais ça cétait avant",
    "Bain voyons",
    "Sai quand même pas très clair tout ça",
    "Cet aussi mon avis et je le partage",
    "Et puis quoi encore ?",
    "Indubitablement",
    "Jallais dire exactement la même chose",           
    "Mais zencore ?",
    "Mais oui mais oui, moi aussi",
    "Mauvais choix, auto destruction dans 10, 9, 8, 7, boum, oupsss",
    "Plait-il ?",
    "Quoi ?",
    "Sacrebleu",
    "Saperlipopette",
    "Soyez un peu plus précis, jcomprends rien à cque vous dites",
    "Tiens donc",
    "Tout tà fait",           
    "Vous allez bien ?",
    "Haahaahaa, la grosse marave"] 
 
ReponsesPrevues = {"bonjou":"Bonjour à vous chef",
            
    # Les mots clés doivent être tronqués après le sixième caractère
                   
    # Les mots clés avec accent(s) ne fonctionnent pas toujours
    # correctement, il convient donc de les éviter
 
    # Actions - Penser à mettre à jour la fonction Actions()...
 
    # Actions sur mots reconnus type ORDRE : "action KRT1" ou "KRT1 action"
 
    "+avanc":"Ok chef",
        "+avant":"Ok chef",       
    "+recul":"OK chef",      
    "+stop":"OK chef, oufff, Une petite pause ça fait du bien",      
        "+top":"OK chef, oufff, Une petite pause ça fait du bien", 
    "+appro":"OK chef, jarrive chef",
        "+viens":"OK chef, jarrive chef",  
    "+repos":"OK chef, chef oui chef, merci chef",
        "+rompe":"OK chef, chef oui chef, merci chef",
 
    "+date":"La date...",
    "+heure":"L'heure...",
                   
    # Actions sur un seul mot reconnu
                   
    "bazoom":"Bazoum bazoum",
        "bazou":"Bazoum bazoum",
        "bazoum":"Bazoum bazoum",   
        "zumba":"Bazoum bazoum",
    "binouz":"Une petite bière ?",
    "star":"En route vers linfini et au dela",
        "trek":"En route vers linfini et au dela",
                   
    # Divers
                   
    "chocol":"Jpeux pas, jai pas dbras",
    "con":"Meunon, meunon",
    "connar":"Sai celui qui dit qui y est, tralalalalère",
    "demain":"Demain est un autre jour, alors on verra",
    "desser":"Moi je suis plutot fromage que dessert",
    "faim":"Quand sai quon mange ?",
    "froid":"Faut se bouger un peu aussi",
    "fromag":"Fromage ou dessert ? il faut choisir",
    "gueule":"Quoi ma gueule, caisse quel a ma gueule, ta pas vula tienne ?",
    "humour":"Auto destruction dans 5, 4, 3, 2, 1, boum",
    "merde":"Je savais bien que vous diriez ça à un moment ou un autre",
    "pain":"Le pain, jle met sur la table hou dans ta gueule ?",
    "prout":"Proute proute ma chère, je my attendais",
    "salut":"Je vous salut également, a qui aije lhonneur ?",
    "soif":"Sai lheure de lapéro ?",
    "voyage":"Moi jaime bien les voyages, sai quand quon va ou ?",
    "yes":"Pas danglais avec moi, déjà quils nous ont brulé la Janne",
    "you":"Pas danglais avec moi, déjà quils nous ont brulé la Janne",
    "zut":"O la boulette"}
 
# Les fonctions
 
def Dialoguer():
 
    global MonMessage
    global LeNom
    
    MonMessage = MessageEcrit
 
    print ColM + "Moi  - " + MonMessage + ColX 
 
    MonMessage = MonMessage.lower()
    LeNom = LeNom.lower()
 
    if MonMessage[0:len(LeNom)] == LeNom:
 
        MonMessage = "+" + MonMessage[len(LeNom)+1:len(MonMessage)]
 
    elif MonMessage[len(MonMessage)-len(LeNom):len(MonMessage)] == LeNom:
 
        MonMessage = "+" + MonMessage[0:len(MonMessage)-len(LeNom)-1]
 
    ReponseKRT1 = ChercherLaReponse(MonMessage)
 
    if ReponseKRT1:
 
        print ColK + "KRT1 - " + ReponseKRT1 + ColX
        #os.system("pico2wave -l fr-FR -w /dev/shm/krt1.wav " + "'" + ReponseKRT1 + "'")
        #os.system("omxplayer -o local /dev/shm/krt1.wav")
 
        # On va ensuite exécuter l'action demandée
        Actions()
 
    else:       
 
        ReponseChoisie = random.randint(1, len(ReponsesAleatoires))-1
        #os.system("pico2wave -l fr-FR -w /dev/shm/krt1.wav " + "'" + ReponsesAleatoires[ReponseChoisie] + "'")
        #os.system("omxplayer -o local /dev/shm/krt1.wav")
 
        print ColK + "KRT1 - " + ReponsesAleatoires[ReponseChoisie] + ColX       
        
        ReponsesAleatoires[ReponseChoisie] = ""
 
def ChercherLaReponse(MessageSaisi):
 
    global Mot
    
    MessageSaisi = MessageSaisi.lower()
    Mots = MessageSaisi.split()
    LesReponses = []
 
    for Mot in Mots:
 
        if len(Mot) >= 6:
            Mot = Mot[0:6]
 
        if Mot in ReponsesPrevues:
            UneReponse = ReponsesPrevues[Mot]
            LesReponses.append(UneReponse)
 
            print
            print ColA + "xxxxxxxxxxxxxxxxxxxx" + ColX
            print ColA + "Mot reconnu = " + Mot + ColX
            print ColA + "xxxxxxxxxxxxxxxxxxxx" + ColX
            print
    
    if LesReponses:
 
        ReponseChoisie = random.randint(1, len(LesReponses))-1
        return LesReponses[ReponseChoisie]
 
    return ""
 
def Actions(): # Penser à mettre à jour le dictionnaire...
 
    Action = Mot
 
    if len(Action) >= 6:
        Action = Action[0:6]
 
    # Actions sur mots reconnus type ORDRE : "action KRT1" ou "KRT1 action"
 
    if Action == "+avanc" or Action == "+avant":
        print ColK + "-> Exécution de l'action..."  + ColX
 
    elif Action == "+recul":
        print ColK + "-> Exécution de l'action..."  + ColX
         
    elif Action == "+stop" or Action == "+top":
        print ColK + "-> Exécution de l'action..."  + ColX
 
    elif (Action == "+appro" or Action == "+viens"):
        print ColK + "-> Exécution de l'action..."  + ColX
        
    elif (Action == "+repos" or Action == "+rompe"):        
        print ColK + "-> Exécution de l'action..."  + ColX
        
    elif Action == "+date":
        Maintenant = time.localtime(time.time())
        Date = "Nous sommes le " + time.strftime("%d/%m/%y") + ", chef"
        print ColK + "KRT1 - " + Date + ColX
        #os.system("pico2wave -l fr-FR -w /dev/shm/krt1.wav " + "'" + Date + "'")
        #os.system("omxplayer -o local /dev/shm/krt1.wav")
        
    elif Action == "+heure":
        Maintenant = time.localtime(time.time())
        Heure = "Il est " + time.strftime("%H") + " heure " + time.strftime("%M") + ", chef"
        print ColK + "KRT1 - " + Heure + ColX
        #os.system("pico2wave -l fr-FR -w /dev/shm/krt1.wav " + "'" + Heure + "'")
        #os.system("omxplayer -o local /dev/shm/krt1.wav")
       
    # Actions sur un seul mot reconnu
                     
    elif Action == "bazoom" or Action == "bazou" or Action == "bazoum" or Action == "zumba":
        print
        #os.system("omxplayer -o local static/BAZOOM.mp3")
    
    elif Action == "binouz":
        print
        #os.system("omxplayer -o local static/BIERE.mp3")

    elif Action == "star" or Action == "trek":
        print
        #os.system("omxplayer -o local static/STARTREK.mp3")


# En route...

while True :

    print ColA
    MessageEcrit = raw_input ("Ecrire le message... : ")
    print ColX
    
    Dialoguer()



#79086 Je vous présente KRT1

Posté par Didier - 11 février 2017 - 04:54

Bonjour à tous.
 
Je vous annonce la naissance de mon premier robot et vous présente :
 
KRT1 (Prononcez Crétin !).
 
KRT1 est capable d'avancer, reculer, tourner à droite ou à gauche et, bien sûr stopper.
 
En plus de ces instructions de déplacements KRT1 sait obéir à quelques ordres simples.
 
Pour communiquer avec KRT1 plusieurs méthodes sont possibles :
Par les touches de sa page Web associée.
Par écrit sur cette même page Web.
Par la voix (Il faut que KRT1 soit assez proche car il est un peu sourdingue).
 
KRT1 voit et peut montrer ce qu'il voit.
KRT1 écoute et parle, il peut dialoguer.
KRT1 écrit ce qu'il dit mais apparemment il est pour la réphorme de l'ortograffe.
KRT1 est mal coiffé.
KRT1 sait se promener seul sans se cogner systèmatiquement la tronche dans les murs.
KRT1 assume son nom (Il n'a pas eu le choix, je le lui est imposé).
KRT1 reconnait les couleurs rouge et jaune ainsi que les points de lumière.
KRT1 peut jouer à "Cherche la baballe !".
KRT1 n'a pas de cerveau positronique.
KRT1 aime le chocolat mais n'y a pas droit car il n'a pas de bras.
KRT1 approche de son maître pour peu que celui-ci porte un nez rouge de clown.
KRT1 aime la musique du générique de la série Star Trek.
KRT1 énerve ma femme (Vire moi ce truc), amuse ma petite fille (C'est 'ligolo' Papy) et effraie le chat (Miaou).
KRT1 n'est pas beau mais il ne faut pas le lui dire.
KRT1 et moi aimons la bonne bière (Surtout moi).
KRT1 connait les 3 lois de la robotique mais s'en cogne royalement.
KRT1 n'apprécie pas qu'on lui parle en anglais (Il est vrai qu'ils nous ont quand même brulé la Jeanne).
 
En général KRT1 est respectueux mais il peut parfois être désobéissant et/ou grossier.
 
KRT1 est encore et sera toujours en phase d'apprentissages et réglages. Je lui apprends régulièrement de
nouveaux mots avec les réponses/actions associées (Je souhaite quand même qu'un jour il se rende vraiment utile).
 
Bref, KRT1 est loin d'être parfait mais je commence à bien aimer ce p'tit con.
 
 
Ses caractéristiques physiques :
 
KRT1 pèse 985 grammes, il mesure 20 cm de haut 23 cm de long et 18 cm de large.
Son IMC est de 24,625 : il est en limite du surpoids...
 
Il est composé de :
1 chassis équipé de 2 roues motorisées alimentées par 4 piles de 1,5v et 1 roue folle-dingue.
1 Rapberry Pi 3 lui servant de cerveau (Alimenté par une batterie de recharge pour portable).
1 caméra pour Raspberry montée sur une articulation "pan-tilt et 2 servos"
1 microphone usb.
1 haut parleur branché sur Jacques.
2 capteurs d'ultra-sons.
3 leds.
1 buzzer.
Des breadboards, des résistances et autres machins/bidules électroniques, des jumpers.
Un bout de planche de récupération recoupée et percée par moi même avec mes mimines.
De la quincaillerie, des scratchs auto-collants, un peu de fil de nylon, une paille.
De la ficelle et du papier... Ah non, ça c'est pour des marionnettes.
 
 
Ses caractéristiques intellectuelles :
 
KRT1 fontionne sur un Raspberry Pi 3 avec un Linux Rasbian Pixel.
Le programme principal de KRT1 est écrit en Python.
 
Les installations complémentaires nécéssaires et suffisantes sont :
WEB.PY pour la communication.
VLC pour la diffusion du flux vidéo.
OpenCV pour la reconnaissance visuelle.
PyAudio pour la gestion du son.
Pico TTS pour parler.
Et SpeechRecognition STT pour la reconnaissance vocale (BING).
 
Fichiers créés par moi tout seul avec l'aide de multiples sites Internet.
'THE' fichier Python ( Environ 1200 lignes ).
Un fichier HTML comprenant un soupçon de JavaScript.
Un fichier CSS.
 
Et enfin, quelques fichiers musicaux pour le fun. 
 
 
Pour finir voici quelques photos de KRT1 et de son interface de communication :
 
KRT1-1.jpg
KRT1-2.jpg
KRT1-3.jpg
KRT1-4.jpg
KRT1-5.jpg
KRT1-6.jpg
 
Voili-Voilà... C'est tout pour le moment.
(Je vais tenter de me lancer dans d'autres réalisations).
 
 
Didier.
(A bientôt, peut-être)