Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Évitement d'obstacles à l'aide de l'intelligence artificielle

Composants et fournitures

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Capteur à ultrasons - HC-SR04 (Générique)
× 1
Drivers de moteur SparkFun Dual H-Bridge L298
× 1
Moteur à courant continu (générique)
MOTEURS CC 60 RPM
× 2
roues
× 4
Câbles de raccordement (générique)
× 1
Planche à pain à souder SparkFun - Mini
× 1
Batterie rechargeable, lithium-ion
Batterie lithium-ion 7,2 volts
× 1
Batterie 9V (générique)
× 1
Clip de batterie 9V
× 1
PCBWay Custom PCB
× 1
C&K Switches Commutateur série JS
× 1

Outils et machines nécessaires

Fer à souder (générique)
Fil à souder, sans plomb
Flux de soudure, soudure
Pompe à dessouder, Deluxe SOLDAPULLT®
Dénudeur et coupe-fil, 18-10 AWG / 0.75-4mm² Fils de capacité
Pistolet à colle chaude (générique)
Ruban double face

Applications et services en ligne

Arduino IDE

À propos de ce projet

OBSTACLE ÉVITER LE ROBOT À L'AIDE DE L'APPRENTISSAGE IA/RENFORCEMENT

Énoncé du problème : L'objectif principal est d'apprendre à éviter les obstacles dans « N » Épisodes et d'apprendre l'action optimale. Dans ce cas, supposons que nous ayons besoin de notre Robot pour apprendre l'action optimale en tant que « Droite ».

Algorithme de renforcement utilisé : Q apprentissage

Comment le L298N entraîne deux moteurs à courant continu :

Comment le capteur HC-SR04 calcule la distance :

Termes importants dans l'apprentissage par renforcement :

1. ÉTAT : C'est la situation dans laquelle se trouve le Robot. Ici, pour un robot de base évitant les obstacles, il y a au total 2 états …… Le 1er état est lorsqu'il n'y a pas d'obstacle à proximité et le 2ème état dans lequel il y a un obstacle devant lui. (Quand j'ai écrit le code, j'ai supposé 10 différents les états peuvent être dans lesquels attendu la même action. La raison pour laquelle j'ai fait cela pour illustrer un environnement plus complexe.)

2. ACTION : Dans un état particulier, le robot effectue une action particulière. Il y a 4 actions que le robot peut effectuer dans le 2ème état :« AVANT », « ARRIÈRE », « GAUCHE », « ARRÊTER ». Dans le 1er état, le robot peut effectuer 4 actions mais pour faciliter les choses, j'ai supposé que le robot ne peut effectuer qu'une seule action qui est « AVANT »( C'est parce qu'il est boiteux d'envisager des actions telles que GAUCHE ou EN ARRIÈRE lorsqu'il n'y a pas d'obstacles à proximité.

int ACTIONS =[0,1,2,3]

/* ICI :
0 =AVANT
1 =ARRIERE
2 =STOP
3 =DROIT*/

3. ÉTAT SUIVANT : Il s'agit de l'état dans lequel le robot entre lorsqu'il effectue une « ACTION » particulière dans son « ÉTAT ». actuel En obstacle évitant le boîtier du robot, l'ÉTAT SUIVANT peut être soit un "CRASHED" état ou un « SURVÉ » État. (Ici, l'état SURVIVE est le même que l'état de départ dans lequel se trouve le robot lorsque son épisode commence.)

/*APRÈS AVOIR EFFECTUÉ UNE ACTION LE ROBOT PASSE À L'ÉTAT SUIVANT DANS CE CAS D'OBSTACLE 
EN ÉVITANT LE ROBOT*/

int NEXT_STATE;
int STATE =0;
NEXT_STATE =STATE+1;

4. TABLEAU Q / MATRICE Q : Ce tableau est formé du Nombre d'« ÉTATS » et du Nombre d'« ACTIONS ». Dans le cas du robot d'évitement d'obstacles, ce tableau est donné par :

float Q[N_STATES][NUMBER_OF_ACTIONS] ={{0.0,0.0,0.0,0.0}, 
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0 ,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0},
{0.0,0.0,0.0,0.0 }} ;

Ici N_STATES =10 AND N_ACTIONS =4. ici "0.0" indique que toute action peut être effectuée à partir de l'une des 4 actions possibles. si vous souhaitez toutefois éliminer une particule action dans un état remplace simplement "0.0" par "-1.0" dans la matrice. "-1.0" indique que l'action ne peut pas être exécutée dans cet état. ici, on suppose que nous avons 10 états différents, chaque état attendant la même action. si vous voulez que votre robot apprenne des actions différentes dans chaque état, modifiez les récompenses à partir de la matrice de récompense dans le code

5. ÉTAT DU TERMINAL : C'est le dernier état dans lequel le robot peut se trouver. Pour le robot évitant les obstacles, cet état n'existe pas car nous n'avons pas d'état terminal et voulons que notre robot continue d'apprendre pour toujours.

6. MATRICE DE RÉCOMPENSE : Cette table ou matrice est utilisée pour récompenser le robot pour certaines actions. La récompense est positive ou négative selon la qualité de l'action.

int RÉCOMPENSES[ÉTATS][NUMBER_OF_ACTIONS] ={{-10,-2,-1,10}, 
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10},
{-10,-2,-1,10}} ;

7. ENVIRONNEMENT : Cela peut également être supposé ou considéré comme le monde du Robot. Par exemple, nous, les humains, vivons sur terre, donc fondamentalement, la terre est notre environnement.

Hyperparamètres dans l'apprentissage par renforcement :

1. TAUX D'APPRENTISSAGE (ALPHA) : Le taux d'apprentissage ou la taille du pas détermine dans quelle mesure les informations nouvellement acquises remplacent les anciennes. Un facteur de 0 fait que l'agent n'apprend rien (en exploitant exclusivement les connaissances antérieures), tandis qu'un facteur de 1 fait que l'agent ne considère que les informations les plus récentes (ignorant les connaissances antérieures pour explorer les possibilités). Dans des environnements entièrement déterministes, un taux d'apprentissage ALPHA =1,0 est optimal. Lorsque le problème est stochastique, l'algorithme converge sous certaines conditions techniques sur le taux d'apprentissage qui l'obligent à décroître jusqu'à zéro. En pratique, un taux d'apprentissage constant est souvent utilisé, tel que ALPHA =0,1 pour tous les scénarios.

float ALPHA =0.2 ; 

2. FACTEUR DE REMISE (GAMMA) : Le facteur de remise de 0 détermine l'importance des récompenses futures. Un facteur de 0 rendra l'agent « myope » (ou myope) en ne considérant que les récompenses actuelles, tandis qu'un facteur approchant 1 le poussera à rechercher une récompense élevée à long terme. Si le facteur de remise atteint ou dépasse 1, les valeurs d'action peuvent diverger. Pour GAMMA =1,0, sans état terminal, ou si l'agent n'en atteint jamais un, tous les historiques d'environnement deviennent infiniment longs, et les utilitaires avec des récompenses additives et non actualisées deviennent généralement infinis. Même avec un facteur de remise à peine inférieur à 1, Q l'apprentissage des fonctions conduit à la propagation d'erreurs et d'instabilités lorsque la fonction valeur est approchée avec un réseau de neurones artificiels. Dans ce cas, commencer avec un facteur de remise inférieur et l'augmenter jusqu'à sa valeur finale accélère l'apprentissage.

flotteur GAMMA =0.9 ; 

3. TAUX D'EXPLORATION (EPSILON) : Ce paramètre décide dans quelle mesure le robot doit explorer l'environnement. Explorer l'environnement signifie effectuer des actions aléatoires et analyser les résultats via les valeurs Q. Habituellement, dans Q Learning (contrairement à SARSA), nous nous débarrassons éventuellement de ce paramètre au fur et à mesure que Robot apprend de plus en plus. Mais dans ce projet, nous n'allons pas nous débarrasser d'Epsilon car nous n'avons pas d'état terminal. Dans ce cas, Epsilon réduira dans une certaine mesure, puis sera à nouveau réinitialisé lorsqu'il descendra en dessous d'une valeur seuil. Cela garantira que le robot continuera à explorer jusqu'à sa vie, tout comme nous, les humains.

flotteur EPSILON =0.75 ; 

ALGORITHME Q-LEARNING :

  • Initialisez le tableau des valeurs Q, Q(s, a) . J'ai initialisé ces valeurs à 0.0.
  • Observez l'état actuel, s .
  • Choisissez une action, une , pour cet état basé sur l'une des politiques de sélection d'action expliquées ici à la page précédente (📷-soft, 📷-greedy ou softmax).
/////////////////////////Politique gourmande d'Epsilon/////////////// ///////////////

PROB =RANDOM(EPSILON);
if (PROB<=EPSILON) //EXPLOREZ LES ACTIONS
{
ACTION =random(0,4) ;
DRAPEAU =2 ;
}
else //EXPLOITER LES ACTIONS DE LA TABLE Q
{
ACTION =ARGMAX(Q,ÉTAT);
DRAPEAU =2;
}
  • Passez à l'action et observez la récompense, r , ainsi que le nouvel état, s' .
  • Mettre à jour la valeur Q de l'état en utilisant la récompense observée et la récompense maximale possible pour l'état suivant. La mise à jour se fait selon la formule et les paramètres décrits ci-dessus.
  • Définissez l'état sur le nouvel état et répétez le processus jusqu'à ce qu'un état terminal soit atteint.
  • Pour comprendre le Q-learning mieux vaut visiter ce lien :https://towardsdatascience.com/a-beginners-guide-to-q-learning-c3e2a30a653c
//////////////////Mise en œuvre de la formule Q_Learning///////////////////// ////

Q_OLD =Q_TABLE[S][A];
Q_MAX =MAX(Q_TABLE, NEXT_S);
Q_NEW =(1-LEARNING_RATE)*Q_OLD + LEARNING_RATE*(R + DISCOUNT_FACTOR*Q_MAX);
Serial.print("Q VALUE :");
Serial.println(Q_NEW);
Q_TABLE[S][A] =Q_NEW;

Vidéo de travail :n'oubliez pas de regarder la vidéo de travail d'AI Robot :)


Code

  • Robot d'évitement d'obstacles utilisant Q-LEARNING
Robot d'évitement d'obstacles utilisant Q-LEARNINGC/C++
CECI EST LE CODE PRINCIPAL D'UN ROBOT D'ÉVITEMENT D'OBSTACLES BASÉ SUR L'INTELLIGENCE ARTIFICIELLE. le capteur est utilisé mesurer la distance de l'obstacle à l'aide de ses broches d'écho et de déclenchement.2.Lorsque la distance est mesurée et si elle est inférieure à 20 cm, il y a un obstacle à proximité, sinon le robot est en sécurité et continue vers l'avant.3.Si un obstacle est détecté, le robot prend tournez à gauche ou à droite en fonction de la situation.Comment fonctionne l'évitement d'obstacles basé sur l'IA ?(Apprentissage Q)1.Ici, la 1ère étape de l'article supérieur reste la même.Cependant, la 2ème étape est différente.2.Une liste des actions du robot sont initialisé en premier. Par exemple, dans ce cas, les actions du Robot sont :Gauche, Avant, Arrière, Arrêt. 3. Lorsque le Robot s'approche d'un obstacle, il doit effectuer une action. Cependant, notez que dans ce cas, Robot ne sait pas quelle action entreprendre car il n'est pas préprogrammé et va apprendre tout seul pour éviter les obstacles. 4. Lorsque Robot s'arrête lorsqu'il y a un obstacle devant lui, il reçoit une récompense car 0 Lorsque le Robot s'arrête et recule, il reçoit une récompense de -5 Lorsque le Robot continue d'avancer en ignorant les obstacles, il reçoit une récompense de -10 Lorsque le Robot se déplace juste à gauche dès qu'un obstacle est détecté, il obtient une récompense de +105. De cette façon, Robot apprend tout seul à éviter les obstacles grâce au mécanisme de récompense.*///////////PARAMETRES MATERIELS DU ROBOT///////////////////int TRIG_PIN =7;int ECHO_PIN =8;int durée;float distance;int M1 =13;int M2 =12;int M3 =11;int M4 =10;bool Obstacle =false;int FLAG;////////// ///////////////FINIR////////////////////////////////// //////////////////////////////Q PARAMETRES D'APPRENTISSAGE////////////// ///////////////////////////flotteur ALPHA =0,1 ; //TAUX D'APPRENTISSAGEfloat GAMMA =0.5; //FACTEUR DE REMISE flottant EPSILON =0.90 ; //PARAMETRES D'EXPLORATIONint REWARD ; //RÉCOMPENSE POUR L'EXÉCUTION D'UNE ACTIONint EPISODES =100;int STATE; // ETAT ACTUEL DE L'ACTION ROBOTint =0; //ACTION EFFECTUEE PAR LE ROBOT(0:AVANT,1:ARRIÈRE ,2;ARRÊT,3:GAUCHE)float PROB; //UTILISÉ POUR EPSILON DECAY bool ACTION_TAKEN =false; // CES VARIABLES NOUS INDIQUENT SI UNE ACTION EST PRISE OU NOTint NEXT_STATE; // ÉTAT SUIVANT DU ROBOTconst int ÉTATS =10; //NOMBRE D'ÉTATS DE L'ENVIRONNEMENT int ACTIONS[4] ={1,2,3,4};const int NUMBER_OF_ACTIONS =4; //TOTAL NOUS AVONS 4 ACTION AVANT, ARRIÈRE, GAUCHE ET ARRÊT/* C'EST LA MATRICE Q OU LA TABLE Q. C'EST FONDAMENTAL LE JOURNAL QUE LE ROBOT CONSULTERA AVANT D'EFFECTUER UNE ACTION. BASÉ SUR L'ACTION, LE ROBOT GAGNERA UNE RÉCOMPENSE ET LA VALEUR Q SERA MIS À JOUR DANS CE TABLEAU Q. ICI J'AI CONSIDÉRÉ 10 ÉTATS. J'AI PENSÉ TOUS LES ÉTATS SONT DIFFÉRENTS MÊME S'ILS SONT LES MÊMES. FONDAMENTALEMENT L'OBSTACLE ÉVITANT LE ROBOT NE CONTIENT QUE DEUX ÉTATS, c'est-à-dire : 1 : QUAND IL EST LOIN DE L'OBSTACLE 2 :QUAND IL EST PRÈS DE L'OBSTACLE, MAIS ICI POUR ILLUSTRER L'OBSTACLE PLUS COMPLEXE JE SUIS EN OBSTACLE 10 ÉTATS DIFFÉRENTS ICI S'ATTENDENT À UNE ACTION MÊME/DIFFÉRENTE.*/float Q[STATES][NUMBER_OF_ACTIONS] ={{0.0,0.0,0.0,0.0}, //LE PLUS IMPORTANT DE TOUS EST LA TABLE Q. {0.0,0.0,0.0,0.0}, //IL EST FORME PAR DES ETATS COMME SES LIGNES {0.0,0.0,0.0,0.0}, //ET DES COLONNES COMME SON NOMBRE D'ACTIONS {0.0,0.0,0.0,0.0}, / /INITIALISE A ZERO AU DEBUT {0.0,0.0,0.0,0.0}, // CELA SERA MIS A JOUR DANS LE FUTUR. {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}, {0.0,0.0,0.0,0.0}};/*CECI EST UNE MATRICE DE RÉCOMPENSES OU UN TABLEAU DE RÉCOMPENSES. CECI EST RESPONSABLE DE DONNER UNE RÉCOMPENSE AU ROBOT POUR EFFECTUER UNE ACTION PARTICULIÈRE. IL STOCKE LA RÉCOMPENSE POUR CHAQUE ACTION ENTREPRISE DANS L'ÉTAT. LA RÉCOMPENSE SERA POSITIVE SI L'ACTION EFFECTUÉE EST BONNE ET NÉGATIVE SI L'ACTION REND DE MAUVAIS RÉSULTATS.*/int REWARDS[STATES][NUMBER_OF_ACTIONS] ={{-10,-2,-1,10}, {-10,-2 ,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10, -2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {-10,-2,-1,10}, {- 10,-2,-1,10}} ; ////////////////////////////////////////////FINIR///// ////////////////////////////////////////////////////////////// ////////////PARAMETRES DE MISE A JOUR DE L'APPRENTISSAGE Q////////////float Q_OLD;float Q_NEW;float Q_MAX;//////////// ////////////END//////////////////////// void setup() { Serial.begin (9600 ); pinMode(TRIG_PIN,OUTPUT); pinMode(ECHO_PIN,ENTRÉE); pinMode (M1, SORTIE); pinMode(M2,SORTIE); pinMode(M3,SORTIE); pinMode (M4, SORTIE); randomSeed(analogRead(A0)); ÉTAT =0 ; Serial.println("LA FORMATION COMMENCERA DANS 5 SECONDES :"); délai (5000);} //////////////////////////FONCTIONS DU ROBOT////////////// ///////////////////void Forward(){ digitalWrite(M1,LOW); écriture numérique (M2, HAUT); écriture numérique (M3, FAIBLE); écriture numérique (M4, HAUT); }void Backward(){ digitalWrite(M1,HIGH); écriture numérique (M2, FAIBLE); écriture numérique (M3, HAUT); digitalWrite(M4,LOW);}void Left(){ digitalWrite(M1,HIGH); écriture numérique (M2, FAIBLE); écriture numérique (M3, FAIBLE); digitalWrite(M4,HIGH);}void Right(){ digitalWrite(M1,LOW); écriture numérique (M2, HAUT); écriture numérique (M3, HAUT); digitalWrite(M4,LOW);}void Stop(){ digitalWrite(M1,LOW); écriture numérique (M2, FAIBLE); écriture numérique (M3, FAIBLE); digitalWrite(M4,LOW);}bool Obstacle_Avoider(){ digitalWrite(TRIG_PIN, HIGH); délaiMicrosecondes(10) ; digitalWrite(TRIG_PIN, LOW); durée =pulseIn(ECHO_PIN ,HIGH); distance =(durée/2)/29.1 ; if(distance<15) { Obstacle =vrai; } if(distance>15) { Obstacle =false; } délai(10) ; retour Obstacle;}//////////////////////////////////////////FIN/ ////////////////////////////////////////////////////////////// //////////////////////////FONCTIONS D'APPRENTISSAGE DU ROBOT Q///////////////// /////////////////float RANDOM(float EXPLORATION_PARAMETER){ /*CETTE FONCTION TROUVE UN NOMBRE ALÉATOIRE QUI DÉCIDE SI UNE ACTION À PRENDRE EST ALÉATOIRE OU À PARTIR DE Q_TABLE*/ float RANDOM_VARIABLE ; flotteur PROBABILITÉ; RANDOM_VARIABLE =aléatoire(0,100); PROBABILITÉ =RANDOM_VARIABLE/100 ; return PROBABILITY;}float DECAY(float PARAMETER){ /*CETTE FONCTION EST UTILISEE POUR REDUIRE EPSILON(EXPLORATION PARAMETER) AVEC LE TEMPS.ENFIN A LA FIN VOUS OBTENEZ RID EPSILON ET LE ROBOT APPREND A EVITER LES OBSTACLES SEUL */ PARAMETRE =PARAMETER *0.98 ; //PARAMETRE VOICI LE PARAMETRE de retour EPSILON;}int GET_STATE(){ int STATE_NUMBER; STATE_NUMBER =aléatoire (0,10) ; return STATE_NUMBER;}float MAX(float Q_Table[][4],int NEXT_S){ /*CETTE FONCTION TROUVE LE PLUS GRAND NOMBRE DANS Q_TABLE[NEXT_STATE]. LE RLE PRINCIPAL DE CETTE FONCTION EST DE TROUVER Q_MAX PARAMETER*/ float LIST[4] ; flotteur N1; flotteur N2; float MAX_VALUE=0.0 ; flottant DIFF ; for(int b =0; b<=3; b++) { LIST[b] =Q[NEXT_S][b]; } for(int j =0; j<=2; j++) { if(MAX_VALUE>LIST[j]) { N1 =MAX_VALUE; } else { N1 =LISTE[j]; } N2 =LISTE[j+1]; DIFF =N1-N2 ; if(DIFF> 0) { VALEUR_MAX =N1; } else { VALEUR_MAX =N2 ; } } return MAX_VALUE;}int ARGMAX(float Q_Table[][4],int S){ /*CETTE FONCTION TROUVE L'INDICE DE LA PLUS GRANDE VALEUR Q DANS Q TABLE[STATE]*/ float ARRAY[4]; flotteur N1; flotteur N2; float MAX_VALUE =0.0 ; flottant DIFF ; nombre flottant; int MAX_INDEX ; for(int u=0; u<=3; u++) { ARRAY[u] =Q_Table[S][u]; } for(int p =0; p<=2; p++) { if(MAX_VALUE>ARRAY[p]) { N1 =MAX_VALUE; } else { N1 =TABLEAU[p]; } N2 =TABLEAU[p+1]; DIFF =N1-N2 ; if(DIFF> 0) { VALEUR_MAX =N1; } else { VALEUR_MAX =N2 ; } } for(int r =0; r<=3;r++) { NOMBRE =TABLEAU[r]; if(NUMBER ==MAX_VALUE) { MAX_INDEX =r; Pause; } } return MAX_INDEX;}void Update(float Q_TABLE[][4] , int S, int NEXT_S, int A, int ACTIONS[], int R, float LEARNING_RATE, float DISCOUNT_FACTOR){ /*CETTE FONCTION MET À JOUR LA TABLE Q ET VALEURS Q. CETTE MISE À JOUR CONTINUE JUSQU'À LA FIN DE LA BOUCLE PRINCIPALE. À LA FIN DES ÉPISODES, LE TABLEAU Q EST REMPLI DE DIVERSES VALEURS. PLUS LES VALEURS SONT PLUS IMPORTANTES, PLUS L'ACTION A UNE GRANDE IMPORTANCE DANS CET ÉTAT PARTICULIER. "Q_OLD" EST L'ANCIENNE VALEUR QUE LA MATRICE Q A. C'EST LA VALEUR QUI EST FINALEMENT MISE A JOUR. Q_NEW EST LA NOUVELLE Q_VALUE QUI EST CALCULÉE PAR LA FORMULE D'APPRENTISSAGE Q. LA FORMULE D'APPRENTISSAGE Q UTILISÉE ICI EST BASÉE SUR L'ÉQUATION DE BELLMAN UTILISE UNE APPROCHE D'APPRENTISSAGE PAR DIFFÉRENCE TEMPORELLE. NEXT_S ); Q_NEW =(1-LEARNING_RATE)*Q_OLD + LEARNING_RATE*(R + DISCOUNT_FACTOR*Q_MAX); Serial.print("Q VALUE :"); Serial.println(Q_NEW); Q_TABLE[S][A] =Q_NEW; }///////////////////////////////////////////// ///////////FINIR////////////////////////////////////// ////////////////////////////////////////////////////////////// ///////////////DEBUT DE LA BOUCLE PRINCIPALE//////////////////////////// //////////////////boucle vide() { //////////////////////// ///////////////ENTRAÎNEMENT////////////////////////////////// ////////// for(int I =0; I

Schémas

obstacle_avoiding_robot_using_ai_DcoMCWIOFm.fzz

Processus de fabrication

  1. Arrow Electronics annonce une tournée d'expérience d'intelligence artificielle
  2. Un robot mobile avec un évitement d'obstacles basé sur la vision
  3. Bosch ajoute l'intelligence artificielle à l'industrie 4.0
  4. L'intelligence artificielle est-elle une fiction ou une mode ?
  5. L'intelligence artificielle reçoit un énorme coup de pouce Kubernetes
  6. L'intelligence artificielle joue un rôle majeur dans l'IoT
  7. Il est tôt pour l'intelligence artificielle dans la cybersécurité ICS
  8. L'intelligence artificielle prédit le comportement des systèmes quantiques
  9. Utiliser l'intelligence artificielle pour suivre la déforestation