# Agent logiciel

En informatique, un agent ou agent logiciel (du latin agere : agir) est un logiciel qui agit de façon autonome. C'est un programme qui accomplit des tâches à la manière d'un automate et en fonction de ce que lui a demandé son auteur.
Dans le contexte d'Internet, les agents intelligents sont liés au Web sémantique, dans lequel ils sont utilisés pour faire à la place des humains les recherches et les corrélations entre les résultats de ces recherches. Ceci se fait en fonction de règles prédéfinies. Ils sont capables d'une certaine autonomie, en particulier de dialoguer entre eux.
Par exemple, l'agent intelligent d'une personne qui souhaite faire un achat sera capable de dialoguer avec les agents des vendeurs pour comparer prix, qualité et prestations.
Par ailleurs, l'étude des interactions entre agents, lorsqu'ils sont plusieurs, est le domaine spécifique des systèmes multi-agents, discipline de l'informatique apparue dans les années 1980.

## Les agents mobiles

La programmation par agents mobiles est un paradigme de programmation des applications réparties, susceptible de compléter ou de se substituer à d'autres paradigmes plus classiques tel le passage de messages, l'appel de procédure à distance, l'invocation d'objet à distance, l'évaluation à distance. Elle est d'un grand intérêt pour la mise en œuvre d'applications dont les performances varient en fonction de la disponibilité et de la qualité des services et des ressources, ainsi que du volume des données déplacées.
Le concept d'agent mobile facilite en effet la mise en œuvre d'applications dynamiquement adaptables, et il offre un cadre générique pour le développement des applications réparties sur des réseaux de grande taille qui recouvrent des domaines administratifs multiples.

### Principes et avantages

Un agent logiciel est une entité autonome capable de communiquer, disposant d'une connaissance partielle de ce qui l'entoure et d'un comportement privé, ainsi que d'une capacité d'exécution propre. Un agent agit pour le compte d'un tiers (un autre agent, un utilisateur) qu'il représente sans être obligatoirement connecté à celui-ci, réagit et interagit avec d'autres agents.
Un agent mobile peut se déplacer d'un site à un autre en cours d'exécution pour accéder à des données ou à des ressources. Il se déplace avec son code et ses données propres, mais aussi avec son état d'exécution. L'agent décide lui-même de manière autonome de ses mouvements. Ainsi, la mobilité est contrôlée par l'application elle-même, et non par le système d'exécution comme dans le cas de la migration de processus dans les systèmes opératoires.
En pratique, la mobilité d'agent permet de rapprocher client et serveur et en conséquence de réduire le nombre et le volume des interactions distantes (en les remplaçant par des interactions locales), de spécialiser des serveurs distants ou de déporter la charge de calcul d'un site à un autre.
Une application construite à base d'agents mobiles peut se redéployer dynamiquement suivant un plan préétabli ou en réaction à une situation particulière, afin par exemple d'améliorer la performance ou de satisfaire la tolérance aux pannes, de réduire le trafic sur le réseau, ou de suivre un composant matériel mobile. La mobilité du code offre un premier niveau de flexibilité aux applications.
La décentralisation de la connaissance et du contrôle à travers les agents, et la proximité physique entre les agents et les ressources du système renforce la réactivité et les capacités d'adaptation.
La mobilité ne se substitue pas aux capacités de communication des agents (la communication distante reste possible) mais les complète ; afin de satisfaire aux contraintes des réseaux de grande taille ou sans fil (latence, non permanence des liens de communication), les agents communiquent par messages asynchrones.

### Propriétés

Le déplacement d'une unité en cours d'exécution d'une machine à une autre se heurte aux problèmes d'hétérogénéité des matériels et des logiciels. Les intergiciels destinés au développement d'applications réparties à grande échelle doivent permettre de s'en abstraire. Par ailleurs, ils doivent fournir les mécanismes permettant le déplacement des agents et la communication entre agents. En particulier, la communication doit (a priori) être insensible aux déplacements des agents : les messages à destination ou provenant d'un agent doivent être acheminés indépendamment des mouvements de cet agent.
La capacité de capture et de restauration de l'état d'exécution d'un agent, appelée mobilité forte, est un point critique. La mobilité faible représente la capacité pour un système de déplacer le code des agents accompagné seulement de données d'initialisation (et non de l'état complet). En fait, c'est essentiellement un problème d'abstraction et d'expressivité, lié à la manipulation des processus qui exécutent les agents, qui est posé : dans les systèmes à mobilité faible, c'est au programmeur de gérer lui-même le mécanisme de reprise. Cette propriété est liée (et parfois confondue) avec la capacité de se déplacer à n'importe quel point de son exécution (mobilité anytime).
Un frein à l'utilisation réelle de cette technologie réside cependant dans les problèmes de sécurité qu'elle introduit. La mise en place d'une politique de sécurité peut demander, d'une part la protection des ressources et des données des machines hôtes (en limitant les droits d'accès et la consommation des ressources), et d'autre part, la préservation de l'intégrité et de la confidentialité des agents eux-mêmes et de leurs communications.
La large diffusion de l'environnement Java (et l'utilisation courante des applets) a contribué à l'intérêt porté aux agents mobiles, de par les nombreux avantages offerts (machine virtuelle, sérialisation, invocation de méthode à distance, gestionnaires de sécurité…). Java ne permet cependant pas la capture de l'état d'exécution des threads, et par conséquent, l'état dans lequel le calcul sera repris à distance doit être explicitement programmé, ce qui réduit l'expressivité : cette propriété est appelée mobilité faible (il existe des solutions Java non-standards fondées sur une modification de la machine virtuelle, un pré-traitement du code source ou encore une modification du bytecode).

## Exemples d'agents logiciels

* L'agent système : il fonctionne de façon continue en tâche de fond sur le bureau.
* L'agent utilisateur : l'interface utilisateur pour une application réseau sophistiquée. Par exemple, le navigateur Web pour accéder au World Wide Web.
* L'agent client : l'interface utilisateur pour une application sur un serveur comme un moteur de recherche ou pour traiter la recherche.
* Le robot d'indexation : un serveur basé sur programme qui scanne en permanence ou périodiquement le Web. Ce n'est pas vraiment un agent, car il n'agit pas au nom d'un humain mais il collecte des données qui peuvent être utilisées pour un large public d'utilisateurs.
* L'agent conversionnel : un programme interactif qui présente une interface conviviale et qui effectue des tâches spécifiques indiquées par un humain.
* L'agent intelligent : un programme qui exécute une tâche ou poursuit des objectifs spécifiques avec un minimum de direction, en utilisant des techniques heuristiques intelligentes. L'Intelligence artificielle n'a pas besoin d'être mobile, puisque la vaste gamme d'informations sur le Web peut être consultée à distance.
* L'agent mobile : un programme autonome qui migre entre les systèmes hôtes dans le processus de la poursuite d'un ou plusieurs objectifs.
* L'agent robot : un agent logiciel intelligent qui est mobile dans le monde réel.