La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

INTELLIGENCE ARTIFICIELLE

Présentations similaires


Présentation au sujet: "INTELLIGENCE ARTIFICIELLE"— Transcription de la présentation:

1 INTELLIGENCE ARTIFICIELLE
IAR-1001

2 Contenu du cours 3 Algorithmes de recherche locale Les jeux
Introduction Algorithme Hill-Climbing Algorithme Recuit Simulé (simulated annealing) Algorithme génétique Les jeux Formalisation Algorithme MiniMax Algorithme Alpha-Beta LECTURES: Chapitres 4 et 5 Russell & Norvig Notes de cours (site ftp UQTR)

3 Algorithmes de recherche locale
Introduction Dans certains problèmes (ex: problèmes de satisfaction de contraintes) nous ne sommes pas intéressés spécifiquement par le chemin reliant l’état initial à l’état but mais seulement à l’état but lui-même. Pour les problèmes de ce type, il existe une autre stratégie possible : générer les états successivement sans s’intéresser aux chemins jusqu’à ce que nous trouvions un état but. Cette idée est à la base des algorithmes de recherche locale, qui sacrifient la complétude pour gagner du temps et de la mémoire.

4 Algorithmes de recherche locale
Introduction Pour plusieurs problèmes, le chemin pour atteindre un but est secondaire. (ex: pour résoudre le problème des 8-reines ce qui compte c’est la configuration finale des 8 reines, pas l’ordre pour arriver à cette configuration). Plusieurs autres problèmes possèdent la même propriété générale dont le design de IC, disposition de machines en industrie, génération de sédule de travail, optimisation de réseaux de communication, routage de véhicules, gestion de porte-feuille.

5 Algorithmes de recherche locale
Introduction L’algorithme local le plus simple s’appelle la recherche locale gloutonne. L’algorithme commence avec un état choisi aléatoirement. Si l’état est un état but, la recherche se termine. Sinon les successeurs de ce nœud sont générés et leurs valeurs heuristiques. S’il n’existe pas de successeur avec une meilleure valeur que la valeur heuristique de l’état actuel, nous ne pouvons plus améliorer la situation, donc nous arrêtons la recherche. Sinon, nous choisissons l’état successeur ayant la meilleure valeur heuristique, et nous continuons ainsi.

6 Algorithmes de recherche locale
Introduction (a) (b) (a) Les états successeurs sont obtenus en changeant la position d’une reine dans sa colonne. Les valeurs heuristiques (le nombre de paires de reines qui s’attaquent) pour chaque état successeur sont encadrées. La meilleure valeur est 12, donc un des états ayant une valeur 12 est sélectionné comme étant le prochain état. (b) Cet état a une valeur heuristique de 1, mais tous ses successeurs ont des valeurs >= 2, donc la recherche locale gloutonne s’arrête sur cet état.

7 Algorithmes de recherche locale
Introduction L’avantage de la recherche locale gloutonne est qu’elle a une très faible consommation en mémoire ( que l’état actuel est en mémoire) et aussi en temps (ex: pour le problème des huit reines, l’algorithme termine après 4 étapes quand il trouve une solution et 3 étapes quand il est bloqué (en moyenne). L’inconvénient principal de la recherche locale gloutonne est son faible taux de succès qui résulte du fait que nous arrêtons la recherche si jamais nous ne pouvons plus améliorer directement la valeur heuristique. Pour le problème des huit reines, cet algorithme ne réussit que 14% du temps.

8 Algorithmes de recherche locale
Introduction Plusieurs améliorations sont possibles, dont permettre à l’algorithme de visiter les successeurs ayant la même valeur que l’état actuel (il faut mettre une borne sur le nombre de déplacements consécutifs de ce type pour ne pas tourner en boucle). Cette modification augmente significativement le taux de succès. Pour le problème des huit reines, avec au plus 100 déplacements consécutifs qui n’améliorent pas la valeur heuristique, le taux de succès passe de 14% à 94%.

9 Algorithmes de recherche locale
Introduction Une autre approche pourrait permettre de choisir un voisin aléatoirement (où la probabilité de sélectionner un état est défini en fonction de sa valeur heuristique). Finalement, nous pouvons tout simplement recommencer la recherche locale gloutonne à partir d’un autre état choisi au hasard, et continuer ainsi jusqu’à l’atteinte d’un état but. Cette technique s’avérant alors très efficace. La très faible complexité en espace des algorithmes locaux peuvent être utilisés pour résoudre des problèmes de taille importante qui ne peuvent pas être résolus avec des algorithmes classiques.

10 Algorithmes de recherche locale
Recherche locale: Algorithme Hill-Climbing Une recherche locale conserve que certains nœuds visités en mémoire. La recherche locale la plus simple est dites Hill-Climbing qui garde juste un nœud (le nœud courant) et l’améliore itérativement jusqu’à converger à une solution. Celles plus élaborées sont les algorithmes génétiques qui conservent un ensemble de nœuds (une population) qui est transformé jusqu’à l’obtention d’une solution. En général, une fonction objectif doit être optimisée (maximiser ou minimiser). Pour le hill-climbing, elle permet de trouver le prochain nœud à visiter. Pour les algorithmes génétiques, la fonction d’adaptation (fitness) favorise la création des nœuds successeurs.

11 Algorithmes de recherche locale
Recherche locale: Algorithme Hill-Climbing Une recherche locale ne garantie pas de solution optimale mais permet de trouver une solution acceptable rapidement Principe de recherche locale de Hill-Climbing

12 Algorithmes de recherche locale
Recherche locale: Algorithme Hill-Climbing

13 Algorithmes de recherche locale
Recherche locale: Algorithme Hill-Climbing (problème des 8 reines) n : configuration de l’échiquier avec N (8) reines fonction objectif à minimiser f(n): nombre de paires de reines qui s’attaquent mutuellement directement ou indirectement dans la configuration n f(n) (17) de cette configuration avec les valeurs de f(n) des successeurs encadrées

14 Algorithmes de recherche locale
Recherche locale: Algorithme Hill-Climbing (problème des 8 reines) Configuration n avec f(n) = 1 qui est un minimum local

15 Algorithmes de recherche locale
Recherche locale: Algorithme Recuit Simulé Pour expliquer le recuit simulé nous référons au concept de pente de descente (gradient descent) et en observant comment une balle de ping-pong peut se loger dans la plus grande crevace d’une surface cahoteuse. Si on laisse rouler la balle, elle pourrait se loger dans un minimum local. Si nous brassons Ia surface, la balle sortira de ce minimum local. Le recuit simulé commence en appliquant un brassage d’assez forte intensité (haute température) et en reduisant cette intensité (diminution de la température)

16 Algorithmes de recherche locale
Recherche locale: Algorithme Recuit Simulé // maximisation // next est mieux que current

17 Algorithmes de recherche locale
Recherche locale: Algorithme Recuit Simulé L’algorithme Simulated annealing minimise le risque de resté pris dans un minimun/maximum local. CEPENDANT, il est possible selon la forme de la fonction objectif (f(n)) que les successeurs générés par l’algorithme oscillent en pouvant revenir à des nœuds déjà visités. En enregistrant les nœuds visités comme dans l’approche A* nous pourrions éviter la situation précédente. MAIS, avec des espaces d’états volumineux il devient difficile de conserver tous ces états. L’algorithme de recherche tabou permet de conserver les k derniers nœuds générés, ce qui permet de réduire l’incidence des possibles oscillations.

18 Algorithmes de recherche locale
Recherche locale: Algorithme Recuit Simulé L’algorithme Simulated annealing minimise le risque de resté pris dans un minimun/maximum local. L’algorithme de recherche locale en faisceau (Local Beam) permet de conserver les k différents nœuds générés, ce qui permet aussi de réduire l’incidence des possibles oscillations. L’algorithme commence en sélectionnant aléatoirement k nœuds, ensuite, les successeurs de ces nœuds sont générés, les k meilleurs nœuds successeurs sont ensuite sélectionnés et sont à leur tour étendus. La variante stochastique de la recherche locale en faisceau choisie k successeurs aléatoirement, avec la probabilité de choisir un successeur donné étant une fonction croissante de sa valeur f(n) (fitness).

19 Algorithmes de recherche locale
Recherche locale: Algorithme Recuit Simulé Voir l’exemple de solution du TSP: EX-TSP-Recuit-Simule.py Trajet de 15 villes

20 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique L’algorithme de recherche génétique est une variante de la recherche stochastic beam dans laquelle les états successeurs sont générés en combinant (par croisement) deux états parents plutôt que de modifier un seul état . Cette analogie à la sélection naturelle est la même que celle exposée avec la stochastic beam sauf que la reproduction est sexuée plutôt qu’assexuée.

21 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique Comme avec la recherche en faisceau, GAs commence avec un ensemble de k états générés aléatoirement, ensemble appelé population. Chaque état, ou chaque individu, est représenté par une chaîne découlant d’un alphabet fini, souvent une chaîne de 0s et 1s (ex: un état du problème des 8-reines spécifiant la position (nombre de 1 à 8 codé en binaire sur 3 bits) de chacune des 8 reines, une par colonne, ce qui requiert 8× log2 8 = 24 bits). Alternativement, l’état pourrait être représenté directement par 8 chiffres de 1 à 8.

22 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique # de paires de reines ne s’attaquant pas: min 0, max = 8 * 7/2 = 28

23 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique La production de la prochaine génération d’états à partir d’une population initiale ((a)), chaque état étant évalué par une fonction objectif (fitness function). Cette fonction objectif doit retourner une valeur plus élevée pour les meilleurs états, pour le problème des 8-reines étant le nombre de paires de reines qui ne s’attaquent pas, valeur maximale de 28 pour une solution. Les valeurs des 4 états: 24, 23, 20, 11. Avec cette variante de GA, la probabilité d’être sélectionné pour la reprodution est directement proportionelle à la valeur du fitness score, pondération exprimée en %.

24 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique Deux paires sont sélectionnées ((c)) aléatoirement pour la reproduction, en accord avec leur probabilité. Notons qu’un individu est sélectionné 2 fois et un autre pas sélectionné du tout. Pour chaque paire à être appariée, un point de croisement est choisi (crossover point) aléatoirement. Des descendants sont créés ((d)) en échangeant les chaînes de leurs parents coupées à la ligne de coupure. Les états correspondants du problème des 8-reines impliqués dans ces étapes de reproduction.

25 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique Cet exemple démontre que quand 2 états parents sont très différents, l’opération de croisement peut produire un état très différent des états parents. C’est souvent le cas quand la population est très diversifiée au début du processus, les croisements (tout comme le recuit simulé) fréquemment font de grands changements ( E pour le recuit simulé) dans l’espace des états et de petits changements lors d’étapes plus tard dans le processus quand les individus sont similaires.

26 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique Opération de croisement =

27 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique Lors de l’opération de mutation ((e)), chaque position est sujette à une mutation aléatoire indépendante de faible probabilité. Un chiffre est muté aux positions 1, 3, 8. Ce qui correspond à choisir une reine au hasard et la déplacer à une position aussi choisie au hasard dans sa colonne.

28 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique // croisement

29 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique: Application au TSP (Voir l’exemple EX-TSP-GA.py) Précision sur le croisement

30 Algorithmes de recherche locale
Recherche locale: Algorithme Génétique: Application au TSP (Voir l’exemple EX-TSP-GA.py) Précision sur la mutation (swap mutation)

31 Les jeux Introduction Dans un environnement multi-agent dans lequel chaque agent doit considéré les actions des autres agents et comment ils modifient son propre état. L’aspect imprévisible de ces autres agents peut introduire un niveau de contingence dans le processus de résolution de problème. Ce type d’environnements compétitifs où les agents ont des buts pouvant être en conflit font surgir des problèmes de recherches adverses (appelée Jeux).

32 Les jeux Introduction Il existe de nombreux types de jeux avec des propriétés très différentes. En intelligence artificielle, les différentes classes de jeux se résument: Finis Déterministes à deux joueurs À tours alternés, À information complète À somme nulle

33 Les jeux Introduction Caractéristiques des jeux:
Fini: Si le jeu termine toujours (ex: aux échecs, les règles du jeu imposent des conditions pour rendre le jeu fini). Déterministe: Si le déroulement du jeu est entièrement déterminé par les choix des joueurs. Des jeux utilisant les dés (Monopoly, backgammon) ou des cartes distribuées au hasard (ex: poker ) sont non-déterministes. Information complète: Les joueurs connaissent parfaitement la configuration actuelle du jeu. Ce n’est pas le cas (ex: avec la plupart des jeux de cartes dont le poker) où les joueurs ne connaissent pas les cartes des autres. Ce sont des jeux à information partielle. Somme nulle: Si la valeur gagnée par l’un des joueurs est la valeur perdue par l’autre. Le poker est un exemple d’un jeu à somme nulle parce que le montant qui est gagné par un joueur est égal à la somme des montants perdus par les autres joueurs. Les jeux où il y a toujours un gagnant et un perdant sont des jeux à somme nulle.

34 Les jeux Formalisation:
État initial : C’est une configuration du jeu en plus du nom du joueur à jouer. Fonction de successeur: Cette fonction définit quelles actions sont possibles pour un joueur dans une configuration donnée, ainsi que les configurations résultantes des différentes actions. Test de terminaison (but): Ce test définit les configurations terminales du jeu. Fonction d’utilité: Cette fonction associe une valeur à chaque configuration terminale. Souvent, les valeurs sont +1, -1, et 0 qui correspondent à un gain pour le premier joueur, une perte pour le premier joueur, et un match nul (parfois +inf et −inf sont utilisées au lieu de +1 et −1).

35 Les jeux Formalisation:
Fonction d’utilité: Cette fonction associe une valeur à chaque configuration terminale. Souvent, les valeurs sont +1, -1, et 0 qui correspondent à un gain pour le premier joueur, une perte pour le premier joueur, et un match nul (parfois +inf et −inf sont utilisées au lieu de +1 et −1). Notez que comme nous ne considérons que les jeux à somme nulle, nous n’avons besoin que d’une seule valeur par configuration : la valeur attribuée au deuxième joueur est exactement le négatif de la valeur reçue par le premier joueur. L’objectif du jeu pour un joueur est de maximiser son gain. Plus spécifiquement, le premier joueur veut que la valeur d’utilité de la configuration terminale du jeu soit la plus grande possible, et inversement, le deuxième joueur souhaite que cette valeur soit la plus petite possible (parce que lui obtient le négatif de cette valeur). Afin de pouvoir se rappeler de leurs objectifs respectifs, il est courant de nommer les deux joueurs par max et min.

36 Les jeux Formalisation (jeu de TIC TAC TOE)
Etat initial : La grille vide et le nom du joueur à jouer, X par exemple. Fonction de successeur: Quand c’est le tour de joueur X, il peut mettre un X dans une des cases vides de la grille. Même chose pour O. Test de terminaison: Une configuration est terminale s’il y a trois X (ou trois O ) sur une ligne, une colonne, ou une diagonale, ou si la grille est complète. Fonction d’utilité : Nous donnons une valeur de +1 à toute configuration terminale contenant trois X dans une ligne, colonne, ou diagonale (c’est X qui gagne), et -1 à toute configuration terminale avec trois O dans une même ligne, colonne, ou diagonale (c’est O qui gagne). Les autres configurations terminales ont pour valeur 0, puisqu’elles correspondent à un match nul.

37 Les jeux Formalisation (jeu de TIC TAC TOE)
Un jeu peut être représenté par un arbre de jeu, où les noeuds sont les configurations et les arcs les coups possibles. Les feuilles de l’arbre sont des configurations terminales, qui sont étiquetées par leurs valeurs d’utilité. Un noeud max correspond à max de jouer, et min dans le cas contraire. La racine de l’arbre correspond à la configuration initiale dans laquelle la grille est vide. Les fils de la racine correspondent aux neuf coups possibles pour le joueur max (qui joue les X). Chacun de ces noeuds possède 8 fils, qui correspondent aux différentes façons pour min de répondre, et ainsi suite. Trois des configurations terminales sont présentées : dans le premier, c’est min qui gagne (valeur d’utilité = -1), dans le deuxième, c’est un match nul (valeur 0), et dans le dernier, c’est une victoire pour max (valeur +1).

38 Les jeux Formalisation (jeu de TIC TAC TOE)

39 Les jeux Formalisation (jeu de TIC TAC TOE)
Les problèmes de recherche, nous donnent une solution, qui est une suite d’actions reliant l’état initial à l’état but. Pour les jeux, une suite de coups n’est pas suffisante pour jouer parce que nous ne savons pas quels seront les coups de l’adversaire. Il faut donc trouver une stratégie qui définit comment le joueur doit jouer dans toutes les évolutions possibles du jeu. Une stratégie consiste alors en un premier coup, puis un choix de coups pour chaque réponse possible de l’adversaire, puis un choix de coups pour les réponses à notre dernier coup, et ainsi suite. Une stratégie est optimale s’il n’existe pas d’autres stratégies qui donneraient un meilleur résultat contre un adversaire idéal

40 Les jeux Algorithme MiniMax (jeu de TIC TAC TOE)
Une stratégie optimale peut être obtenue en examinant les valeurs minimax des noeuds de l’arbre de jeux. La valeur minimax d’un noeud donne la valeur d’utilité qui sera atteinte si chaque joueur joue de façon optimale à partir de la configuration de ce noeud. Pour calculer ces valeurs, on commence avec les configurations terminales, dont les valeurs minimax sont leurs valeurs d’utilité. Puis, on vérifie chaque noeud non-terminal en utilisant les valeurs minimax de ces fils. La valeur minimax d’un noeud max sera le maximum des valeurs minimax de ses fils, parce que le joueur max veut maximiser la valeur de la configuration terminale. Pour les noeuds min, c’est l’inverse : nous prenons le minimum des valeurs minimax de ses fils car le joueur min cherche à obtenir une valeur minimale pour la configuration terminale.

41 Les jeux Algorithme MiniMax Fonction MiniMax():

42 Les jeux Algorithme MiniMax Fonction MiniMax(): Exemple d’utilisation
La meilleure option de MAX est l’action a1 qui a la valeur MINIMAX maximale La meilleure option de MIN est l’action b1 qui a la valeur MINIMAX minimale

43 Les jeux Algorithme MiniMax Fonction MiniMax(): Exemple d’utilisation

44 Les jeux Algorithme MiniMax Fonction MiniMax(): Exemple d’utilisation

45 Les jeux Algorithme MiniMax Fonction MiniMax(): Algorithme

46 Les jeux Algorithme MiniMax Fonction MiniMax(): Algorithme
Pour un arbre avec un facteur de branchement de b (nombre d’actions possibles, nombres d’options possibles et une profondeur p (nombre de coups possibles), l’algorithme MINIMAX a une complexité spatiale de O(p * b) (il y a au plus p * b nœuds stockés en mémoire en même temps) mais une complexité temporelle de O(bp). Il faut donc visiter tous les noeuds de l’arbre.

47 Les jeux Algorithme MiniMax Fonction MiniMax(): Algorithme
L’algorithme minimax peut être généralisé au cas où il y a plus de 2 joueurs, il faut alors générer un vecteur d’utilités qui tient compte des utilités des différents joueurs. (A B C)

48 Les jeux Algorithme Alpha-Beta
L’algorithme minimax visite chaque noeud de l’arbre de jeu, mais est-ce vraiment nécessaire ? Dans le pire des cas, un parcours complet ne peut pas être évité, mais dans beaucoup d’autres cas, nous n’avons pas besoin d’examiner complètement l’arbre pour déterminer le meilleur coup.

49 Les jeux Algorithme Alpha-Beta
L’exemple précédent d’utilisation de l’algorithme MiniMax nous permet de constater qu’après avoir visité l’état h, nous savons déjà que max peut gagner depuis l’état e. Il aurait donc été possible d’attribuer la valeur de 1 au nœud e sans avoir à visiter le noeud i ni ses descendants. De plus, quand nous avons déterminé la valeur de c (1), il aurait aussi été possible d’éviter la visite de noeud d et ses successeurs parce qu’une stratégie gagnante pour max est déjà disponible.

50 Les jeux Algorithme Alpha-Beta
Avec les constatations précédentes il est alors possible d’éviter la visite de parties de l’arbre des possibilités de coups et ce en analysant judicieusement les valeurs d’utilité calculées. Donc en raisonnant sur ces valeurs d’utilité calculées, nous pouvons diminuer significativement le nombre de noeuds examinés, ce qui permettra d’élaguer (pruning) des branches de l’arbre.

51 Les jeux Algorithme Alpha-Beta

52 Les jeux Algorithme Alpha-Beta
Ces diverses constatations sont à la base de l’algorithme alpha-beta, qui est une version plus sophistiquée de l’algorithme MiniMax. L’algorithme alpha-beta calcule la valeur MiniMax d’un noeud sans nécessairement calculer les valeurs de tous ses descendants. Les deux variables  et  sont utilisées pour stocker les valeurs des meilleures options pour les joueurs max et min respectivement. Pour un noeud min n qui a un fils dont la valeur est pire (ou égale) à la valeur  (meilleure possibilité actuelle pour le joueur max), nous savons alors que max ne va (devrait) jamais choisir une action qui amène au noeud n : pouvant obtenir un meilleur résultat (au moins ) en choisissant un autre coup.

53 Les jeux Algorithme Alpha-Beta
D’autre part si nous visitons une noeud max n qui a un fils dont la valeur est supérieure à la valeur  (donnant la meilleure possibilité observée pour min), il est inutile de continuer à explorer cette branche car min ne choisira pas n de toute façon.

54 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) MAX
MIN

55 Les jeux Algorithme Alpha-Beta (exemple d’application des règles)
Bornes des valeurs MiniMax possibles (utilité atteignable) Estimation du pire que peut faire MAX Estimation du pire que min peut faire MIN

56 Les jeux Algorithme Alpha-Beta (exemple d’application des règles)

57 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) 3

58 Les jeux Algorithme Alpha-Beta (exemple d’application des règles)  3 3

59 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) [-,3]  3 3

60 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) [-,3]  3 3

61 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) [- ,+] [-,3] 3 3

62 Les jeux Algorithme Alpha-Beta (exemple d’application des règles) [3,+]  3 [-,3] 3 3

63 Les jeux  3 [3,+] [-,3] [3,+] 3 3
Algorithme Alpha-Beta (exemple d’application des règles)  3 [3,+] [-,3] [3,+] 3 3

64 Les jeux  3 [3,+]  2 [-,3] [3,+] 3 3
Algorithme Alpha-Beta (exemple d’application des règles)  3 [3,+]  2 [-,3] [3,+] 3 3

65 Les jeux  3 [3,+]  14  2 [-,3] [3,+] 3 [3,14] 3
Algorithme Alpha-Beta (exemple d’application des règles)  3 [3,+]  14  2 [-,3] [3,+] 3 [3,14] 3

66 Les jeux  3 [3,+]  5  2 [-,3] [3,+] 3 [3,5] 3
Algorithme Alpha-Beta (exemple d’application des règles)  3 [3,+]  5  2 [-,3] [3,+] 3 [3,5] 3

67 Les jeux 3 [3,+] 2  2 [-,3] [3,+] 3 [3,5] 3
Algorithme Alpha-Beta (exemple d’application des règles) 3 [3,+] 2  2 [-,3] [3,+] 3 [3,5] 3

68 Les jeux Algorithme Alpha-Beta

69 Les jeux Algorithme Alpha-Beta (Complexité)
Dans le pire cas, alpha-beta pruning ne fait aucun élagage; il examine donc bm nœuds terminaux comme l’algorithme minimax. Sachant que b est le nombre d’actions possibles et m le nombre de coups (profondeur de l’arbre). L’ordonnancement des actions à chaque nœud améliore l’efficacité de l’algorithme: Meilleur cas (ordonnancement parfait): O(b m/2) Cas moyen (ordonnancement aléatoire): O(b 3m/4)


Télécharger ppt "INTELLIGENCE ARTIFICIELLE"

Présentations similaires


Annonces Google