Td corrigé Etude des caractéristiques d'un environnement de ... - Free pdf

Etude des caractéristiques d'un environnement de ... - Free

Mots Clés : Systèmes Multi-Agents, adaptation, émergence, systèmes complexes , .... Un système multi-agent pour la programmation émergente. 2.2. ...... Au fur et à mesure que je lançais des simulations, il me fallait corriger le code des agents  ...




part of the document



UNIVERSITé TOULOUSE III - PAUL SABATIER
U.F.R. Mathématiques, Informatique et Gestion.
THESE
Pour obtenir le grade de Docteur de l’université Toulouse III
Discipline : Informatique
Présentée et soutenue par
Jean-Pierre Georgé
Le 6 juillet 2004
Résolution de problèmes par émergence
Étude d'un Environnement de Programmation Émergente
JUry
Claudette Cayrol, Professeur, Université Paul Sabatier Présidente du jury,
François Charpillet, Directeur de recherche INRIA, Rapporteur,
Philippe Mathieu, Professeur, Université de Lille 1 Rapporteur,
Pierre Glize, Ingénieur CNRS Habilité, Directeur de thèse,
Marie-Pierre Gleizes, Maître de conférence, Université Paul Sabatier Co-encadrante,
Jean-Pierre Georgé
Résolution de problèmes par émergence
Étude d'un Environnement de Programmation Émergente
Directeur de thèse :
Pierre Glize, Ingénieur de recherche CNRS, HDR, IRIT
- Résumé -
Nous proposons la réalisation d'un Environnement de Programmation Emergente, permettant de concevoir des systèmes complexes adaptatifs afin de répondre au problème de complexité croissante de la programmation, au problème du dynamisme du système et de l'environnement, ainsi qu'à la méconnaissance du problème et de la solution. Pour cela, nous utilisons comme bases le concept de l'émergence et la technologie des systèmes multi-agents dont le fonctionnement repose sur des mécanismes d'Auto-organisation coopératifs conformes à la théorie AMAS (Adaptive Multi-Agent Systems).
L'objectif général est alors de réaliser un langage complet de programmation dans lequel chaque instruction est un agent autonome cherchant à être coopératif avec les autres agents du système, ainsi qu'avec l'environnement du système. En dotant ces agents-instructions de mécanismes d'Auto-organisation, nous obtenons un système capable de s'adapter continuellement à la tâche requise par le programmeur (i.e. de s'auto-programmer suivant les besoins). Le travail présenté dans ce document montre la faisabilité d'un tel concept en spécifiant, puis en soumettant à expérimentation, un noyau consacré à un sous-ensemble du calcul mathématique.
Parallèlement, cette approche par Emergence est généralisée à tout type de résolution de problèmes. Nous proposons une réflexion sur les caractéristiques particulières du problème de la programmation émergente en particulier et des problèmes traitables par auto-organisation en général. Nous définissons alors un cadre strict pour l'utilisation des mécanismes de réorganisation afin que ceux-ci permettent l'apparition de ce phénomène si particulier, l'émergence.
Mots Clés : Systèmes Multi-Agents, adaptation, émergence, systèmes complexes, auto-organisation, programmation, résolution de problèmes.

IRIT, Université Paul Sabatier, 118 route de Narbonne, 31062 Toulouse Cedex 4. Mes remerciements …


à Pierre Glize, Ingénieur CNRS Habilité rattaché à l'IRIT, mon directeur de thèse. Il n'y avait malheureusement que la place pour mon nom au milieu de la première page de ce document, mais je considère ce travail comme le fruit d'une réelle coopération et il t'appartient autant qu'à moi (c'est-à-dire pas du tout puisqu'il appartient désormais à la Science…). Dire que ce travail n'aurait pu aboutir sans toi ne décrit pas à sa juste valeur tout le temps que tu as consacré à ce travail, que tu m'as consacré. Tes conseils, tes idées et nos discussions (ainsi que ton humour) ont été un guide tout au long de ces années.

à Marie-Pierre Gleizes, Maître de Conférence à l'Université Paul Sabatier, ma co-encadrante. Parmi les souvenirs les plus fort au cours de ma thèse se trouvent indéniablement les nombreuses réunions à trois où l'intense échange d'idées nous faisait explorer des voies auxquelles nous n'aurions pu penser séparément, à l'image du monde de la recherche. Et c'est ce que tu as été pour moi pendant ces années à partager ton bureau : l'image de l'enseignant-chercheur, concrètement, au-delà de mon imaginaire d'étudiant. Plus que toute autre personne, tu m'as appris ce métier si particulier.

à Claudette Cayrol, Professeur à l'Université Paul Sabatier, présidente du jury. Je vous remercie d'avoir accepté spontanément de faire partie de mon jury, de l'avoir présidé consciencieusement et surtout d'avoir montré autant d'intérêt pour mon document de thèse.

à François Charpillet et Philippe Mathieu, respectivement Directeur de recherche INRIA à Nancy et Professeur à l'Université de Lille 1, rapporteurs. Quand l'Homme est jugé, il ne peut qu'espérer en l'honnêteté, l'intégrité et la compétence de ses juges. Je pense sincèrement n'avoir eu aucun souci à me faire quant aux miens et je vous en suis très reconnaissant. De plus, le réel intérêt scientifique que vous avez porté à mon travail, et ce malgré les délais contraignants que vous avez bien voulu accepter, a contribué à rasséréner cette période difficile pour tout doctorant.

à Jean-Luc Soubie, Ingénieur de recherche INRIA Habilité, rattaché à l'IRIT, mon ex-directeur de thèse pour raisons administratives. Plus que le fait d'avoir bien voulu être mon directeur sur le papier au début de ma thèse, c'est le regard sur la recherche au-delà de l'équipe que je voudrais évoquer ici. Tu m'as permis de mieux appréhender le dédale du monde de la recherche et ses coulisses (le "panier à crabes" ?) grâce à ton honnêteté et ta franchise.

à l'équipe SMAC et en particulier Gauthier Picard, Davy Capera, JeanPierre Mano, Carole Bernon, Valérie Camps, Christine Régis et André Machonin. Vous m'avez offert des conditions de travail et un environnement de tous les jours si appréciables. C'est cet ensemble de multiple petites choses que l'on remarque ou non, ces conseils et ces discussions, scientifiques et autres, qui ont fait que même en de périodes difficiles, mon lieu de travail est toujours resté agréable.

à mes amis David Fauthoux, David Chemouil, Ulrich Roissard, Vincent Labatut, Gauthier Picard et Davy Capera (pour ces deux dernier, oui, on peut être dans deux catégories à la fois, mélangeons donc le plaisir et le travail). On ne peut espérer atteindre une plénitude professionnelle sans l'équilibrer avec un épanouissement personnel. Et vous avez su, sciemment ou inconsciemment, constamment agir sur la balance, que ce soit d'un côté ou de l'autre (vous la relierez deux fois, celle-là…).

à ma famille, Gitti, Nico et Saskia, Oma und Opa. Ich weis dass ihr immer an meinem erfolg geklaubt habt und ihr habt mir die Möglichkeit geschenkt mein Traum zu realisieren. Eine bessere Familie hätte ich mir nicht wünschen können. Danke für alles.

à Émilie. Ce document te doit une bonne part de sa clarté et de sa qualité d'écriture. Les lecteurs apprécieront. Moi j'ai apprécié la façon dont tu as su te faire une place dans ma vie de doctorant surchargé d'activités pour finir par te rendre indispensable.
Sommaire (vue d'ensemble)
 TOC \o "1-2" \h \z \u 
 HYPERLINK \l "_Toc82229364" Introduction : Problématique et Programmation Émergente  PAGEREF _Toc82229364 \h 15
 HYPERLINK \l "_Toc82229365" 1. Problématique  PAGEREF _Toc82229365 \h 15
 HYPERLINK \l "_Toc82229366" 2. Description de l'idée de "programmation émergente"  PAGEREF _Toc82229366 \h 18
 HYPERLINK \l "_Toc82229367" 3. Généralisation : la résolution de problèmes par émergence  PAGEREF _Toc82229367 \h 20
 HYPERLINK \l "_Toc82229368" 4. Structure et contenu du document  PAGEREF _Toc82229368 \h 22
 HYPERLINK \l "_Toc82229369" Chapitre I. Le phénomène d'émergence et son utilisation  PAGEREF _Toc82229369 \h 27
 HYPERLINK \l "_Toc82229370" 1. Émergence  PAGEREF _Toc82229370 \h 27
 HYPERLINK \l "_Toc82229371" 2. Auto-organisation et systèmes multi-agents  PAGEREF _Toc82229371 \h 41
 HYPERLINK \l "_Toc82229372" 3. Techniques diverses  PAGEREF _Toc82229372 \h 52
 HYPERLINK \l "_Toc82229373" Chapitre II. Théorie AMAS Technologie AMAS  PAGEREF _Toc82229373 \h 73
 HYPERLINK \l "_Toc82229374" 1. Introduction aux travaux de l'équipe  PAGEREF _Toc82229374 \h 73
 HYPERLINK \l "_Toc82229375" 2. La théorie AMAS  PAGEREF _Toc82229375 \h 76
 HYPERLINK \l "_Toc82229376" 3. La Technologie AMAS  PAGEREF _Toc82229376 \h 81
 HYPERLINK \l "_Toc82229377" 4. Vers une distribution industrielle : la méthodologie ADELFE  PAGEREF _Toc82229377 \h 86
 HYPERLINK \l "_Toc82229378" 5. L'apport de mes travaux dans l'approche AMAS  PAGEREF _Toc82229378 \h 89
 HYPERLINK \l "_Toc82229379" 6. Étude et discussion de quelques applications AMAS  PAGEREF _Toc82229379 \h 92
 HYPERLINK \l "_Toc82229380" Chapitre III. EPE : Environnement de Programmation Émergente  PAGEREF _Toc82229380 \h 107
 HYPERLINK \l "_Toc82229381" 1. La programmation émergente : introduction et description détaillée  PAGEREF _Toc82229381 \h 107
 HYPERLINK \l "_Toc82229382" 2. Le "Toy Problem" de la Factorielle : un sous-problème représentatif  PAGEREF _Toc82229382 \h 124
 HYPERLINK \l "_Toc82229383" 3. Résultats expérimentaux et analyse des organisations  PAGEREF _Toc82229383 \h 153
 HYPERLINK \l "_Toc82229384" 4. Comportements d'auto-organisation coopératifs informés dans un système élémentaire  PAGEREF _Toc82229384 \h 171
 HYPERLINK \l "_Toc82229385" Chapitre IV. PE : implémentation  PAGEREF _Toc82229385 \h 191
 HYPERLINK \l "_Toc82229386" 1. Introduction  PAGEREF _Toc82229386 \h 191
 HYPERLINK \l "_Toc82229387" 2. Architecture  PAGEREF _Toc82229387 \h 196
 HYPERLINK \l "_Toc82229388" 3. Le logiciel EPE  PAGEREF _Toc82229388 \h 208
 HYPERLINK \l "_Toc82229389" Conclusion : Enseignements et Perspectives  PAGEREF _Toc82229389 \h 213
 HYPERLINK \l "_Toc82229390" 1. De l'Expérience aux Enseignements  PAGEREF _Toc82229390 \h 213
 HYPERLINK \l "_Toc82229391" 2. Perspectives  PAGEREF _Toc82229391 \h 218
 HYPERLINK \l "_Toc82229392" 3. Ma conclusion  PAGEREF _Toc82229392 \h 224
 HYPERLINK \l "_Toc82229393" Glossaire  PAGEREF _Toc82229393 \h 227
 HYPERLINK \l "_Toc82229394" Bibliographie  PAGEREF _Toc82229394 \h 231
 HYPERLINK \l "_Toc82229395" 1. Problématique  PAGEREF _Toc82229395 \h 231
 HYPERLINK \l "_Toc82229396" 2. Emergence  PAGEREF _Toc82229396 \h 232
 HYPERLINK \l "_Toc82229397" 3. Auto-organisation et systèmes multi-agents  PAGEREF _Toc82229397 \h 234
 HYPERLINK \l "_Toc82229398" 4. Techniques diverses  PAGEREF _Toc82229398 \h 237
 HYPERLINK \l "_Toc82229399" 5. Théorie AMAS – Technologie AMAS  PAGEREF _Toc82229399 \h 240
 HYPERLINK \l "_Toc82229400" 6. EPE et la Programmation Émergente  PAGEREF _Toc82229400 \h 242
 Sommaire (vue détaillée)
 TOC \o "1-3" \h \z \u 
 HYPERLINK \l "_Toc82229404" Introduction : Problématique et Programmation Émergente  PAGEREF _Toc82229404 \h 15
 HYPERLINK \l "_Toc82229405" 1. Problématique  PAGEREF _Toc82229405 \h 15
 HYPERLINK \l "_Toc82229406" 1.1. Les besoins futurs en informatique  PAGEREF _Toc82229406 \h 15
 HYPERLINK \l "_Toc82229407" 1.2. Des sources d’inspiration  PAGEREF _Toc82229407 \h 17
 HYPERLINK \l "_Toc82229408" 1.3. Synthèse  PAGEREF _Toc82229408 \h 17
 HYPERLINK \l "_Toc82229409" 2. Description de l'idée de "programmation émergente"  PAGEREF _Toc82229409 \h 18
 HYPERLINK \l "_Toc82229410" 2.1. Un système multi-agent pour la programmation émergente  PAGEREF _Toc82229410 \h 19
 HYPERLINK \l "_Toc82229411" 2.2. Un environnement de néo-programmation  PAGEREF _Toc82229411 \h 19
 HYPERLINK \l "_Toc82229412" 2.3. Le néo-système produit  PAGEREF _Toc82229412 \h 20
 HYPERLINK \l "_Toc82229413" 2.4. Ma contribution à la programmation émergente  PAGEREF _Toc82229413 \h 20
 HYPERLINK \l "_Toc82229414" 3. Généralisation : la résolution de problèmes par émergence  PAGEREF _Toc82229414 \h 20
 HYPERLINK \l "_Toc82229415" 3.1. La programmation émergente : un outil universel  PAGEREF _Toc82229415 \h 21
 HYPERLINK \l "_Toc82229416" 3.2. La résolution par émergence  PAGEREF _Toc82229416 \h 21
 HYPERLINK \l "_Toc82229417" 3.3. Ma contribution à la résolution de problèmes par émergence  PAGEREF _Toc82229417 \h 22
 HYPERLINK \l "_Toc82229418" 4. Structure et contenu du document  PAGEREF _Toc82229418 \h 22
 HYPERLINK \l "_Toc82229419" Chapitre I. Le phénomène d'émergence et son utilisation  PAGEREF _Toc82229419 \h 27
 HYPERLINK \l "_Toc82229420" 1. Émergence  PAGEREF _Toc82229420 \h 27
 HYPERLINK \l "_Toc82229421" 1.1. Historique et définition de l'émergence  PAGEREF _Toc82229421 \h 28
 HYPERLINK \l "_Toc82229422" 1.2. L’émergence en informatique  PAGEREF _Toc82229422 \h 32
 HYPERLINK \l "_Toc82229423" 1.3. Les domaines scientifiques connexes  PAGEREF _Toc82229423 \h 32
 HYPERLINK \l "_Toc82229424" 1.4. Nécessité/utilité du concept d'émergence  PAGEREF _Toc82229424 \h 33
 HYPERLINK \l "_Toc82229425" 1.5. Exemples de systèmes émergents  PAGEREF _Toc82229425 \h 35
 HYPERLINK \l "_Toc82229426" 2. Auto-organisation et systèmes multi-agents  PAGEREF _Toc82229426 \h 41
 HYPERLINK \l "_Toc82229427" 2.1. Auto-organisation : définition et contexte  PAGEREF _Toc82229427 \h 41
 HYPERLINK \l "_Toc82229428" 2.2. Auto-organisation, émergence et règles de comportement locales  PAGEREF _Toc82229428 \h 43
 HYPERLINK \l "_Toc82229429" 2.3. Auto-organisation dans les systèmes multi-agents  PAGEREF _Toc82229429 \h 46
 HYPERLINK \l "_Toc82229430" 3. Techniques diverses  PAGEREF _Toc82229430 \h 52
 HYPERLINK \l "_Toc82229431" 3.1. Introduction : la recherche dans les espaces d'états  PAGEREF _Toc82229431 \h 52
 HYPERLINK \l "_Toc82229432" 3.2. Calcul évolutionnaire et algorithmes génétiques  PAGEREF _Toc82229432 \h 54
 HYPERLINK \l "_Toc82229433" 3.3. Réseaux neuronaux "dynamiques"  PAGEREF _Toc82229433 \h 59
 HYPERLINK \l "_Toc82229434" 3.4. Algorithmes de colonies de fourmis et optimisation par essaims particulaires  PAGEREF _Toc82229434 \h 64
 HYPERLINK \l "_Toc82229435" 3.5. Autres techniques  PAGEREF _Toc82229435 \h 68
 HYPERLINK \l "_Toc82229436" Chapitre II. Théorie AMAS Technologie AMAS  PAGEREF _Toc82229436 \h 73
 HYPERLINK \l "_Toc82229437" 1. Introduction aux travaux de l'équipe  PAGEREF _Toc82229437 \h 73
 HYPERLINK \l "_Toc82229438" 1.1. Au sujet des systèmes multi-agents  PAGEREF _Toc82229438 \h 74
 HYPERLINK \l "_Toc82229439" 1.2. L'approche émergente comme fondement  PAGEREF _Toc82229439 \h 74
 HYPERLINK \l "_Toc82229440" 2. La théorie AMAS  PAGEREF _Toc82229440 \h 76
 HYPERLINK \l "_Toc82229441" 2.1. Théorème de l’adéquation fonctionnelle  PAGEREF _Toc82229441 \h 76
 HYPERLINK \l "_Toc82229442" 2.2. Adapter le système par ses parties  PAGEREF _Toc82229442 \h 79
 HYPERLINK \l "_Toc82229443" 3. La Technologie AMAS  PAGEREF _Toc82229443 \h 81
 HYPERLINK \l "_Toc82229444" 3.1. Les composantes d'un agent AMAS  PAGEREF _Toc82229444 \h 81
 HYPERLINK \l "_Toc82229445" 3.2. Les Situations Non Coopératives (SNC)  PAGEREF _Toc82229445 \h 82
 HYPERLINK \l "_Toc82229446" 3.3. L'algorithme de coopération  PAGEREF _Toc82229446 \h 83
 HYPERLINK \l "_Toc82229447" 4. Vers une distribution industrielle : la méthodologie ADELFE  PAGEREF _Toc82229447 \h 86
 HYPERLINK \l "_Toc82229448" 4.1. Contenu  PAGEREF _Toc82229448 \h 86
 HYPERLINK \l "_Toc82229449" 4.2. Visibilité internationale  PAGEREF _Toc82229449 \h 86
 HYPERLINK \l "_Toc82229450" 4.3. Distribution industrielle  PAGEREF _Toc82229450 \h 87
 HYPERLINK \l "_Toc82229451" 4.4. Living Design  PAGEREF _Toc82229451 \h 87
 HYPERLINK \l "_Toc82229452" 5. L'apport de mes travaux dans l'approche AMAS  PAGEREF _Toc82229452 \h 89
 HYPERLINK \l "_Toc82229453" 5.1. L'approche expérimentale indispensable  PAGEREF _Toc82229453 \h 89
 HYPERLINK \l "_Toc82229454" 5.2. L'approche expérimentale dans l'équipe  PAGEREF _Toc82229454 \h 90
 HYPERLINK \l "_Toc82229455" 5.3. Un pas plus loin : le problème de la programmation émergente  PAGEREF _Toc82229455 \h 91
 HYPERLINK \l "_Toc82229456" 6. Étude et discussion de quelques applications AMAS  PAGEREF _Toc82229456 \h 92
 HYPERLINK \l "_Toc82229457" 6.1. Eléments pour la classification de problèmes  PAGEREF _Toc82229457 \h 92
 HYPERLINK \l "_Toc82229458" 6.2. Quelques problèmes traités par la théorie AMAS  PAGEREF _Toc82229458 \h 97
 HYPERLINK \l "_Toc82229459" 6.3. Éléments caractéristiques de la programmation émergente  PAGEREF _Toc82229459 \h 102
 HYPERLINK \l "_Toc82229460" Chapitre III. EPE : Environnement de Programmation Émergente  PAGEREF _Toc82229460 \h 107
 HYPERLINK \l "_Toc82229461" 1. La programmation émergente : introduction et description détaillée  PAGEREF _Toc82229461 \h 107
 HYPERLINK \l "_Toc82229462" 1.1. L'idée de programmation émergente  PAGEREF _Toc82229462 \h 108
 HYPERLINK \l "_Toc82229463" 1.2. Travaux connexes  PAGEREF _Toc82229463 \h 109
 HYPERLINK \l "_Toc82229464" 1.3. EPE : Description  PAGEREF _Toc82229464 \h 112
 HYPERLINK \l "_Toc82229465" 1.4. Les difficultés  PAGEREF _Toc82229465 \h 122
 HYPERLINK \l "_Toc82229466" 2. Le "Toy Problem" de la Factorielle : un sous-problème représentatif  PAGEREF _Toc82229466 \h 124
 HYPERLINK \l "_Toc82229467" 2.1. Présentation  PAGEREF _Toc82229467 \h 124
 HYPERLINK \l "_Toc82229468" 2.2. Justification et avantages  PAGEREF _Toc82229468 \h 124
 HYPERLINK \l "_Toc82229469" 2.3. Description du sous-ensemble d’agents  PAGEREF _Toc82229469 \h 127
 HYPERLINK \l "_Toc82229470" 2.4. Fonctionnement  PAGEREF _Toc82229470 \h 130
 HYPERLINK \l "_Toc82229471" 3. Résultats expérimentaux et analyse des organisations  PAGEREF _Toc82229471 \h 153
 HYPERLINK \l "_Toc82229472" 3.1. Résultats expérimentaux et difficultés  PAGEREF _Toc82229472 \h 153
 HYPERLINK \l "_Toc82229473" 3.2. Analyse statistique des organisations  PAGEREF _Toc82229473 \h 159
 HYPERLINK \l "_Toc82229474" 3.3. Conclusion  PAGEREF _Toc82229474 \h 168
 HYPERLINK \l "_Toc82229475" 4. Comportements d'auto-organisation coopératifs informés dans un système élémentaire  PAGEREF _Toc82229475 \h 171
 HYPERLINK \l "_Toc82229476" 4.1. Utilité d'un système élémentaire  PAGEREF _Toc82229476 \h 171
 HYPERLINK \l "_Toc82229477" 4.2. Description du système élémentaire choisi  PAGEREF _Toc82229477 \h 173
 HYPERLINK \l "_Toc82229478" 4.3. Description de la stratégie d'auto-organisation informée  PAGEREF _Toc82229478 \h 175
 HYPERLINK \l "_Toc82229479" 4.4. Résultats expérimentaux  PAGEREF _Toc82229479 \h 184
 HYPERLINK \l "_Toc82229480" 4.5. Un premier pas de "Scaling up"  PAGEREF _Toc82229480 \h 186
 HYPERLINK \l "_Toc82229481" 4.6. Conclusion  PAGEREF _Toc82229481 \h 187
 HYPERLINK \l "_Toc82229482" Chapitre IV. PE : implémentation  PAGEREF _Toc82229482 \h 191
 HYPERLINK \l "_Toc82229483" 1. Introduction  PAGEREF _Toc82229483 \h 191
 HYPERLINK \l "_Toc82229484" 1.1. Quelques informations générales  PAGEREF _Toc82229484 \h 191
 HYPERLINK \l "_Toc82229485" 1.2. Le manque de plates-formes SMA réellement génériques  PAGEREF _Toc82229485 \h 192
 HYPERLINK \l "_Toc82229486" 1.3. La question de l'autonomie et de la simulation  PAGEREF _Toc82229486 \h 193
 HYPERLINK \l "_Toc82229487" 1.4. Des agents "simples" mais des comportements complexes  PAGEREF _Toc82229487 \h 195
 HYPERLINK \l "_Toc82229488" 2. Architecture  PAGEREF _Toc82229488 \h 196
 HYPERLINK \l "_Toc82229489" 2.1. Architecture générale  PAGEREF _Toc82229489 \h 196
 HYPERLINK \l "_Toc82229490" 2.2. Les types d'agents  PAGEREF _Toc82229490 \h 197
 HYPERLINK \l "_Toc82229491" 2.3. L'environnement du système  PAGEREF _Toc82229491 \h 198
 HYPERLINK \l "_Toc82229492" 2.4. La gestion d'accointances  PAGEREF _Toc82229492 \h 199
 HYPERLINK \l "_Toc82229493" 2.5. La communication  PAGEREF _Toc82229493 \h 199
 HYPERLINK \l "_Toc82229494" 2.6. La réorganisation  PAGEREF _Toc82229494 \h 204
 HYPERLINK \l "_Toc82229495" 2.7. L'interface graphique  PAGEREF _Toc82229495 \h 207
 HYPERLINK \l "_Toc82229496" 2.8. Les outils d'observation  PAGEREF _Toc82229496 \h 207
 HYPERLINK \l "_Toc82229497" 3. Le logiciel EPE  PAGEREF _Toc82229497 \h 208
 HYPERLINK \l "_Toc82229498" Conclusion : Enseignements et Perspectives  PAGEREF _Toc82229498 \h 213
 HYPERLINK \l "_Toc82229499" 1. De l'Expérience aux Enseignements  PAGEREF _Toc82229499 \h 213
 HYPERLINK \l "_Toc82229500" 1.1. Des difficultés imprévues  PAGEREF _Toc82229500 \h 213
 HYPERLINK \l "_Toc82229501" 1.2. Une classe particulière de problèmes  PAGEREF _Toc82229501 \h 214
 HYPERLINK \l "_Toc82229502" 1.3. La difficulté d'implémentation  PAGEREF _Toc82229502 \h 215
 HYPERLINK \l "_Toc82229503" 1.4. Les mécanismes d'auto-organisation, la coopération et les SNC  PAGEREF _Toc82229503 \h 216
 HYPERLINK \l "_Toc82229504" 1.5. Auto-organisation et émergence  PAGEREF _Toc82229504 \h 217
 HYPERLINK \l "_Toc82229505" 2. Perspectives  PAGEREF _Toc82229505 \h 218
 HYPERLINK \l "_Toc82229506" 2.1. Vers une généralisation à un langage complet  PAGEREF _Toc82229506 \h 219
 HYPERLINK \l "_Toc82229507" 2.2. Vers un environnement complet  PAGEREF _Toc82229507 \h 221
 HYPERLINK \l "_Toc82229508" 2.3. Des exemples réels  PAGEREF _Toc82229508 \h 222
 HYPERLINK \l "_Toc82229509" 3. Ma conclusion  PAGEREF _Toc82229509 \h 224
 HYPERLINK \l "_Toc82229510" Glossaire  PAGEREF _Toc82229510 \h 227
 HYPERLINK \l "_Toc82229511" Bibliographie  PAGEREF _Toc82229511 \h 231
 HYPERLINK \l "_Toc82229512" 1. Problématique  PAGEREF _Toc82229512 \h 231
 HYPERLINK \l "_Toc82229513" 2. Emergence  PAGEREF _Toc82229513 \h 232
 HYPERLINK \l "_Toc82229514" 3. Auto-organisation et systèmes multi-agents  PAGEREF _Toc82229514 \h 234
 HYPERLINK \l "_Toc82229515" 4. Techniques diverses  PAGEREF _Toc82229515 \h 237
 HYPERLINK \l "_Toc82229516" 5. Théorie AMAS – Technologie AMAS  PAGEREF _Toc82229516 \h 240
 HYPERLINK \l "_Toc82229517" 6. EPE et la Programmation Émergente  PAGEREF _Toc82229517 \h 242
 Introduction : Problématique et Programmation Émergente
Problématique
Depuis sa naissance dans les années cinquante, l’informatique est essentiellement basée sur des théories formelles issues des Mathématiques ou de la Logique. Si le développement de logiciels à partir de ce type d’approche a permis le succès actuel de l'informatique, nombre de personnes s’interrogent sur son devenir et sa pertinence pour pouvoir résoudre les problèmes informatiques auxquels cette discipline va devoir faire face dans les prochaines années.
Aussi, de nouvelles approches, techniques et théories, doivent être recherchées dès aujourd’hui afin de pouvoir répondre aux besoins logiciels de demain. De nombreux chercheurs explorent des frontières souvent inédites et assez éloignées des concepts habituellement abordés par les informaticiens. Dans l'équipe, nous avons choisi de nous intéresser à celle qui nous semble la plus encourageante : l’émergence.

Les besoins futurs en informatique
Depuis quelques années, l’utilisation de l’outil informatique s’est développée de manière spectaculaire et les approches classiques de conception d’applications se heurtent à de nombreuses difficultés. Les systèmes d’exploitation sont un bon exemple de logiciels extrêmement complexes qui ne sont jamais exempts de problèmes. L’approche généralement utilisée, par décomposition en modules, se révèle impuissante à garantir une absence de problèmes car les phases de conception tendent à devenir trop complexes pour les développeurs à cause du grand nombre de cas à traiter. D’autre part, l’utilisation désormais massive et incontournable des réseaux contribue à accroître les problèmes de conception, de stabilité et de maintenance des applications actuelles.
Cet état de fait intéresse nombre d’industriels, dont le géant du logiciel IBM qui écrit : “Even if we could somehow come up with enough skilled people, the complexity is growing beyond human ability to manage it. As computing evolves, the overlapping connections, dependencies, and interacting applications call for administrative decision-making and responses faster than any human can deliver. Pinpointing root causes of failures becomes more difficult, while finding ways of increasing system efficiency generates problems with more variables than any human can hope to solve. Without new approaches, things will only get worse. ” [Horn 01]. Selon IBM, la réponse est un challenge scientifique qu’ils nomment “autonomic computing”, dont l’objectif est de concevoir et de construire des systèmes informatiques capables de s’exécuter seuls, d’ajuster leur comportement face à des circonstances variées et de préparer leurs ressources pour gérer au mieux leur charge de travail.
Mark Weiser, du Xerox Parc, s’intéresse à un autre type de problématique. En remarquant que certaines technologies aussi simples que l’écriture ou l’électricité sont si communes que personne n’y prête plus attention, il introduit la notion d’ “informatique omniprésente” (“Ubiquitous Computing” ou "informatique diffuse" [Drogoul 01]) comme devenir de l’informatique : “The "UC" era will have lots of computers sharing each of us. Some of these computers will be the hundreds we may access in the course of a few minutes of Internet browsing. Others will be imbedded in walls, chairs, clothing, light switches, cars - in everything. UC is fundamentally characterized by the connection of things in the world with computation. This will take place at a many scales, including the microscopic" [Weiser 96].
Les futurs systèmes à développer sont donc caractérisés par :
Un grand nombre d’artefacts (logiciels, objets intelligents) en interaction;
Un nombre variable d’artefacts en cours de fonctionnement (système ouvert);
Un contrôle centralisé impossible à mettre en œuvre;
Un environnement évolutif;
Une tâche globale à réaliser.

Le défi est donc de trouver de nouvelles approches pour concevoir ces nouveaux systèmes informatiques, et cela en répondant aux difficultés existantes telles que la prise en compte d'une complexité croissante ou la réalisation de systèmes robustes et fiables. Pour découvrir une telle approche, il semble opportun de se pencher sur des systèmes naturels, physiques, sociologiques, afin de comprendre les mécanismes et processus qui leur permettent de fonctionner.

Des sources d’inspiration
En Physique et Chimie, les interactions entre des éléments simples donnent naissance à des structures complexes dotées de propriétés totalement nouvelles. Par exemple, l’eau composée d’atomes d’oxygène et d’hydrogène peut être considérée comme un phénomène émergent. La Thermodynamique est un exemple frappant de cet état de fait : alors que les molécules et leurs interactions sont parfaitement connues, nous sommes contraints de nous référer à des modèles de fluides ou de gaz de plus haut niveau, limités à des utilisations fortement contraintes. A l'image des processus physiques ou chimiques à l’échelle moléculaire ou atomique, nous pourrions développer des algorithmes permettant le passage d’un micro-niveau connu à un macro-niveau aux fonctionnalités beaucoup plus complexes.
En Biologie, de nombreux systèmes naturels composés d’individus autonomes exhibent des aptitudes à effectuer des tâches qualifiées de complexes sans contrôle global. De plus, ils peuvent s’adapter à leur milieu soit pour y survivre, soit pour améliorer le fonctionnement du collectif. C’est le cas des colonies d’insectes sociaux [Camazine 02] tels que les termites, fourmis [Bonabeau 97], ou araignées [Bourjot 99] qui font effectivement preuve de remarquables capacités pour effectuer des tâches telles que : la construction de nids complexes, la construction de pont, la recherche efficace de ressources, la capture de proies… L’étude des déplacements collectifs de vols d’oiseaux migrateurs ou de bancs de poissons montre également le fait que la tâche collective est le résultat des interactions des individus autonomes [Theraulaz 97]. Le fonctionnement du système immunitaire est lui aussi représentatif du fonctionnement d’un système complexe composé d’un ensemble d’agents autonomes.
Des phénomènes non supervisés et qui résultent de l’activité d’un grand nombre d’individus s’observent aussi dans les activités humaines, tels la synchronisation des applaudissements d’une foule ou la gestion des embouteillages. Mais s’il est un phénomène bien plus surprenant chez l’homme, c’est bien celui de l’apparition de la conscience. « La conscience est une propriété du cerveau de niveau supérieur (ou émergente) au sens tout à fait banal de "niveau supérieur" (ou d'"émergent") quand on dit que la solidité est une propriété émergente de niveau supérieur de molécules d'H2O lorsqu'elles sont dans une structure en treillis (glace), et que la liquidité est de même une propriété émergente de niveau supérieur de molécules de H2O lorsque, pour exprimer grossièrement les choses, elles roulent les unes sur les autres (eau) » [Searle 95].

Synthèse
Parmi tous ces systèmes étudiés, il est un facteur commun : la dimension émergente des comportements observés. Il paraît donc légitime d’étudier ce phénomène d'émergence afin de pouvoir en comprendre le fonctionnement ou au moins être capable de l’utiliser pour la conception de systèmes artificiels. Ceci pourrait permettre de construire des systèmes plus complexes, robustes, autonomes et adaptatifs dans les situations présentées dans la partie  REF _Ref9145233 \r \h  \* MERGEFORMAT 1.1. Ainsi, des phénomènes désirables similaires pourront survenir dans l’univers des systèmes artificiels. A contrario, si nous n’y prenons garde, ces phénomènes seront non seulement inattendus mais aussi indésirables. Pour y faire face, une orientation, selon nous, serait que la communauté scientifique étudie et élabore de nouvelles théories portant sur l’émergence. Nous pouvons résumer en quatre conditions l’existence d’une théorie de l’émergence :
Se situer dans le domaine de la théorie des systèmes,
Porter sur les parties du système,
Ne dépendre ni de la finalité du système ni de son environnement,
Etre indépendante du support matériel sur lequel elle pourrait s’incarner (biologique, technologique, …).

On peut noter que des travaux sont déjà en cours depuis des années mais restent très localisés. Par exemple, le Santa Fee Institute (www.santafe.edu) a acquis une renommée internationale grâce à ses travaux sur la complexité, les systèmes complexes adaptatifs, et donc l'émergence. Ce sont également les préoccupations de Exystence (www.complexityscience.org), le réseau d'excellence européen sur les systèmes complexes. Plus récent (mars 2002), ce réseau veut permettre la collaboration entre chercheurs européens intéressés par les systèmes complexes, des concepts fondamentaux aux applications.
Mais avant toute chose, il est nécessaire de bien comprendre le concept d'émergence si l'on veut se baser dessus pour élaborer des théories afin, finalement, de construire des systèmes artificiels à la hauteur de nos ambitions. Trop souvent le concept d'émergence a été utilisé de façon sinon abusive, en tout cas dans un contexte scientifique flou rendant sa compréhension et son utilisation difficile. Ce document donnera tout d'abord un cadre rigoureux sur lequel appuyer mes travaux.

Description de l'idée de "programmation émergente"
Dans son concept le plus général, la programmation émergente est l'assemblage d'instructions d'un langage de programmation via des mécanismes non explicitement informés du programme à créer. Si l'on considère que, pour un programmeur, produire un programme revient à trouver quelles instructions assembler, et dans quel ordre précis, alors il s'agit en fait de parcourir l'espace de recherche constitué par l'ensemble des programmes possibles jusqu'à obtenir le bon. Or si ce parcours est aisé quand le programmeur a une connaissance précise du programme qu'il souhaite obtenir, il devient de plus en plus difficile au fur et à mesure que la complexité du programme croît, ou que sa connaissance de la tâche à réaliser par le programme devient imprécise ou incomplète.
Ne sommes-nous pas alors capables de réaliser un système informatique effectuant le parcours dans l'espace des programmes possibles à la place du programmeur ?

Un système multi-agent pour la programmation émergente
Le problème est ici abordé concrètement par un système multi-agent adaptatif, basé sur les mécanismes d'auto-organisation coopératifs décrits par la théorie AMAS (Adaptive Multi-Agent System). Cette théorie en cours de développement par l'équipe de recherche au sein de laquelle s'est déroulée cette thèse (et à laquelle elle contribue) est décrite dans ce document et se présente comme un guide permettant de donner aux agents la capacité de se réorganiser afin de tendre à tout moment vers des interactions coopératives entre eux et avec l'environnement. Elle indique alors qu'un état coopératif pour l'intégralité du système implique l'adéquation fonctionnelle de ce système, i.e. qu'il produit un comportement qui satisfait les contraintes imposées par les parties du système, comme par l'environnement.
Dans ce contexte, nous définissons un agent comme une instruction du langage de programmation. En fonction du type de l'instruction qu'il représente, l'agent possède des compétences spécifiques qu'il va utiliser pour interagir avec d'autres agents-instructions. Un programme complet est alors représenté par une organisation donnée des agents-instructions au sein de laquelle chaque agent possède des partenaires dont il reçoit des données et à qui il en envoie. Le pendant de l'exécution d'un programme classique est ici l'activité du système multi-agent lors de l'échange de données entre agents.
Dès lors nous voyons apparaître toute la puissance de l'idée : une organisation donnée code un programme donné, et de fait, changer l'organisation modifie le programme final. Il s'agit alors pour les agents de se réorganiser en fonction des nécessités de l'environnement pour tendre à tout moment vers le programme adéquat, la fonction globale adéquate. Dans le principe, nous obtenons un système capable de parcourir l'espace des programmes possibles à la place du programmeur. Tout repose sur l'efficacité du parcours à atteindre l'organisation produisant la fonction adéquate.
Une partie importante de ce travail de thèse se concentre donc sur l'exploration des mécanismes d'auto-organisation qui permettent aux agents, en fonction de contraintes mais sans pour autant connaître l'organisation à atteindre (puisqu'inconnue, justement, pour les problèmes traités), de progresser vers elle.

Un environnement de néo-programmation
Le système ne peut se constituer ex nihilo, d'autant plus que nous voulons obtenir des fonctionnalités de haut niveau. A l'image du programmeur au travers de son environnement de programmation classique, le néo-programmeur influera sur le système en devenir, dans un premier temps, au travers d'un environnement de néo-programmation. Il s'agit simplement de lui fournir les outils lui permettant de modeler l'environnement du système multi-agent afin que cet environnement contraigne le système vers la fonction souhaitée. On peut alors considérer que le néo-programmeur sera lui-même l'environnement du système.
Mais l'environnement de néo-programmation aura certainement besoin d'être plus qu'une simple enveloppe pour le système en devenir. Il faudra certainement lui intégrer des outils d'observation de l'évolution du système, des moyens d'influencer cette évolution, d'influer sur les types d'agents, sur les proportions, sur certains aspects de la structure. De plus, un programme complexe peut généralement être vu comme un ensemble modulaire, et le néo-programmeur pourra être amené à vouloir influencer la structure modulaire du système, soit en manipulant des sortes de "briques", chacune étant constituée par un système de programmation émergente, soit en laissant ces "briques" s'auto-organiser à l'image de leurs constituants.

Le néo-système produit
Au final, nous obtiendrions un système capable non seulement de "trouver" le moyen de réaliser la fonction adéquate, mais également de s'adapter continuellement à l'environnement au sein duquel il est plongé, de répondre à la nature fortement dynamique et imprévisible des environnements réels, et tout ceci en présentant une grande robustesse. En effet, le système serait capable de changer à tout moment sa structure interne et donc la fonction produite, ou même se rajouter des instructions pour pallier une destruction partielle de son intégrité, ou pour se doter de nouvelles compétences.

Ma contribution à la programmation émergente
Le travail présenté dans ce document montre la faisabilité du concept de programmation émergente en spécifiant un noyau consacré à un sous-ensemble du calcul mathématique, puis en le soumettant à expérimentation. Pour cela, un environnement a été implémenté : EPE (Emergent Programming Environment ou Environnement de Programmation Emergente). Les expérimentations sont alors analysées et viennent enrichir les mécanismes d'auto-organisation des agents-instructions. La description détaillée de ces mécanismes qui permettent l'émergence de la fonction adéquate constitue une part importante de ce document.

Généralisation : la résolution de problèmes par émergence
En considérant une définition très générale pour la notion de "problème", nous pouvons envisager tout type de système informatique comme des systèmes chargés d'effectuer de la "résolution de problèmes". Bien évidemment, cette résolution peut alors prendre bien des formes, de simples programmes de calcul jusqu'à des programmes "intelligents" très complexes. L'idée générale est cependant la même : laisser faire au système informatique ce que l'humain ne veut pas ou ne peut pas faire, dans un temps donné ou dans l'absolu.
Plus le problème est considéré comme "difficile", plus nous aurons des difficultés à réaliser un système pour le résoudre. L'essence de mon travail de thèse se résumerait ainsi : la recherche de moyens pour repousser les limites de notre capacité à produire des systèmes de résolution de problèmes. Cette recherche s'est en fait déroulée sur deux plans relativement distincts, mais s'enrichissant mutuellement : d'une part, le concept de programmation émergente, et d'autre part, de façon plus générale, la résolution de problèmes par émergence.

La programmation émergente : un outil universel
Si nous produisons tous les agents nécessaires à la représentation d'un langage de programmation complet, et que ce langage est suffisamment riche, nous obtenons une expressivité maximale : tout type de programme réalisable avec les langages actuels. Dans son concept absolu, la programmation émergente pourrait alors résoudre tout type de problème, à partir du moment où celui-ci est résoluble par un système informatique. Evidemment, ceci semble bien irréaliste, du moins pour le moment.

La résolution par émergence
Mais si nous possédons certaines connaissances de plus haut niveau sur un problème, ou que celui-ci se structure à plus haut niveau que le niveau des instructions, alors il est plus efficace et plus facile de concevoir le système à ce niveau plutôt qu'à celui des instructions. Ceci concerne notamment les cas pour lesquels nous pouvons identifier des entités de plus forte granularité représentées alors par des agents ayant des compétences ou des comportements plus riches. Ou au contraire, les cas pour lesquels les agents auront des comportements plus simples et adaptés spécifiquement au problème traité.
Dès lors, nous pouvons appliquer les mécanismes d'auto-organisation de la programmation émergente à d'autres façons d'aborder des problèmes. En effet, les agents-instructions ont ceci de particulier qu'ils représentent des entités très génériques quant aux problèmes traités (une instruction a un comportement très éloigné du comportement du programme en entier), et le parcours de l'espace de recherche, pour des entités possédant plus d'informations ou plus de compétences quant au problème à traiter, ne peut qu'être plus facile. Et dans le pire des cas, nous pouvons toujours avoir recours à la programmation émergente pour produire le comportement des entités de plus haut niveau.
Considérons par exemple le problème de l'Informatique Diffuse (Pervasive Computing) : dans une pièce, un grand nombre d'appareils contrôlés chacun par une puce autonome ont pour but de satisfaire l'utilisateur y évoluant de jour en jour. Mais le but même, la satisfaction de l'utilisateur, est vague et incomplet, et le moyen d'y arriver l'est encore plus. Nous affirmons alors que ce problème est un candidat idéal pour la résolution par émergence : donnons aux entités les moyens de trouver elles-mêmes le comportement global du système afin de satisfaire l'utilisateur. Il s'agit alors de donner les bons comportements d'auto-organisation aux différents appareils de la pièce pour qu'ils puissent modifier leur façon d'interagir afin de prendre en compte les contraintes de chacun des appareils, et les stimuli (ordre, jugement, comportement) de l'utilisateur. Ces quelques explications très générales devrons être explicitées rigoureusement en tenant compte de la nature particulière des phénomènes émergents.

Ma contribution à la résolution de problèmes par émergence
Cette thèse présente en parallèle au problème de la conception d'un environnement de programmation émergente, l'étude plus générale du cadre et des mécanismes nécessaires à la résolution de problèmes par émergence. Ceci est réalisé concrètement tout d'abord par une étude détaillée de l'émergence et une définition consacrée à l'élaboration de systèmes artificiels. Je définis également des caractéristiques de problèmes permettant une catégorisation qui influe sur la façon dont ces problèmes peuvent être abordés en termes de mécanismes d'auto-organisation. Plus généralement, mes réflexions sur la résolution de problèmes par émergence sont étroitement liées à l'exploration du problème de programmation émergente et sont donc présentes tout au long de ce document.

Structure et contenu du document
Ce document se divise en six parties :
Introduction : le présent chapitre qui présente le contexte, la problématique et le travail de thèse.
Chapitre I : l'étude du phénomène d'émergence, du concept d'auto-organisation (en général, et dans les systèmes multi-agents en particulier), puis de diverses techniques en rapport avec ces notions (calcul évolutionnaire, réseaux neuronaux, algorithmes de colonies de fourmis, optimisation par essaims particulaires, …).
A travers cet état de l'art de différents domaines ayant trait à l'émergence, ce chapitre précise les conditions d'utilisation de mécanismes de réorganisation au sein de systèmes afin d'en faire des mécanismes d'auto-organisation permettant l'émergence de comportements désirés.
Chapitre II : la présentation de la théorie AMAS ainsi que de la technologie associée qui constituent un guide pour la conception de SMA basés sur des mécanismes d'auto-organisation coopératifs. Des applications développées dans l'équipe sont également présentées et leurs caractéristiques spécifiques comparées au problème de la programmation émergente. Ce problème apparaît alors comme représentatif d'une catégorie de problèmes particulièrement difficiles.
La théorie AMAS a été le support d'un certain nombre d'application répondant avec succès aux problèmes respectifs traités. Ainsi, le comportement des agents-instructions dans EPE (Emergent Programming Environment) a été exploré et spécifié tout au long de ce travail en accord avec la théorie. En retour, mon travail est venu enrichir notre compréhension de la théorie, et donc de sa présentation.
Chapitre III : la description détaillée du concept de programmation émergente tel qu'il est abordé dans ce travail, la spécification du noyau EPE, les expérimentations effectuées et leur analyse, ainsi que les divers mécanismes d'auto-organisation explorés.
Ce chapitre est en fait construit en corrélation avec la chronologie de mon travail de thèse, en partant du concept général jusqu'à la deuxième stratégie d'auto-organisation qui en est l'aboutissement. En effet, après avoir spécifié EPE pour un sous-ensemble du calcul mathématique sur les entiers et exploré une première stratégie, les expérimentations l'ont montrée inapte à permettre au système d'aboutir à la fonction souhaitée. Une étude de la topologie de l'espace de recherche pour un problème donné a alors conduit à l'élaboration de la deuxième stratégie.
Chapitre IV : l'architecture d'EPE et les considérations concernant son implémentation. J'insiste en particulier sur l'aspect modulaire qui permettra aisément d'enrichir cet environnement en vue des explorations futures de la programmation émergente.
Conclusion : le chapitre final analysant le travail effectué afin d'y puiser les enseignements permettant la considération de perspectives pour la continuation du présent travail.
En particulier, cette partie présente mes réflexions sur l'utilisation de mécanismes d'auto-organisation dans le cas de problèmes présentant des caractéristiques communes avec la programmation émergente. J'y présente également des agents-instructions supplémentaires qui permettent alors d'envisager l'extension d'EPE à un langage de programmation complet.

Le phénomène d'émergence et son utilisation
Ce chapitre poursuit les considérations de l'introduction quant à l'utilisation de l'émergence en étudiant en détail ce concept complexe afin de donner un cadre rigoureux à son utilisation. Il en ressort entre autres que le concept d'auto-organisation semble lui être rattaché de façon inhérente et présente un aspect plus concret en décrivant les mécanismes de fonctionnement des systèmes qui nous intéressent. Une seconde partie de ce chapitre lui est donc consacrée, insistant sur la mise en garde d'une utilisation abusive de cette notion. L'utilisation de l'émergence et de l'auto-organisation concerne d'ailleurs un certain nombre de techniques comme notamment les systèmes multi-agents, le calcul évolutionnaire, les réseaux neuronaux, les algorithmes de fourmis et l'optimisation par essaim particulaires. Ces techniques sont présentées et discutées dans la suite avec un regard critique concernant la notion d'émergence.

Émergence
Le concept d’émergence est explicité en détail dans la partie  REF _Ref41881770 \r \h  \* MERGEFORMAT 0, à travers un historique et des définitions. La manière de l’exploiter dans le domaine de l’informatique nécessite, à mon sens, un cadre rigoureux et restrictif qui est donné dans la partie  REF _Ref41881828 \r \h  \* MERGEFORMAT 1.2. La partie  REF _Ref41881908 \r \h  \* MERGEFORMAT 1.3 présente les domaines scientifiques connexes à l'émergence et montre que ce n'est pas une étude isolée, autant par les domaines qui lui ont donné naissance, que par les domaines qui font face à des préoccupations similaires. Dans la partie  REF _Ref41881997 \r \h  \* MERGEFORMAT 1.4, j'expose l'intérêt d'utiliser le concept d'émergence et comment les scientifiques l'utilisent, pour la compréhension de systèmes complexes d'une part, et pour l'élaboration de systèmes artificiels d'autre part. Enfin, la partie  REF _Ref41882134 \r \h  \* MERGEFORMAT 1.5 illustre l'émergence par des exemples variés de la nature (biologie, physique) et artificiels, afin d'enrichir la réflexion.


Historique et définition de l'émergence
Historique
Comme le résument Ali et Zimmer dans "The question concerning Emergence" [Ali 97], l'origine de l'émergence pourrait bien être le postulat datant de la Grèce antique : "le tout est plus que la somme de ses parties". On retrouve des traces du concept d'émergence et d'auto-organisation dans des écrits de Thalès et Anaximandre.
Dans le même ordre d'idées, Aristote parle du "tout avant les parties". Il réfère à l'explication admise de la précédence de l'entité représentant le tout par rapport aux parties sur lesquelles le tout est construit. Il se sert de cette notion pour expliquer certains phénomènes que l'on n'arrive pas à décomposer.
On retrouve bien plus tard la même idée dans les écrits de J. W. von Goethe (1749-1832
). Ce poète, philosophe et scientifique, élabore la théorie de la "Gestalt" (silhouette, forme) qui fait référence à une entité naturelle qui est le point final d'un développement à partir d'un chaos primordial.
Cependant le "tout avant les parties" de même que la "Gestalt" supposent qu'une entité cohérente est prédonnée alors que l'émergence est une construction dynamique apparaissant au cours du temps. Ainsi, il faut attendre le milieu du XIXe siècle pour voir apparaître un mouvement de pensée autour du concept de l'émergence [McLaughlin 80]. Ce mouvement sera plus tard appelé Proto-émergentisme et se poursuivra jusque dans les années 30. Ses débuts sont surtout caractérisés par la distinction que fait G. H. Lewes entre résultant et émergent [Lewes 75]. Ce philosophe anglais dont les travaux sont basés sur ceux de J. S. Mill, explique en 1875, que pour le résultant, la séquence d'étapes qui produisent un phénomène est traçable, alors que pour l'émergent, nous ne pouvons pas tracer les étapes du processus. Ainsi nous ne pouvons pas voir dans le produit le mode d'opération de chaque facteur. L'émergence ne peut pas être réduite ni à la somme ni à la différence des forces co-opérantes [Kim 00].
De nombreux philosophes, mathématiciens, biologistes et physiciens participent à ce courant de pensée. Ainsi, dans le cadre du proto-émergentisme on peut citer le "British emergentism" décrit ainsi par [Van de Vijver 97] : "[…] est le terme introduit par Brian McLaughlin pour caractériser une tradition qui commence au milieu du XIX siècle et qui connaît son apogée dans le premier quart de notre siècle. McLaughlin réfère, entre autres, aux travaux de John Stuart Mill, Alexander Bain, George Henry Lewes, Samuel Alexander, Lloyd Morgan et C.D. Broad". On peut également citer C.L. Morgan (éthologue), J.C Smuts, W. Wheeler (entomologiste) et Alfred North Whitehead (mathématicien) qui entre 1920 et 1930 contribuèrent à enrichir la notion d'émergence.
Les proto-émergentistes cherchaient surtout à définir l'émergence afin de reconnaître un phénomène émergent et le différencier de phénomènes explicables grâce à d'autres théories ou modèles. Ainsi, le processus d'émergence est vu comme une boîte noire. On ne peut discerner que les entrées de plus bas niveaux et les sorties de plus hauts niveaux. On ne sait pas comment les entrées sont transformées et reliées aux sorties (cf.  REF _Ref41722292 \h  \* MERGEFORMAT Figure 1).

Mais ce n'est que dans la deuxième moitié du XXe siècle que la science s'est dotée de moyens permettant d'explorer cette boîte noire. On peut appeler la recherche récente sur l'émergence le néo-émergentisme. Elle est liée à la théorie de la complexité actuelle et prend ses racines dans diverses approches comme la dynamique des systèmes en physique, en mathématiques et en informatique. Nous pouvons maintenant ouvrir la boîte noire grâce aux découvertes de constructions mathématiques pertinentes et de nouvelles méthodes de recherche ainsi que grâce à la puissance des ordinateurs actuels.
Le néo-émergentisme essaye de développer des outils, des méthodes et des constructions qui rendent le processus d'émergence moins opaque et par conséquent moins miraculeux. Pour cela, il se base, entre autre, sur :
la théorie des systèmes complexes adaptatifs (Santa Fe Institute : Holland, Kauffman, Langton). L'émergence fait référence aux patterns du macro niveau apparaissant dans les systèmes d'agents en interaction.
la théorie des systèmes dynamiques non linéaires issue de la théorie du chaos. Le travail porte en grande partie sur les attracteurs.
l'école synergétique fondée par Hermann Haken (1981) qui étudie l'auto-organisation dans les systèmes physiques.
la thermodynamique Loin et autour de l'Équilibre introduite par Ilya Prigogine. Les phénomènes émergents sont les structures dissipatives apparaissant à partir de conditions "loin de l'équilibre".

Définition
Plutôt que de prétendre donner une définition exacte et exhaustive de l'émergence, nous donnons, à partir de définitions tirées de la littérature, les particularités qui nous semblent fondamentales pour cerner de façon précise la notion d'émergence.

Nouveauté
"D'une part, l'émergence présuppose qu'il y a apparition de nouveauté – propriétés, structures, formes ou fonctions –, et d'autre part, elle implique qu'il est impossible de décrire, d'expliquer ou de prédire ces nouveaux phénomènes en termes physiques à partir des conditions de base définies aux niveaux inférieurs" [Van de Vijver 97]
.
"Théorie selon laquelle la combinaison d'unités d'un certain ordre réalise une entité d'ordre supérieur dont les propriétés sont entièrement nouvelles" [Lewes 75] [Grumbach 97].


Auto-organisation
"L'émergence fait référence à l'apparition durant le processus d'auto-organisation dans un système complexe de structures ou de schémas ("patterns") ou de propriétés nouvelles et cohérentes" [Goldstein 99].

Irréductibilité
"Churchland définit l'émergence en termes d'irréductibilité des propriétés associées à une théorie de haut niveau à des propriétés associées à des composants dans une théorie de plus bas niveau" [Ali 97].

Interdépendance des niveaux

"Des structures et/ou des fonctions apparaissent à un niveau macroscopique sans que la seule observation des propriétés des constituants permette de les prédire" [Atlan 00] [Atlan 79]

.


Langton [Langton 90] définit l'émergence en termes de relation de feedback entre les niveaux dans un système dynamique. Les micro-dynamiques locales causent les macro-dynamiques et les macro-dynamiques globales contraignent les locales.

Qu'est-ce qui nous permet alors de juger du caractère émergent d'un
phénomène ? Les propriétés inter-reliées, communes qui permettent d'identifier le phénomène comme émergent sont :
l'observation d'un phénomène ostensible (qui s'impose à l'observateur) au niveau global ou macro,
la nouveauté radicale du phénomène (il n'est pas observé au niveau micro et n'est pas prévisible),

la cohérence et la corrélation du phénomène (il a une identité propre mais liée fortement aux parties qui le produisent),

l'observation d'une dynamique particulière (le phénomène n'est pas prédonné, il y a "auto-maintien" du phénomène).

Pour construire un système exhibant ces propriétés, il faut le doter d'un certain nombre de caractéristiques.
La non-linéarité
La linéarité permet une traçabilité analytique des interactions locales jusqu'au phénomène global. Il n'y a donc pas apparition de nouveauté radicale et donc pas d'émergence possible. Il faut donc que les parties du système interagissent de façon non linéaire. Ainsi, une partie du système doit pouvoir être influencée par une autre partie même si elle ne lui est pas directement rattachée. On peut par exemple utiliser des boucles de feedback négatif ou positif qui sont non linéaires par nature.
Proche/Loin de l'équilibre (multi- non- ou à partir de l'équilibre)
Au début, les théories cherchaient à comprendre comment des systèmes tendent vers un état final d'équilibre ou homéostasie. La théorie de la complexité s'intéresse plus aux conditions autour de l'équilibre qui entretiennent l'émergence. L'amplification des événements aléatoires est une des raisons clés pour lesquelles l'émergence fait apparaître des caractéristiques imprédictibles.
L'auto-organisation
Dans la théorie des premiers systèmes, cela faisait référence au processus d'auto-régulation. En théorie de la complexité on fait référence au comportement créatif et auto-généré qui produit les changements, ainsi qu'à la recherche d'adaptabilité d'un système complexe. Le système doit être capable de se modifier d'une façon ou d'une autre afin de changer de comportement en fonction de son environnement.
Les attracteurs
Dans la théorie des premiers systèmes, le seul attracteur valide était celui qui amenait à un état final d'équilibre. Le fait d'utiliser un seul type d'attracteur simple avec comme finalité un état d'équilibre conduit à la prévisibilité du système. En théorie de la complexité, il y a de nouveaux types d'attracteurs (le point fixe, le cycle limite et l'attracteur étrange). Ces attracteurs ne sont pas prédonnés dans le sens de la "Gestalt". Ils ne dictent donc pas au système l'état à atteindre mais lui donnent seulement les moyens de changer.
La dynamique
La non-linéarité et les nouveaux attracteurs permettent cette métamorphose quantitative et qualitative du système si particulière. Tout doit donc être fait pour permettre au système d'exhiber un dynamisme suffisant pour en profiter et ainsi, tout en se maintenant dans des états proches/loin de l'équilibre, permettre l'auto-organisation qui conduit au phénomène émergent.

L’émergence en informatique
Depuis près de quinze ans, tout un champ de recherche s'est peu à peu créé autour de l'émergence afin d'en exploiter les caractéristiques si particulières au sein de systèmes informatiques [Holland 97] [Odell 00]. "Emergent Computation" [Forrest 90] [Forrest 91] est le terme employé en général pour désigner cet axe dans lequel se situent nos travaux. Ce terme regroupe en fait des approches très diverses car le principe de l'émergence est absolument abstrait et générique, et semble donc applicable quelle que soit la technique utilisée, à partir du moment où celle-ci permet de se positionner dans le cadre de la définition de l'émergence. Le terme d'Emergent computation n'a donc finalement été que peu utilisé, les communautés scientifiques préférant se regrouper par thématique consacrée à une technique précise et ses variantes (cf. partie  REF _Ref69270238 \r \h 3).
Malgré l'effort de recherche mené, l'émergence reste un phénomène peu connu et on pourrait même dire un peu mystérieux. Nous allons donc donner une définition "utilitaire" avec une coloration fortement informatique. Nous la décomposons en trois parties : ce que l'on veut faire émerger, à quelle condition il y a émergence et comment nous nous en servons [Capera 03] [Georgé 03b].

Objet
Un système informatique a pour finalité de réaliser une fonction adéquate à ce que l'on attend du système. C'est cette fonction, pouvant évoluer au cours du temps, que nous voulons faire émerger. Condition
Cette fonction est émergente si le codage du système ne dépend aucunement de la connaissance de cette fonction. Ce codage doit contenir des mécanismes permettant l'adaptation du système au cours de ses échanges avec l'environnement afin de tendre à tout instant vers la fonction adéquate. Méthode
Dans la théorie AMAS, pour changer la fonction il suffit de changer l'organisation des composants du système. Ces mécanismes sont spécifiés par des règles régissant l'auto-organisation entre les composants et ne dépendant pas de la connaissance de la fonction collective. 

Les domaines scientifiques connexes
Le phénomène d'émergence, tel qu'il est perçu, étudié et manipulé de nos jours, prend ses racines dans des domaines scientifiques variés (cf.  REF _Ref41737442 \h  \* MERGEFORMAT Figure 2). En partant de l'étude de systèmes simples, linéaires et en équilibre (General Systems Theory, Cybernetics, Information Theory) et en s'inspirant de phénomènes naturels en physique et en biologie (Evolutionary Biology, solid state/condensed matter physics) et de leurs théories associées (Catastrophe Theory, Dynamical Systems, Fractal Geometry), l'étude s'est progressivement portée sur les propriétés de non linéarité, d'auto-organisation, de non équilibre, d'attracteurs (Complex Adaptive Systems, Non-linear Dynamical Systems, Chaos Theory, Far from Equilibrium Thermodynamics, …).


Nécessité/utilité du concept d'émergence
L'émergence pour la compréhension
La première utilité de la notion d'émergence apparaît lors de l'étude de systèmes complexes et des phénomènes observables produits par ces systèmes. Elle s'oppose alors au concept de réductionnisme mis en échec pour expliquer ces phénomènes. On va en fait faire appel à la notion d'émergence lorsque la configuration et l'interaction des composants d'un système offre plus d'explications sur les dynamiques et phénomènes observés que les explications basées sur les parties seules. Les phénomènes observés sont alors expliqués par la notion d'émergence et sont dès lors caractérisés par le fait qu'ils ne sont ni prédictibles, ni déductibles, ni réductibles aux seules parties [Goldstein 99].
En faisant la distinction entre macro niveau (le niveau de l'émergent) et micro niveau (les parties et leur interactions), on admet que les explications des dynamiques du système ne peuvent être réduites uniquement aux parties de plus bas niveau et qu'on peut se permettre ce "saut" pour ensuite manipuler les phénomènes émergents en tant que tels.
En fait, l'émergence ne se veut pas tellement une explication à proprement parler des phénomènes observés mais plutôt un terme descriptif des patterns, des structures et des propriétés obtenus au macro niveau. On peut alors se focaliser sur l'étude de ces phénomènes et des lois qui les régissent. Concrètement, sans pour autant expliquer les phénomènes émergents, on peut étudier, par exemple, leurs conditions d'apparition, leurs variations, les corrélations entre phénomènes émergents, les dynamiques intrinsèques, etc…
Pour finir, l'émergence est donc un moyen pour décrire la nécessité d'aller au macro niveau et ses dynamiques particulières, ses lois, ses propriétés, dans le but d'expliquer de manière plus adéquate ce qui est observé. Les études sur l'émergence permettent de construire les outils nécessaires, les méthodes et les constructions (systèmes artificiels, modèles) afin de mieux étudier le phénomène d'émergence et les systèmes dans lesquels il se produit.

Utilisation de l'émergence au sein de systèmes artificiels
"Emergent Computation" est le terme très général pour désigner toute utilisation de l'émergence par des informaticiens. L'idée n'est pas nouvelle comme les montrent les deux paragraphes suivants basés sur la volumineuse introduction de Stéphanie Forrest pour les "Proceedings of the ninth annual CNLS conference" [Forrest 90], conférence montrant bien toute la diversité de la computation émergente mais également à quel point elle était balbutiante.
La computation émergente s'efforce de produire un comportement global intéressant à partir de nombreuses petites interactions. Cela inclut les modèles connexionnistes, les systèmes classifieurs, les automates cellulaires, les modèles biologiques, les modèles de vie artificielle, et l'étude de la coopération dans les systèmes sociaux sans autorité centrale.
Le principe de base ressemble à celui de la computation parallèle dans le sens où elle s'efforce de décomposer des systèmes complexes en sous-unités indépendantes qui interagissent. Mais là où la computation parallèle requiert une contraignante supervision pour contrôler le bon fonctionnement du système et où les performances sont considérablement inférieures à une fonction linéaire du nombre de processeurs, la computation émergente va exploiter ces interactions. On obtient ainsi un gain d'efficacité, de flexibilité ou une représentation plus naturelle.
Près de quinze ans après, l'utilisation de l'émergence s'est amplement répandue dans le domaine de l'Informatique. De nombreuses disciplines ou champs d'étude manipulent le terme "émergence", tels que la vie artificielle, l'evolutionary computation (algorithmes génétiques et genetic programming), les réseaux neuronaux, les ants algorithms, les automates cellulaires, les systèmes multi-agents, la simulation (de systèmes physiques, chimiques, biologiques, sociaux), la robotique, l'intelligence artificielle distribuée,… Cette synergie interdisciplinaire autour de ce concept encore inexploité peut sembler prometteur et aboutir rapidement à une utilisation répandue et concrète de l'émergence dans les travaux informatiques.
Mais lorsque l'on étudie plus en profondeur un panel de travaux tirés de tous ces champs, on s'aperçoit que la notion d'émergence est fortement sujette à interprétation, et ce même au sein de la même discipline. En fait, souvent, l'émergence est utilisée seulement au sens d'une apparition de propriétés à un certain niveau qui n'existent pas au niveau en dessous, sans prendre en compte les caractères d'irréductibilité et d'imprédictibilité [Brunner 02]. Parfois ce n'est même qu'une façon de parler pour désigner l'apparition d'événements pourtant entièrement descriptibles en terme de causalité.
Pourtant, pour atteindre les buts que se fixe l'informatique moderne dans le domaine de systèmes complexes, la "maîtrise" des phénomènes émergents semble, sinon une nécessité, du moins une voie prometteuse. A mon sens, cela nécessite l'élaboration de théories de l'émergence qui posent à la fois un cadre scientifique rigoureux quant à la définition de l'émergence, et fournissent, à travers une certaine compréhension de l'émergence, les moyens techniques pour effectivement construire des systèmes artificiels correspondant à la définition. Particulièrement, je pense qu'il faut insister sur le fait que le système ne doit pas et ne peut pas contenir explicitement la connaissance du but du système (i.e. de la fonction émergente) et des moyens d'y arriver. Il faut garder la même abstraction entre les parties du système artificiel et la fonction émergente que dans la définition de l'émergence.
La théorie AMAS [Capera 03][Georgé 03b] est, en ce sens, potentiellement une théorie de l'émergence pour la manipulation de systèmes complexes adaptatifs.

Exemples de systèmes émergents
Pour finir de clarifier l'émergence, on peut citer quelques exemples de phénomènes qui semblent être émergents au vu de ce qui précède : les constructions des insectes sociaux (fourmis, termites, …), les phénomènes sociaux (embouteillages, applaudissements,…), les phénomènes économiques, la circulation de l'information sur Internet, les automates cellulaires (comme le jeu de la Vie), …
En Physique et Chimie, les interactions entre des éléments simples donnent naissance à des structures complexes dotées de propriétés totalement nouvelles. En Biologie, de nombreux systèmes naturels composés d’individus autonomes exhibent des aptitudes à effectuer des tâches qualifiées de complexes sans contrôle global. De plus, ils peuvent s’adapter à leur milieu soit pour y survivre, soit pour améliorer le fonctionnement du collectif. C’est le cas des colonies d’insectes sociaux tels que les termites, les fourmis [Bonabeau 97]. Le fonctionnement du système immunitaire est lui aussi représentatif du fonctionnement d’un système complexe composé d’un ensemble d’agents autonomes.

Systèmes physiques : le système de Bénard
Dans les systèmes complexes physiques [Gleick 87], des phénomènes émergents apparaissent typiquement dans des états de non-équilibre proche du chaos. En effet, l'équilibre pour un système empêche l'auto-organisation et le garde stérile alors que le non-équilibre permet l'apparition d'organisations nouvelles et de créativité. Ceci peut être observé dans des situations tout à fait courantes comme lorsque l'on fait chauffer de l'eau dans une casserole. La chaleur est transmise par un flux tout d'abord régulier du fond vers la surface par conduction. Lorsque l'on continue à chauffer, on quitte cet état d'équilibre pour un état loin de l'équilibre dû à la différence de température entre les deux régions qui fait que la gravité s'exerce plus intensément sur les couches supérieures, plus froides et donc plus denses. Ceci conduit à l'apparition progressive de circulations chaotiques du fluide (remous et tourbillons) qui s'intensifient jusqu'à l'état d'ébullition. Mais avant l'ébullition à proprement parler, il y a un point critique où il n'y a pas encore de grands courants de circulation pour permettre la dispersion rapide de la chaleur au sein du fluide. On observe alors une auto-organisation du système qui quitte son état chaotique et produit un réseau de courants hexagonaux appelés cellules de Bénard (cf.  REF _Ref44407580 \h Figure 3). Si la température augmente, ce phénomène disparaît. On peut parler d'une certaine forme d'émergence car des millions de molécules, subissant une contrainte de l'environnement, s'auto-organisent pour former une structure observable cohérente.

Systèmes artificiels : les automates cellulaires et le jeu de la vie (Game of Life)
J.H. Holland, le "père" des algorithmes génétiques cite les automates cellulaires dans son livre "Emergence – From Order to Chaos" [Holland 97]. Inventés par deux des plus renommés mathématiciens de notre siècle, Stanislas Ulam et John von Neumann, ils sont remarquables par leur simplicité. Le "Jeu de la Vie" est une des instances les plus étudiées de ces automates cellulaires.
Il suffit de concevoir une grille, comme pour un jeu de Dames, où chaque case peut prendre la valeur 0 ou 1. Le 0 signifiant que la case est "morte", le 1, qu'elle est "vivante". Ensuite, chaque "cellule" ainsi définie possède quelques règles très simples de fonctionnement qui régissent son évolution.
Si une cellule morte a exactement 3 voisines vivantes, elle devient vivante.
Une cellule vivante survit si elle a exactement 2 ou 3 voisines vivantes.
Dans tous les autres cas, la cellule meurt ou reste morte i.e. 4 ou plus, elle est étouffée, 1 ou 0, elle meurt d'isolement.

Que peut-on faire avec des règles aussi simples ? En fait, si on pose certaines configurations de cellules sur une grille, on peut observer des phénomènes surprenants. L'exemple le plus populaire reste le "planeur" (cf.  REF _Ref44409064 \h Figure 4). En faisant évoluer cette configuration de cellules rapidement on observe le "planeur" qui suit une trajectoire descendante, en regagnant sa forme d'origine toutes les 4 étapes.
Il existe un grand nombre de ces "configurations remarquables" dont les plus complexes donnent par exemple l'impression, sur une grande grille, de voir un train à vapeur se déplacer de gauche à droite, avec la fumée s'échappant de la cheminée. Elles ont toutes en commun le fait d'être régies par les mêmes règles de base et que le résultat observable et interprété ne peut être prédit.
Dans une vision plus informatique des choses, la théorie veut que l'on puisse ainsi simuler une Machine de Turing, les signaux transitant sous forme de groupes de cellules comme le planeur, et venant modifier l'état de certaines configurations stables.

Insectes sociaux : l'expérience du double pont et des fourmis
Il existe de nombreux phénomènes émergents issus du comportement des insectes sociaux tels que les fourmis ou les termites [Bonabeau 97]. Cela n'a rien de surprenant car si l'on prend par exemple une colonie de fourmis, ce système, bien évidemment complexe, contient tous les "ingrédients" pour des phénomènes émergents : grand nombre d'entités autonomes, nombreuses interactions, fonctionnement simple des entités, capacités proprioceptives et cognitives limitées, système confronté à un environnement dynamique, fonctionnements de haut niveau remarquables et nécessaires à la survie.
Certainement l'un des exemples les plus simples, l'expérience du double pont de fourmis permet d'illustrer, à partir d'un nombre limité de paramètres et donc d'une connaissance complète du problème, l'apparition d'un phénomène de haut niveau qui n'est pas décrit dans le fonctionnement des parties.
Pour cette expérience (observée sur des fourmis ou simulée), un groupe de fourmis partant d'un nid a deux chemins possibles pour atteindre un lieu de fourragement d'où elles doivent ramener de la nourriture au nid. L'un des deux chemins est plus court que l'autre. Les fourmis ont un comportement très simple : si elles perçoivent des traces de phéromone, elles les suivent, s'il n'y en a pas, elles se déplacent aléatoirement, et dans tous les cas, elles déposent un peu de phéromone sur le chemin qu'elles empruntent. Au début les fourmis choisissent aléatoirement l'un ou l'autre des chemins. Mais au bout d'un moment, à cause des allers-retours, le chemin le plus court va se charger plus rapidement de phéromone, ce qui va entraîner encore plus de fourmis sur ce chemin. Au bout d'un certain temps, toutes les fourmis empruntent le chemin le plus court. Elles ont "trouvé" le chemin le plus court.
Pourtant, aucune fourmi n'a cartographié les parcours possibles, n'a évalué et comparé les temps qu'elle mettait, ni même essayé de trouver le chemin le plus court. C'est en ce sens là que l'on peut dire que la découverte et la sélection du chemin le plus court constituent un phénomène émergent, issu du comportement collectif des fourmis qui n'ont que des règles de fonctionnement simples qui ne codent nullement cette recherche.
Cet exemple est intéressant par sa simplicité car il permet de bien imaginer le fonctionnement du système et donc de comprendre qu'il est "logique" que les fourmis finissent par choisir le chemin le plus court. Mais pourtant, lorsque l'on analyse seulement les règles des fourmis, on n'y reconnaît pas la recherche du plus court chemin. Ce n'est qu'en considérant le système dans sa globalité et en fonctionnement que ce phénomène s'explique. Il y a bien une différence de niveau micro/macro et on peut parler de phénomène émergent.

Phénomènes sociaux : la synchronisation des applaudissements
Des phénomènes non supervisés issus de l’activité d’un grand nombre d’individus s’observent aussi dans les activités humaines [Goldstein 99]. Tout le monde a pu observer la synchronisation des applaudissements après un concert ou une pièce de théâtre. Cette apparition de synchronisation à partir d'un ensemble désordonné d'applaudissements individuels, qui peut disparaître et réapparaître plusieurs fois, est un exemple classique d'auto-organisation. Très étudié en physique, cet exemple simple a permis d'obtenir des modèles mathématiques le décrivant et permettant d'étudier les conditions d'apparitions et de variations. Mais ce sont des modèles de haut niveau qui n'expliquent pas - à partir des individus - comment s'effectue la synchronisation.

L'eau
Cet exemple a été donné par Lewes. Les propriétés des gaz qui composent l'eau ne laissent pas prévoir celles de l'eau et réciproquement. [Grumbach, 97]. Si l'on considère une molécule d'eau isolée, la mécanique quantique nous fournit toutes les informations nécessaires, telles que les niveaux d'énergie par exemple, pour décrire son comportement. Mais si l'on met ensemble un certain nombre de molécules d'eau on obtient un liquide dont le comportement ne peut être décrit avec la même théorie qui décrit le comportement de ses constituants. Il faut faire appel aux théories sur l'hydrodynamique, très différentes de la mécanique quantique, pour obtenir des connaissances sur ce qui est observable à ce niveau supérieur. Les remous et les tourbillons n'existent pas au niveau des molécules.
Si l'on diminue la température, le liquide devient de la glace et on obtient encore de nouvelles propriétés. Par exemple, si on pousse un coté d'un bloc de glace, l'autre bout se déplace instantanément de façon identique. Ce qui n'est pas le cas ni de liquides, ni de gaz. On peut donc dire qu'une certaine quantité de molécules d'eau constitue un nouvel "objet" suffisamment complexe pour nécessiter des théories différentes suivant sa température.
C'est cette différence de niveau pour décrire les comportements des parties (les molécules) ou de l'ensemble du système (une certaine quantité de liquide) qui permet de parler d'émergence. Ce sont bien toutes les molécules d'eau en interaction qui confèrent au liquide ses propriétés mais nous sommes incapables de les analyser et de les comprendre au niveau moléculaire.

Le jeu d'échec
"L'émergence apparaît seulement quand les activités des parties ne s'additionnent pas simplement pour donner l'activité du tout. Pour l'émergence, le tout est en effet plus que la somme des ses parties. Pour illustrer ceci, examinons le jeu d'échec. Nous ne pouvons pas nous faire une image représentative d'un jeu en cours simplement en additionnant les valeurs des pièces sur l'échiquier. Les pièces interagissent pour se soutenir les unes les autres et pour contrôler différentes zones de l'échiquier. Cette structure de pouvoir basée sur l'imbrication, si elle est bien conçue, peut aisément soumettre un opposant avec de meilleures pièces mais mal alignées." [Holland 97].
Cet exemple illustre bien le fait d'obtenir grâce à l'organisation et donc à l'interaction une structure globale qui possède des caractéristiques particulières que l'observation des parties ne permet pas de prédire. Ceci est bien une des conditions pour que l'on puisse parler de phénomènes émergents. Mais il manque encore des éléments de dynamisme, de non-linéarité ou d'auto-organisation par exemple, pour que l'on soit en présence d'émergence.

La conscience humaine
Un phénomène très surprenant chez l’homme est celui de l’apparition de la conscience. “La conscience est une propriété du cerveau de niveau supérieur ou émergente au sens tout à fait banal de "niveau supérieur" ou d'"émergent"…” [Searle 95]. Les avancées en neuro-biologie nous renseignent de plus en plus sur les interactions physico-chimiques complexes se déroulant au sein de notre cerveau. Pourtant il semble bien illusoire de parvenir à comprendre un phénomène aussi complexe que la conscience en n'observant que les neurones et leurs interactions.
Le cerveau est typiquement un système complexe, constitué d'un grand nombre de parties en interactions non-linéaires, confronté à un environnement dynamique, capable d'adaptation et d'apprentissage, et exhibant à un niveau supérieur des phénomènes particuliers (conscience, réflexion, mémoire) non explicables au vu des parties.
Et pourtant nous pensons.


Auto-organisation et systèmes multi-agents
Les notions d'émergence et d'auto-organisation sont étroitement liées, comme le montre d'ailleurs la présentation détaillée de la partie  REF _Ref69529291 \r \h 1. Pourtant on trouve abondamment dans la littérature des travaux se focalisant exclusivement sur cette seconde notion et n'évoquant pas, ou peu, la première. Une hypothèse pouvant expliquer cela serait peut-être le caractère abstrait de la notion d'émergence la rendant difficile à appréhender et de ce fait délicate à manipuler, en opposition à celle d'auto-organisation, plus concrète de par sa description en terme de mécanismes et donc plus aisément exploitable. Mais en se focalisant exclusivement sur les mécanismes, ne risque-t-on pas de sortir du cadre de la notion originale ?
Cette seconde partie du  REF _Ref71960367 \w \h  \* MERGEFORMAT Chapitre I explore plus spécifiquement le concept d'auto-organisation et ses mécanismes en général, ainsi que son rapport à l'émergence et son utilisation dans les SMA.

Auto-organisation : définition et contexte
Historique et Définition
Si l'on se réfère aux origines issues de la Physique et plus précisément de la Thermodynamique de l'auto-organisation, une définition minimaliste peut être donnée : l'apparition de structures ou motifs (patterns) sans qu'un agent externe ne l'impose [Heylighen 99]. La cristallisation et les cellules de Bénard (cf. partie sur l'émergence) sont parmi les exemples les plus classiques. Mais le concept est également manipulé depuis longtemps par la Biologie [Thompson, 17] pour expliquer la diversité organisée des patterns dans le vivant comme par exemple les rayures et autres motifs sur les animaux ou les structures géométriques de coquillages. [Ball 99] en fait notamment une présentation étendue remarquable.
Mais cette définition ne fait pas apparaître tout l'aspect dynamique de l'auto-organisation qui possède la caractéristique particulière de ne pas forcément tendre vers un état d'équilibre stable. Ilya Prigogine en a été le premier et plus fervent défenseur [Prigogine 77]. Un autre aspect important que l'on doit aux nombreux travaux de Humberto Maturana et Francisco Varela, sur la Biologie et les cellules d'une part, mais surtout sur la cognition, est celui d'autopoïèse [Autopoietica www]. Ce concept peut se résumer à la capacité d'un système, à travers l'interaction, la transformation, la destruction et la régénération de ses éléments, à maintenir ses éléments et leur dynamique particulière, ainsi que l'unité propre du système.
En élargissant et en explicitant un peu plus, l'auto-organisation est généralement définie comme l'ensemble des mécanismes permettant à un système d'exhiber des structures de formes ou de fonctionnements sans contrainte explicite ni intervention quelconque de l'extérieur du système. Ceci signifie que les mécanismes qui contraignent l'organisation sont internes au système et résultent de, ou s'expriment par, les interactions des composants du système. Cette organisation peut produire un équilibre stable, évoluer dans le temps et l'espace, ou produire éventuellement des phénomènes éphémères. De plus, on considère généralement qu'il y a des flux de ressources ou d'énergie sous la forme de structures dissipatives afin de contrer l'entropie inhérente des systèmes dynamiques.
Mais on peut aussi aborder le concept sous d'autres formes et considérer l'auto-organisation comme le mécanisme permettant à un système de se déplacer d'une région quelconque de son espace d'état à une région persistante généralement plus petite (appelée alors un attracteur) sous le contrôle seul du système lui-même. Ou alors considérer que l'auto-organisation fait référence à l'apparition de corrélations entre des variables ou des éléments d'un système au cours du temps et de l'espace alors qu'ils étaient a priori indépendants et dont le comportement n'est dicté que par des règles locales.
Sans entrer dans les détails techniques, on peut citer quelques caractéristiques et concepts inhérents ou annexes comme :
L'absence de contrôle externe (autonomie);
Le fonctionnement dynamique (évolution au cours du temps);
Les fluctuations non déterministes du système dues au bruitage ou à des possibilités multiples;
La disparition de la symétrie ou plus généralement de la liberté ou de l'hétérogénéité de comportement;
L'apparition d'un ordre global, i.e. émergence à partir de règles locales.
La capacité de dissipation (d'énergie, d'entropie);
L'instabilité par la non linéarité et le renforcement de comportements;
La possibilité d'équilibres multiples (plusieurs attracteurs);
Des comportements dits "critiques" (effets de seuil, changements de phases);
La redondance (résistance aux perturbations ou dommages);
L'auto-maintien (réparation, reproduction, autopoïèse);
L'adaptation (prise en compte des variations externes);
La complexité;
La notion de hiérarchie ou systèmes imbriqués (plusieurs niveaux d'auto-organisation).

Explicitation des mécanismes
Alors que l'émergence n'est restée longtemps qu'un concept philosophique manipulable en tant que tel, le domaine de l'auto-organisation a tout de suite essayé de chercher des règles générales de fonctionnement expliquant la croissance et l'évolution des structures systémiques observées, de trouver les formes que les systèmes peuvent prendre, et finalement de produire des méthodes pour prédire les futures organisations apparaissant à la suite de changements effectués sur les composants des systèmes. Et les résultats éventuels sont censés être applicables à tout autre système exhibant les mêmes caractéristiques (recherche de fonctionnements génériques).
Un des meilleurs exemples est certainement le célèbre modèle réacto-diffusif (ou de réaction-diffusion) de Alan Turing [Turing 52] découvert alors qu'il explorait les mécanismes de la genèse du cerveau. Ce modèle explique comment des structures régulières peuvent apparaître grâce à la seule combinaison de mécanismes d'activation et d'inhibition engendrés par les mécanismes de production eux-mêmes : lors de la genèse du système, il y a production d'un activateur pour produire certains types de structures qui s'auto-catalyse (grande production de ce type de structures) mais qui active également un inhibiteur qui empêche la formation de ces structures. Comme les taux et les vitesses de diffusion diffèrent (l'inhibiteur est plus rapide), la production des structures est perturbée régulièrement par l'inhibiteur dès que la quantité d'activateur augmente, i.e. il y a mise en place d'une régulation.
Ce modèle pourtant simple et répondant entièrement à la définition de l'auto-organisation modélise particulièrement bien un vaste panel de phénomènes naturels, de la morphogenèse de certaines structures embryonnaires à la production des "dessins" sur les animaux, jusqu'à certains comportements des insectes sociaux.
Le fait d'aboutir effectivement sur des modèles ou des mécanismes concrets permet alors une approche d'expérimentation et de simulation : il suffit d'intégrer le comportement à tester au sein d'un programme pour observer et analyser ce qu'il produit. On peut alors tester efficacement des hypothèses sur le fonctionnement du monde qui nous entoure. De nombreux travaux se sont ainsi focalisés sur l'expérimentation de systèmes fonctionnant sur des mécanismes d'auto-organisation, notamment en biologie et plus particulièrement en éthologie où les phénomènes observés incitent naturellement à se tourner vers l'auto-organisation. On peut ainsi citer les travaux de Jean-Louis Deneubourg, Scott Camazine, Eric Bonabeau et Guy Théraulaz [Bonabeau 97], ensembles ou séparément, sur les insectes sociaux comme les fourmis et les termites. L'exemple des termites servira ensuite pour discuter de la notion d'émergence dans la partie suivante.
Pour résumer, nous dirons que l'auto-organisation est l'ensemble des processus au sein d'un système, issus de mécanismes basés sur des règles locales, qui conduisent ce système à produire des structures ou des comportements spécifiques non dictés par l'extérieur du système [Georgé 04].

Auto-organisation, émergence et règles de comportement locales
Dans la plupart des définitions d'émergence et d'auto-organisation, il est question sous une forme ou une autre de règles locales et de comportements en résultant, avec comme contrainte forte pour ces comportements de n'être pas imposés, dictés, explicitement informés ou contraints par l'environnement du système. Le caractère local d'une règle pose un cadre strict et clair. Mais pour ce qui est de l'influence de l'environnement sur le système, directement ou au travers des règles, la caractérisation exacte de cette influence est particulièrement difficile et floue.
Prenons l'exemple des cellules de convection de Bénard (cf. point  REF _Ref69562683 \r \h 1.5.1 pour une description) qui est un exemple classique d'auto-organisation. Le phénomène produit par auto-organisation est ici la forme des déplacements des molécules d'eau qui crée cette structure de courants observable particulière. Les règles locales sont ici les déplacements et les chocs entre molécules. Le fait que les molécules se déplacent plus aisément lorsqu'elles vont dans le même sens (car subissant moins de chocs) crée des sens de circulation. Mais les parois du conteneur ainsi que l'apport de chaleur qui oblige les molécules à se déplacer font bien partie de l'environnement et influent sur le comportement du système. Il faut alors décider de l'impact et de la nature de cette influence sur les comportements des molécules et du système. On peut alors argumenter que c'est bien cet apport de chaleur qui impose aux molécules de se déplacer et que les parois contraignent ce déplacement. Mais cela ne suffit pas pour expliquer comment les molécules doivent se déplacer. Et ce sont bien les règles locales de collision qui vont faire apparaître les cellules hexagonales visibles de dessus. Le cadre d'auto-organisation semble ici relativement clair.
Mais plus le système sera complexe et riche, plus les interactions avec l'environnement auront une influence et plus il sera dur de juger de la nature de cette influence. Voyons alors un exemple plus complexe qui est celui de la construction de nids des termites autour d'une reine. Ces constructions ont des formes bien particulières avec une chambre pour la reine au centre de constructions concentriques élevées composées de nombreuses arches et passages. Les termites étant des insectes avec des cerveaux simples et des capacités de communication limitées, toute forme de planification complexe permettant d'atteindre une forme connue de termitière est bien sûr exclue et les éthologues ont très tôt envisagé la piste de l'auto-organisation. Les modèles actuels de comportements des termites expliquent relativement bien le résultat final.
Ces modèles (cf.  REF _Ref69564867 \h Figure 5) sont basés sur la diffusion de phéromones par les termites et par la reine, ainsi que par la prise en compte de ces deux types de phéromones par les termites lors du dépôt des composants de la termitière. En simplifiant, les termites préfèrent déposer les matériaux près de fortes concentrations de phéromones et lorsqu'ils déposent, ils émettent également des phéromones. Les phéromones émises par la reine incitent donc les termites à déposer les matériaux en cercles concentriques autour d'elle et les phéromones émises par les termites eux-mêmes conduisent à créer les arches, colonnes et murs formant effectivement la structure.
Si l'on se concentre sur la termite individuelle, elle est effectivement autonome (elle n'est pas contrôlée) et se base sur des règles locales pour son comportement : le dépôt de matériaux de préférence sur de fortes concentrations en phéromones et l'émission de phéromones lors de dépôts. On peut alors considérer que l'on a développé un modèle basé sur l'auto-organisation. Pourtant, si les apparitions d'arches sont bien un phénomène émergent (on retrouve les mêmes phénomènes chez les fourmis quant à la création de tas), le fait d'avoir des cercles concentriques pour les murs ne l'est certainement pas : il est évident que l'émission de la phéromone de la reine sous cette forme conduit effectivement à la forme concentrique. La reine indique bien comment déposer les matériaux pour obtenir la circularité.
Pourtant, nous avons bien des règles locales pour les termites. Mais il semble que ces règles, en ce qui concerne la forme circulaire, sont trop explicitement influencées par l'environnement (si on considère l'ensemble des termites excepté la reine comme étant le système étudié) ce qui exclut la caractéristique d'émergence pour cette forme. Peut-on cependant parler d'auto-organisation ? Le flou autour de la notion d'influence vient perturber inlassablement les réflexions. En fait, dans la communauté scientifique, on retrouve abondamment un mélange entre de l'auto-organisation que je qualifierais de stricte et la notion de template (plan, schéma). La phéromone de la reine est clairement un template pour les termites, mais la température du sol, l'humidité, et tout simplement la forme en sont aussi.
Ces templates ont une influence sur les comportements des entités composant le système. Plus ces templates sont précis et imposés, moins je serais enclin à parler d'auto-organisation, même si les entités elles-mêmes ont des comportements autonomes et suivent bien des règles absolument locales. Lorsqu'on utilise l'auto-organisation comme fonctionnement interne du système, il faut donc porter un regard attentif et critique sur l'influence de l'environnement sur le système.

Auto-organisation dans les systèmes multi-agents
Le paradigme des SMA, de par sa nature inspirée des systèmes naturels, se prête particulièrement bien à l'approche par auto-organisation. Cependant, une technique n'est jamais garante du concept sous-jacent à elle seule et les SMA, pour prétendre à un fonctionnement par auto-organisation, doivent se contraindre au cadre plus ou moins strict donné par le concept fondamental de l'auto-organisation.

Systèmes multi-agents : Définition
Si l'on considère une définition très large, nous pouvons dire qu'un SMA est un système artificiel dont le fonctionnement repose sur l'interaction d'un certain nombre d'agents. Et un agent est une "entité virtuelle ou réelle qui est capable d'agir sur son environnement, qui possède des moyens de perception et de représentation partielle de son environnement, qui est capable de communiquer avec d'autres agents et qui est autonome dans sa prise de décision" [Ferber 95]. Son comportement autonome est la conséquence de ses observations, de ses compétences et des interactions avec les autres agents.
De façon générale, un agent possède donc principalement:
Des propriétés individuelles : son état général et ses compétences (ce qu'il sait faire) qui détermineront son rôle (ou plusieurs) dans la réalisation de tâches.
Des propriétés sociales : ses accointances qui correspondent aux autres entités du système avec qui l'agent peut interagir ainsi que son comportement envers ces entités.
Des connaissances (ou croyances) : sur lui-même et sur les autres, ainsi que sur son environnement.
Des moyens de perception de l'environnement, de communication, d'action, voire d'apprentissage et de raisonnement lorsqu'on s'éloigne des agents réactifs vers des agents plus cognitifs.

Mais un SMA est aussi plongé dans un environnement et doit réaliser ce qu'en attend son concepteur, il doit être adéquat. Par exemple, dans le cas d'une simulation, il est nécessaire que le système reproduise le comportement des entités simulées ; on dit alors que le système a atteint une adéquation comportementale. Dans le cas où le système réalise une certaine fonction, on parlera d'adéquation fonctionnelle s'il réalise la bonne tâche, celle pour laquelle il a été conçu. Un SMA doit aussi mener à une activité collective cohérente, la notion importante est alors celle de collectivité et la fonction réalisée par ce collectif a une signification.
Ainsi, un système multi-agent peut être défini [Georgé 03b] comme un macro-système composé d'agents autonomes qui interagissent dans un environnement commun pour réaliser une activité collective cohérente, bien qu'ils puissent chercher à atteindre des objectifs individuels parfois contradictoires. Le résultat de l'organisation des agents correspond au système multi-agent. L'organisation d'un système multi-agent, quant à elle, est définie comme liens possibles entre les agents qui composent le système. Une organisation dépend fortement du problème en cours de résolution : elle est contextuelle.

Potentiel d'auto-organisation dans les SMA
En considérant de tels systèmes composés d'entités autonomes (les agents) interagissant en suivant des règles locales (perceptions limitées), tout semble en place pour construire ces systèmes afin qu'ils exhibent des fonctionnements particuliers qui ne soient pas imposés ou dictés explicitement de l'extérieur.
En généralisant les caractéristiques des travaux autour des SMA en lien avec l'auto-organisation, deux grandes catégories de SMA apparaissent en fonction du but recherché. D'un côté, nous pouvons référencer tous les travaux du domaine de la simulation (voir par exemple le workshop MABS : Workshop on Multi-Agent Based Simulation). Il s'agit alors, soit d'étudier explicitement l'auto-organisation afin d'en comprendre les mécanismes, soit de vérifier ou parfaire des hypothèses sur le fonctionnement du monde qui nous entoure. De l'autre côté se situent les travaux dont le but est de produire des systèmes adaptatifs capables de réaliser des tâches données ou plus généralement de faire de la résolution de problèmes.
Cette seconde catégorie nous intéresse plus particulièrement. En effet, de tels systèmes ont un but bien précis : exhiber le comportement attendu par l'utilisateur/programmeur/observateur en fonction de l'interaction du système avec son environnement. Pour qu'un système exhibe bien le bon comportement en fonction de l'environnement, il doit prendre en compte cet environnement et donc être influencé par lui. On retrouve alors le flou de la définition de l'auto-organisation en ce qui concerne l'influence extérieure dans la vaste palette de fonctionnements possibles au sein des SMA allant de la supervision avec contrôle central jusqu'à des systèmes dont les agents ne se soucient pratiquement pas de l'environnement.
Le paradigme des SMA fournit bien tous les "outils" nécessaires pour produire des systèmes basés sur le concept d'auto-organisation, et ces outils sont puissants, pratiques à utiliser et génériques. Mais encore faut-il arriver à les utiliser dans le cadre spécifique de l'auto-organisation.

La supervision dans les SMA et l'autonomie
Pour prétendre à un fonctionnement basé sur l'auto-organisation, un SMA doit donc manipuler les contraintes de l'environnement ou du but global avec subtilité. Si le but global est effectivement inscrit dans sa totalité au sein des agents, ou si l'environnement pose des templates explicites pour l'organisation des agents, il sort du contexte de l'auto-organisation. Un tel système peut être pertinent dans un certain contexte (si on connaît le but et comment y arriver, autant l'implémenter si cela est possible), mais ne possède plus la caractéristique principale de l'auto-organisation : la création de nouveauté et donc l'adaptation.
Or dans la tradition informatique de conception de systèmes artificiels, la tentation est grande d'introduire dans les SMA sous une forme ou une autre, une supervision avec un contrôle global plus ou moins explicite sur les agents. Ceci est bien sûr à éviter pour les systèmes qui nous intéressent car ce contrôle global est forcément limité par ce que le programmeur y inscrit et empêche de ce fait la potentialité d'auto-organisation de s'exprimer.
On pourrait argumenter que ceci ne cadre de toute façon pas avec le caractère d'autonomie voulu pour les agents. Mais le concept d'autonomie est particulièrement difficile à définir dans l'absolu [Carabelea 03] et on ne l'utilise généralement que pour un contexte donné (par exemple : autonomie financière). En effet, l'autonomie absolue, dans le sens d'indépendance à tout critère, n'existe que pour une entité isolée. A partir du moment où il y a des échanges, que ce soit de ressources, d'informations ou de stimuli, le comportement de cette entité dépend de ces échanges. Quand on parle d'autonomie de décision pour les agents, le cadre est alors un peu moins strict : cela signifie avant tout que la conduite de l'agent n'est pas dictée par une autre entité. Mais l'on ne peut nier que dès que l'algorithme de l'agent prend en compte des paramètres acquis par sa capacité de perception ou d'interaction, le comportement en résultant n'est pas strictement indépendant du reste du système. L'autonomie est alors plus une frontière subtile entre deux extrêmes : l'isolation et le contrôle total extérieur.

Le rôle de l'environnement et les règles locales
De plus, l'autonomie de l'agent n'est pas en soi une garantie pour l'apparition d'auto-organisation. Si chaque agent, bien qu'il soit autonome et fonctionnant avec des règles locales, possède un plan préétabli de son rôle, de son comportement et des interactions à effectuer afin que le système atteigne un but précis, l'ensemble des agents aura peut-être à se réorganiser, mais ce ne sera pas là non plus de l'auto-organisation. Ou en tout cas pas dans le sens strict du terme comme le montre l'exemple des termites et de la forme circulaire des termitières.
Pourtant nous voulons bien obtenir un système répondant aux changements dans l'environnement, et de la façon la plus adaptative possible. Vouloir utiliser le concept d'auto-organisation amène alors à définir une influence subtile de l'environnement sur le système (au travers des agents le composant) en lui fournissant des informations utiles pour la convergence du système vers un fonctionnement spécifique, sans que ces informations explicitent ce but ou contraignent inopportunément le comportement du système. Et ceci est couplé avec une certaine autonomie et des règles de comportement locales pour chaque agent (servant également à prendre en compte l'influence de l'environnement) qui n'intègrent pas en leur sein de plan explicite vers le but du système.
En d'autres termes, pour avoir un SMA adaptatif fonctionnant sur les mécanismes de l'auto-organisation, il faut des mécanismes régissant les réorganisations internes qui soient non explicitement informés du but global (comment atteindre ce but) ainsi qu'un rapport subtil entre ces règles et les contraintes imposées par l'environnement.

Des travaux en relation avec l'auto-organisation
La communauté SMA s'est progressivement intéressée à l'auto-organisation comme moyen de permettre aux SMA d'exprimer leur plein potentiel à constituer des systèmes adaptatifs puissants capables de répondre à des contraintes complexes et dynamiques de l'environnement. L'auto-organisation est également apparue comme une riche voie de recherche pour explorer la résolution de problèmes complexes se modélisant naturellement sous forme de SMA.
Dans la communauté française par exemple, d'intérêts divers en approches hétérogènes, le thème de l'auto-organisation se retrouve présent dans de nombreux travaux sous des formes plus ou moins explicites et toujours mélangé à d'autres préoccupations. Le phénomène d'émergence et les préoccupations sur le rapport entre les comportements individuels et collectifs sont ainsi très présents comme dans les travaux de Jean-Pierre Müller [Müller 02]. Ce thème d'émergence couplé avec une étude approfondie du rôle de l'environnement dans les phénomènes d'auto-organisation a été également l'objet d'étude principal de Salima Hassas [Hassas 03]. Ces travaux se situent dans une approche fondamentale d'exploration des concepts cités et de comment les appliquer au paradigme SMA.
D'autres travaux puisent allégrement dans l'inspiration biologique pour aborder la résolution collective de problèmes avec l'expérimentation et la simulation qui vont de pair, comme dans les travaux de Vincent Chevrier [Chevrier 02]. Dans ces travaux, l'auto-organisation est clairement citée comme la technique utilisée pour atteindre le but souhaité. La résolution de problèmes peut aussi être abordée en accordant une importance prédominante aux rapports sociaux inspirés des Sciences Sociales tels que le partage de connaissances et la coopération qui est une caractéristique fondamentale des travaux de Philippe Mathieu [Mathieu 02]. Le domaine de la Vie Artificielle est également une riche source d'inspiration comme l'affirme Alexis Drogoul comme préambule à ses travaux [Drogoul 00] dans lesquels il explore notamment les techniques à développer nécessaires pour aborder les futurs problèmes que voudra traiter l'informatique, comme l'intelligence diffuse par exemple (Pervasive computing ou Ambient intelligence) [Drogoul 01]. Les techniques décrites dans ces travaux présentent également des relations étroites avec l'auto-organisation.
On peut aussi citer des travaux se focalisant plus spécifiquement sur l'utilisation de l'auto-organisation comme moyen de créer des systèmes adaptatifs. En effet, cette caractéristique d'adaptation est une des pierres d'achoppement de l'Intelligence Artificielle, ce qui est apparent par sa prédominance dans de nombreux travaux comme par exemple ceux d'Alain Cardon [Cardon 00]. Mais elle est aussi indispensable à de nombreux systèmes informatiques confrontés à des environnements complexes et dynamiques. Les préoccupations des travaux de Zahia Guessoum le montrent bien [Guessoum 03].
Le phénomène d'émergence est souvent lié à celui d'auto-organisation dans les SMA et on retrouve son étude dans divers travaux. G. Beurier, O. Simonin et J. Ferber [Beurier 03] présentent ainsi un modèle spécifique dédié à l'étude d'émergence multi-niveau de structures et de formes dans les SMA. On retrouve souvent ces préoccupations de structures dans les travaux de simulations comme dans le projet Rivage [Servat 99] qui simule par SMA le ruissellement de gouttes d'eau sur un terrain et la formation de ruisseaux et flaques d'eau. Dans le même ordre d'idée, le travail récent de M. Vasirani et M. Mamei [Vasirani 03] est très représentatif de ces préoccupations : il présente une étude, au travers de simulations, de la morphogenèse de forme d'un groupe de robots minimaliste pouvant servir pour des matériaux s'auto-assemblant.
A l'image de cette diversité, la communauté internationale présente elle aussi de nombreux travaux très variés abordant l'auto-organisation dans les SMA à des degrés divers. On ne peut tous les citer mais certains laboratoires et universités ont une longue tradition autour de la complexité et de l'auto-organisation comme le Santa Fe Insitute [SFI www] ou de recherche en Robotique, Vie Artificielle ou Intelligence Artificielle en général avec des rapports réguliers à l'auto-organisation comme au "Artificial Intelligence Laboratory" du MIT [MIT www].
Pour citer quelques personnes précises qui présentent des travaux fondateurs, nous pouvons évoquer les travaux généraux de réflexion et de définition de H. Van Parunak [Parunak 01] et James Odell [Odell 02] sur l'auto-organisation, les systèmes complexes et leurs rapports avec les SMA. Un peu moins proche des SMA car traitant de robotique (mais qui présente cependant de nombreuses similitudes quand il ne s'agit pas ouvertement des mêmes problématiques pour certaines), citons les travaux de Maja Mataric [Mataric 96] sur l'apprentissage qui donnent des résultats surprenants. Dans un domaine complètement différent, les travaux de Luc Steels sur le langage [Steels 99] illustrent bien l'apparition ou la création de nouveauté, en l'occurrence le langage, sous certaines contraintes chez des agents. Enfin, à nouveau dans l'idée de développer des techniques pour répondre aux besoins futurs des systèmes distribués amenés à être omniprésents dans notre environnement de tous les jours, nous pouvons référencer les travaux inter-équipes de Franco Zambonelli, Robert Tolksdorf, etc.., sur l'informatique diffuse [Zambonelli 04].
Au final, quelques grandes conférences et workshops regroupent en général la plupart des personnes associées au domaine de l'auto-organisation dans les SMA. La plus prestigieuse est certainement AAMAS (International Conference on Autonomous Agents and Multi-Agent Systems) avec son workshop associé dédié à l'auto-organisation, ESOA (Engineering Self-Organising Applications). On retrouve l'intérêt pour le vivant dans le symposium AAMAS (Symposium on Adaptive Agents and Multi-Agent Systems) intégré à la convention AISB (Artificial Intelligence and the Simulation of Behaviour Convention). Il y a même eu des workshops isolés spécialisés dans l'auto-organisation et les SMA comme SOMAS (Workshop on Self-Organisation in Multi-Agent Systems). Mais de façon générale, le thème de l'auto-organisation prend une place de plus en plus importante et dans le tout nouveau workshop européen sur les SMA, EUMAS (First European Workshop on Multi-Agent Systems) [Georgé 03c] l'auto-organisation était un des thèmes majeurs avec une session dédiée.


Techniques diverses
L'utilisation du concept d'émergence et de mécanismes permettant l'auto-organisation dans un système, afin que celui-ci effectue de la résolution de problèmes au sens large, pose effectivement un cadre spécifique qui oblige le concepteur à (et lui permet de) se conformer à des règles, même si celles-ci, nous l'avons vu, peuvent s'avérer relativement floues. Mais en aucune manière cette utilisation n'impose une technique particulière pour y arriver. La partie  REF _Ref69723967 \r \h 2 montre que les systèmes multi-agents sont particulièrement adaptés pour cette approche et sont à mon sens très naturellement utilisables par leur nature intrinsèquement identifiable à la manière dont nous imaginons les processus d'auto-organisation. Pour autant, l'approche SMA n'est pas la seule et certainement pas la première technique utilisée. A l'image de la nature, la diversité est reine et de nombreuses autres techniques ont vu le jour, certaines donnant naissance à des domaines complets de la recherche.
Je vais commencer cette partie par une réflexion sur la résolution de problèmes qui amène à considérer toute recherche de solutions comme une recherche plus ou moins efficace dans un espace d'états. A partir de là, l'exploration de toutes les manières possibles et imaginables pour effectuer cette recherche est valable. L'approche SMA est celle qui nous intéresse le plus mais je ferai une présentation et une analyse rapide de trois domaines ou techniques très différentes des SMA : le calcul évolutionnaire (comprenant notamment les algorithmes génétiques), les réseaux neuronaux (et plus précisément les RN "dynamiques") et les algorithmes de colonies de fourmis. Les AG et les RN sont des domaines historiques forts et regroupent toujours de très nombreuses recherches, ce qui incite naturellement à les étudier pour en extraire des leçons ou des inspirations, même s'ils sont très éloignés des SMA. L'approche par colonies de fourmis par contre montre de nombreuses similitudes avec les SMA et mérite donc elle aussi une analyse.
Les très nombreuses techniques imaginées par la communauté scientifique pour résoudre des problèmes de façon automatisée ne peuvent toutes être traitées et j'ai procédé à des choix en fonction des leurs caractéristiques pour montrer celles qui nous paraissent les plus représentatives. J'en cite cependant quelques unes de plus, dans le dernier point, qui pourraient être des sources d'inspiration supplémentaires. Je montrerai également pour chaque technique qu'il est tout aussi délicat que pour les SMA de mettre en place une utilisation effective de l'émergence et je discuterai de leurs caractéristiques principales qui nous font préférer les SMA pour la programmation émergente.

Introduction : la recherche dans les espaces d'états
Considérons intuitivement ce qu'est la résolution de problèmes au sens large, et donc en premier lieu ce que sont un problème et une solution. Être confronté à un problème signifie en substance que l'état actuel dans lequel nous nous trouvons ne nous convient pas : ses caractéristiques sont indésirables, nous ne possédons pas l'information voulue, les comportements observés ou productibles ne nous conviennent pas, … Une solution à ce problème est alors simplement un autre état qui satisfasse des contraintes précises : ses caractéristiques nous conviennent, nous possédons les bonnes informations, les comportements sont ceux attendus. Par conséquent, la résolution d'un problème constitue le processus et l'ensemble des techniques mises en œuvre pour atteindre cet état solution.

Un exemple minimaliste
Approchons un peu plus formellement un exemple minimaliste : le problème de trouver le "bon" nombre entre 1 et 6. Le "bon" nombre signifie par exemple celui choisi ou tiré au dé par une tierce personne et que nous devons deviner. Il s'agit donc ici de trouver un état particulier parmi 6 états possibles, un état étant simplement le choix d'un nombre. On peut noter qu'il y a exactement 6 états, chacun numéroté sans ambiguïté (espace discret dénombrable fini). L'ensemble de ces états possibles constitue l'espace d'états ou espace de recherche. Proposer une solution à ce problème revient à fournir une façon particulière de procéder afin d'aboutir au bon nombre et constitue donc une stratégie donnée de parcours de l'espace de recherche. Les caractéristiques de la stratégie sont bien sûr de première importance en conditionnant notamment la façon de passer d'un état à un autre (les opérateurs) et les informations nécessaires (et donc comment sont représentés la solution et l'espace d'états).
Pour cet exemple, nous pouvons imaginer deux solutions simples :
Le parcours aveugle ou la stratégie aléatoire : tirage au sort d'un nombre entre 1 et 6. C'est une stratégie très générale car elle ne demande aucune information particulière, ni sur chaque état tiré (à part indiquer le succès ou l'échec), ni sur comment parcourir l'espace d'états, ni sur cet espace en lui-même (si ce n'est que le nombre tiré est un entier compris entre 1 et 6). L'atteinte de l'état solution est ici certaine mais au bout d'un temps qui peut être infini, ce qui n'est pas très efficace, il faut en convenir.
Par dichotomie : le premier nombre proposé est le "milieu" de l'espace de recherche et on partitionne cet espace entre états "plus petits" et "plus grands" que ce "milieu". Cela fonctionne évidemment uniquement si l'espace d'état présente un ordre total, ce qui est le cas ici. Cette stratégie très efficace (ln(6) états parcourus dans le pire des cas) nécessite cependant une connaissance très poussée du problème : l'ordre total des états, des opérateurs pour atteindre ces états, des opérateurs de partitionnement, et le plus important, l'information pour un état donné sous la forme supérieur/inférieur.

Généralisation
Nous pouvons généraliser la recherche d'une solution dans un espace d'états par :
L'état initial : le point de départ dans le processus de recherche. Suivant la stratégie utilisée, cet état initial peut avoir une importance cruciale pour le parcours.
L'ensemble des opérateurs (ou actions) qui permettent les transitions d'un état à un autre.
L'état solution : l'état sur lequel le parcours doit aboutir le plus efficacement possible.
L'espace d'états : l'ensemble des états atteignables par le problème considéré.
La stratégie de parcours : comment et en fonction de quelles informations utiliser les opérateurs pour se déplacer au sein de l'espace d'états.

On peut noter qu'il peut y avoir plusieurs états solutions (ou buts), comme il peut y avoir plusieurs états initiaux, ou simplement que l'état initial est quelconque (aléatoire par exemple). Une autre notion importante est celle de "chemin" : la suite des états parcourus ou des opérateurs exécutés pour ce parcours. La solution du problème peut d'ailleurs ne pas être uniquement l'atteinte de l'état solution mais également le chemin ou parcours effectué. De plus, il peut là aussi exister plusieurs chemins et il est alors souvent nécessaire de pouvoir évaluer ces chemins pour trouver le "plus court".
L'espace d'états est en fait une abstraction du monde du problème (par exemple une abstraction du monde réel limité à certains paramètres importants pour le problème si celui-ci est un problème du monde réel). Et il est toujours possible d'effectuer cette abstraction bien qu'elle produise des espaces d'états très différents en fonction du problème et potentiellement difficilement représentables. La notion de recherche dans un espace d'états et donc une notion très générique et, de façon plus ou moins abstraite, la résolution de problème revient alors toujours à trouver une stratégie de parcours dans un espace d'états pour converger vers un état ou ensemble d'états solutions.
A partir de ce constat, toute forme de parcours est envisageable, d'où l'existence d'approches très variées pour la résolution de problèmes. Il peut ainsi exister des techniques très génériques de parcours qui ne se soucient que peu de la nature de l'espace de recherche, comme des techniques très spécifiques et dépendant fortement de cette nature et d'informations associées.

Calcul évolutionnaire et algorithmes génétiques
Le pan de recherche appelé calcul évolutionnaire (evolutionary algorithms) est l'exemple même de l'approche informatique inspirée de la nature. Partant du constat fascinant de l'incroyable capacité d'adaptation du vivant à son environnement qui produit une variété phénoménale avec pourtant deux caractéristiques fondamentales : la viabilité et l'efficacité. Ce sont deux caractéristiques également indispensables lorsqu'il s'agit de créer des systèmes artificiels : viabilité dans le sens où ces systèmes doivent effectivement exhiber les comportements attendus par l'utilisateur (adéquation fonctionnelle) et cela de façon efficace (optimisation).
Le calcul évolutionnaire repose en premier sur les théories Darwiniennes de l'évolution des espèces par des mécanismes d'héritage génétique et de sélection naturelle. Il repose sur un ensemble de méthodes de résolution et d'optimisation stochastique qui représentent un modèle simplifié des principes biologiques associés et peut alors être considéré comme du "Darwinisme Artificiel".
Les algorithmes génétiques constituent la version la plus étudiée (et une des plus anciennes) de ces techniques qui se différencient dans leurs façons d'aborder les représentations du problème, les mécanismes génétiques et la sélection naturelle concrètement, mais ces versions sont toutes basées sur les mêmes principes de base.

Principe de fonctionnement
Le principe fondamental est la manipulation de populations d'individus qui représentent des points de l'espace de recherche pour un problème donné. Il s'agit alors d'appliquer stochastiquement un ensemble d'opérations sur chacun des individus tout en les catégorisant par générations du processus artificiel d'évolution. Ces opérations sont de deux types distincts : la sélection, basée sur le jugement de la "performance" d'un individu au regard du problème posé (fonction de fitness, i.e. de coût, performance, évaluation), et les mécanismes génétiques, généralement les croisements (crossover) et les mutations, qui produisent de nouveaux individus.
Si ce principe est appliqué correctement, il produit alors une recherche stochastique dynamique dans l'espace de recherche qui converge vers un état d'optimum global pour le problème traité. Une bonne partie du travail théorique autour du calcul évolutionnaire se concentre d'ailleurs sur le problème de la convergence et de l'influence des paramètres sur cette convergence (notamment sa vitesse). Car en dépit de l'apparente simplicité du principe, l'implémentation pour un problème réel peut s'avérer extrêmement compliquée à cause d'une grande sensibilité du processus à de nombreux paramètres (comme le nombre d'individus et les poids des choix stochastiques).
Le traitement d'un problème donné commence par le choix d'une représentation sous forme de génome de chaque état de l'espace de recherche (un génome est un ensemble de gènes qui codent une solution potentielle au problème) et par le choix d'une population d'individus (chaque individu contient un génome et la plupart du temps n'est constitué que de ce génome) théoriquement quelconque (mais l'influence de la population initiale sur le processus peut être primordiale pour certains problèmes). Le processus est alors intégré à une boucle principale au sein de laquelle chaque itération représente une génération et ses individus sont appelés les parents de la prochaine génération. Une itération contient approximativement (de nombreuses variations sont possibles), et dans l'ordre, les étapes suivantes :
Sélection : cette étape sélectionne les parents qui vont être utilisés pour la reproduction en fonction d'une évaluation de la performance ou valeur d'un individu. Cette évaluation est effectuée par la fonction de performance (fitness) qui est censée croître au cours du processus.
Reproduction : les parents sélectionnés sont accouplés au hasard et donnent habituellement deux enfants à partir du génome des parents avec une certaine probabilité d'un croisement (crossover), le point de croisement étant également choisi au hasard. Ensuite chaque enfant, résultant d'un croisement ou non (simple recopie d'un des parents) subit, à nouveau avec une certaine probabilité, une mutation qui peut remplacer certaines parties du génome (création de nouveauté).
Évaluation : les enfants sont alors également évalués par la fonction de performance.
Remplacement : cette étape crée la nouvelle génération d'individus en choisissant les plus aptes parmi le pool des parents et des enfants afin de garder un nombre stable d'individus.
Cas d'arrêt : Le processus s'arrête lorsqu'un certain critère a été atteint, généralement un certain nombre de générations ou un seuil défini pour la fonction de performance.

Références
Le domaine du calcul évolutionnaire trouve ses débuts dans les années soixante avec les travaux de John Holland, L.J. Fogel et Ingo Rechenberg, chacun donnant un nom spécifique à ses travaux, et qui constituent encore aujourd'hui des sous-classes du concept global : algorithmes génétiques pour Holland [Holland 75] [Goldberg 89] [Dejong 75], programmation évolutionnaire (evolutionary programming) pour Fogel [Fogel 66], et stratégies évolutionnaires (evolution strategies) pour Rechenberg [Rechenberg 73] [Schwefel 77]. On peut considérer que Holland était plus intéressé par les processus d'adaptation dans les systèmes naturels alors que Rechenberg et Fogel y voyaient un moyen de résoudre des problèmes d'optimisation. De ce fait, il existe des différences algorithmiques mais les principes restent les mêmes que ceux décrits précédemment.
Cependant, s'il ne fallait citer qu'une seule personne, ce serait John R. Koza avec notamment la série de livres sur la programmation génétique (genetic programming) [Koza 92] [Koza 94] [Koza 99] [Koza 03], problème très proche de la programmation émergente. Ces travaux illustrent bien l'approche par un compte rendu détaillé et une description minutieuse de travaux expérimentaux sur un vaste domaine d'exemples. Bien qu'axés essentiellement sur les Algorithmes Génétiques, ils fournissent de nombreuses données pour la compréhension et la réflexion sur la calcul évolutionnaire en général. Les travaux de Karl Sims poussent également à la réflexion quand on considère les résultats fascinants et surprenants sur les tentatives de déplacement de créatures virtuelles [Sims 94].
Dans la communauté française, on peut par exemple noter les travaux d'Evelyne Lutton [Lutton 03] avec entre autre l'utilisation de fractales pour la compréhension des fonctionnements du calcul évolutionnaire, ou de Michele Sebag [Ratle 03] qui s'est également penchée sur les problèmes de programmation génétique. De façon générale, de nombreux noms de la communauté française se retrouvent lors des régulières Journées Evolutionnaires Trimestrielles (JET) de l'AFIA qui liste également le groupe de travail "Evolution Artificielle" associé.

La question de l'émergence et de la convergence
Pour pouvoir utiliser le calcul évolutionnaire concrètement pour la résolution de problèmes, le principe décrit précédemment doit être implémenté de façon à ce que le processus converge effectivement vers une solution, et cela le plus rapidement possible. Comme pour la discussion sur l'utilisation de l'auto-organisation (cf.  REF _Ref69907343 \r \h 2.2), tout l'enjeu repose sur notre capacité à mettre en place des mécanismes qui permettent au système de progresser vers la solution sans pour autant avoir à lui indiquer explicitement comment y arriver, i.e. lui indiquer le chemin en quelque sorte dans l'espace de recherche.
Une grande partie des mécanismes repose sur une base stochastique : choix des couples de parents, choix des croisements, choix du locus pour le croisement, choix de la mutation, etc… Ces mécanismes ne servent donc en eux-mêmes qu'à explorer rapidement, avec une priorité vers la nouveauté et en évitant le systématique, l'espace des possibilités de solutions. Le seul élément qui indique une "direction" d'exploration est en fait la fonction de performance. Cette fonction, par l'évaluation des individus qui sert ensuite pour leur sélection, va contraindre les opérations stochastiques à parcourir l'espace de recherche d'une manière précise dépendant de cette fonction de performance. En effet on n'effectue ces opérations que sur les individus jugés les plus performants pour espérer obtenir des enfants héritant de la performance des parents. Et ces enfants sont eux-mêmes introduits dans la nouvelle génération seulement s'ils sont jugés performants à leur tour. La fonction de performance est donc le seul attracteur du calcul évolutionnaire.
Or l'histoire du calcul évolutionnaire et les nombreux exemples traités ont montré qu'il peut s'avérer très délicat de trouver la bonne fonction de performance pour un problème donné. Si cette fonction sélectionne de façon erronée les individus, le processus représente alors un simple parcours au hasard de l'espace de recherche. D'autre part, un individu peut dans certains types de problèmes posséder un génome présentant peu de similitudes avec une solution quelconque et pourtant afficher une bonne performance avec certains jugements simplistes de la performance. Ceci n'est pas un problème en soi si l'erreur produite par l'utilisation de cet individu peut être résorbée par le reste du processus.
Mais la tentation est alors grande de ne pas regarder simplement les résultats produits par les individus mais directement leurs génomes. Si un jugement est effectué sur la structure du génome, alors nous introduisons une indication du comment atteindre la bonne solution. Par exemple, s'il s'agit d'individus censés parcourir un labyrinthe, nous pouvons noter que se tourner quatre fois vers la droite successivement ramène à la position initiale et est donc inutile. Le processus peut alors éliminer les parties du génome codant ces quatre opérations au sein des individus présentant de tels génomes. De telles opérations peuvent être utiles quand elles sont réalisables parce qu'elles épurent le génome, mais plus le problème est complexe, moins ce genre d'opérations semble réaliste. Il faut alors noter que ces opérations produisent des effets sur l'évolution des individus qui n'ont absolument rien d'émergent. Rien de surprenant dans le fait que les individus de l'exemple (certes simpliste) ne tournent pas sur eux-mêmes.

Spécificité caractéristique et le problème de la programmation émergente
Comme indiqué dans les références, un pan du calcul évolutionnaire, la programmation génétique, s'intéresse effectivement à produire des programmes, généralement par assemblage d'instructions d'un langage fonctionnel ou équivalent (cf. également l'exemple présenté dans le  REF _Ref69910124 \r \h Chapitre III, point  REF _Ref69910130 \r \h 1.2.2.). Plusieurs caractéristiques du calcul évolutionnaire ont cependant fait porter notre choix sur les SMA à auto-organisation, en particulier intégrant la notion de coopération.
Tout d'abord, la fonction de performance comme seul attracteur pour la convergence ainsi que la difficulté à trouver une fonction efficace poussent vers la recherche d'autres techniques dans l'espoir de ne pas rencontrer les mêmes difficultés. L'utilisation de la coopération lors des opérations d'auto-organisation en est une des idées clés et se place en opposition des opérations stochastiques du calcul évolutionnaire : la coopération constitue un ensemble d'attracteurs à l'intérieur du système.
Ensuite, le principe même de l'évolution implique l'utilisation d'une population d'individus. En pratique, cette population doit être relativement large et le nombre de générations est élevé. Comme de plus il faut juger tous les individus de la population avec la fonction de performance, la puissance de calcul nécessaire est énorme. Mais le problème vient surtout du fait qu'un individu en lui-même n'a rien d'adaptatif : c'est l'espèce (l'ensemble des individus au cours des générations) qui est adaptative. Le calcul évolutionnaire produit en fait un individu, ou un ensemble d'individus au bout d'un certain nombre de générations, puis est censé s'arrêter. On récupère ensuite cet individu pour l'utiliser concrètement. Comment appliquer ceci dans un robot adaptatif plongé dans un environnement dynamique ? On peut imaginer des fonctionnements qui contournent le problème en injectant à chaque génération l'individu le plus performant pour être le contrôle réel du robot, mais les autres individus doivent aussi être évalués par rapport à leurs performances dans l'environnement. Seule la simulation du monde en interne permet le jugement massivement parallèle nécessaire, ce parallélisme que permet la nature mais ne convient pas aux systèmes artificiels que nous voulons concevoir.

Réseaux neuronaux "dynamiques"
De la même manière que l'évolution des espèces a inspiré le Calcul Evolutionnaire, le fonctionnement du cerveau, du moins tel que nous le concevons, a inspiré le domaine des réseaux neuronaux (RN). Dès que les mécanismes de base ont été découverts (neurone, dendrite, axone, propagation de signal, seuil d'activation, …), la fascination n'a cessé de croître pour ces mécanismes pourtant simples qui supportent un vaste panel de fonctions supérieures, de comportements réflexes chez des animaux simples jusqu'à l'intelligence, la conscience et tous les processus cognitifs de haut niveau inhérents à l'être humain. La tentation de reproduire artificiellement ces mécanismes paraît alors toute naturelle.
Un RN est un modèle formel simplifié de l'activité des neurones biologiques, d'autant plus simplifié que la recherche sur le cerveau n'a cessé de progresser et que nous nous rendons compte que les mécanismes de base ne sont en fait qu'une petite partie d'un ensemble beaucoup plus complexe (rôle important de l'activité chimique, complexité de la morphogenèse du cerveau, plasticité continue sur le cerveau adulte, …). Mais ce modèle produit déjà des résultats avancés, ou plutôt ces modèles car de nombreuses variations existent là aussi, se distinguant par des variations techniques ou des évolutions des mêmes principes de base. A strictement parler, nous devrions utiliser l'appellation RNA (pour RN Artificiel) car les fonctionnements techniques finaux sont loin de la complexité de réseaux de neurones biologiques.

Principe de fonctionnement des réseaux neuronaux
Un RN est un réseau composé généralement d'un grand nombre d'unités de calcul très simples (les neurones formels) avec chacun une mémoire limitée. Ces neurones formels sont connectés par des canaux de communications unidirectionnels qui propagent des valeurs numériques traitées telles quelles (pas de communication symbolique). Le fonctionnement des neurones formels est local et ne prend en compte que ses propres données et celles disponibles sur ses connections d'entrée. La plupart des RN ont une règle d'apprentissage qui modifie les poids des connexions en fonction des stimuli présentés en entrée au RN et une certaine classe de RN modifie ces poids également par rétro-propagation d'un feedback. Pour simplifier, les RN "apprennent" par l'exemple comme un enfant apprend à reconnaître une "table" quelle qu'en soit la forme (et donc le concept de "table") uniquement en voyant des exemples de tables.
Dès que l'on crée un RN, au moins les quatre points suivants sont à traiter :
Les caractéristiques des neurones formels : il faut définir comment le neurone formel somme ses entrées, comment il les transforme en fonction d'activation, comment fonctionne son seuil d'activation, comment ce seuil d'activation se modifie au cours du temps, et comment l'activation est modifiée pour être propagée sur son axone (ses sorties).
La connectivité : il faut spécifier les connexions des neurones formels (quel neurone est connecté avec quel autre, avec la distinction entrée/sortie). Il s'agit en fait de définir le graphe à arcs directionnels représentant le réseau. Une des caractéristiques principales de ce graphe est l'association de "poids" sur les arcs. Ces poids qui varient au cours du temps servent au calcul de la propagation des signaux et représentent en quelque sorte la "connaissance" acquise par le RN. On choisit alors généralement de représenter le RN par une matrice qui liste l'ensemble des poids pour chaque connexion entre deux neurones formels, un poids nul signifiant l'absence de connexion. Il faut noter qu'il existe deux catégories de neurones formels particulières, distinguables par le fait qu'ils possèdent au moins une connexion à autre chose qu'à un neurone formel. La couche d'entrée regroupe les neurones dont une entrée au moins est connectée à l'extérieur du RN, i.e. à son environnement (par exemple un capteur quelconque pour un robot). Symétriquement, la couche de sortie regroupe les neurones formels dont une sortie au moins est connectée à l'environnement du RN (par exemple un affichage, ou un effecteur pour un robot) et représente le résultat produit par le RN.
La répartition des poids dans la matrice donne également une information sur le type de RN représenté en fonction de la répartition des connexions. On peut par exemple reconnaître l'existence ou non de boucles au sein du RN, ces boucles étant importantes pour la caractéristique de non-linéarité. Il existe également des RN à connexité totale (tout neurone est relié à tout autre dans les deux directions).
La règle de propagation : il faut spécifier comment un signal d'activation se propage en sortie d'un neurone formel jusqu'aux entrées des neurones avec lesquels il est connecté. Généralement, une version très simple est utilisée qui se contente de propager à tous les neurones de sortie en un temps unitaire le stimuli d'activation produit en sortie. Mais des versions prenant en compte un temps de propagation ou une atténuation du signal existent.
La règle d'apprentissage : il s'agit de spécifier comment les poids sur les liens reliant les neurones se modifient au cours du temps. Une des règles les plus simples consiste par exemple à considérer que le poids d'un lien entre deux neurones augmente quand l'activation de l'un entraîne de façon répétée et persistante l'activation de l'autre. Il existe de nombreuses variations de ce principe mais elles sont toutes limitées par le fait de ne produire qu'une augmentation des poids. D'autres mécanismes sont alors rajoutés pour pouvoir diminuer également les poids.

Réseaux neuronaux "dynamiques"
La partie la plus importante de l'apprentissage chez l'Homme se faisant pendant la petite enfance alors que la morphogenèse du cerveau est très importante, et se poursuivant encore chez l'adulte, il semble naturel d'affirmer que ce processus est primordial. Pourtant, la plupart des approches des RN imposent une topologie relativement statique du réseau. Des travaux plus récents commencent à s'intéresser aux mécanismes permettant de conférer aux RN la plasticité de leurs pendants biologiques. Il s'agit alors de permettre la création de neurones au sein du réseau ainsi que l'apparition de liens entre neurones n'en possédant pas initialement.
La capacité d'auto-organisation du RN se trouve alors décuplée et l'apparition de comportements réellement nouveaux produirait un potentiel d'adaptation et d'apprentissage certainement plus proche de son modèle biologique. On parle alors de RN "dynamiques" mais il faut noter que cette appellation n'est pas généralisée, le terme de "dynamique" étant par ailleurs également utilisé pour certains ajustements de poids au sein de RN plus classiques.
Cette approche n'en est concrètement encore qu'à ses débuts comme le montre le travail bibliographique de Emile Fiesler [Fiesler 94] sur ce sujet et la visibilité réduite de ce champ depuis. Elle nous semble pourtant indispensable pour profiter pleinement du principe d'auto-organisation.

Références
L'origine des RN est relativement ancienne puisque qu'elle date des années quarante, bien avant que l'on puisse réellement simuler sur ordinateur les fonctionnements théoriques développés alors. Mais l'évolution de la discipline ne s'est pas faite en continue jusqu'à nos jours. En effet, les fluctuations des courants de pensée dans l'I.A. en général avec notamment la forte poussée du symbolisme ont fait varier l'intérêt (comme les financements) de la discipline. Il est alors intéressant de présenter les références du domaine dans un historique classé par périodes comme cela a été fait dans plusieurs historiques :
Les premier essais : McCulloch et Pitts [McCulloch 43] ont été les premiers à proposer un modèle inspiré des connaissances en neurologie de l'époque à l'aide de logique formelle. Les premiers essais par simulation sur des ordinateurs ont étés réalisés par Farley et Clark en 1954 [Farley 54] puis l'on retrouve Rochester et Holland [Rochester 56] également parmi les premiers à s'intéresser au RN. On peut noter dès les débuts une étroite collaboration avec les neurologues qui se poursuit encore de nos jours.
Une nouvelle technologie prometteuse : en plus de l'influence des neurologues, les RN ont alors reçu des apports variés de psychologues, pour des aspects d'apprentissage et de cognition, ainsi que de mathématiciens et d'ingénieurs pour les aspects techniques. Rosenblat [Rosenblat 58] développe alors le célèbre principe du Perceptron avec sa couche d'entrée, de sortie et couche cachée (dite d'association), qui permet l'apprentissage d'association entre des entrées données et des sorties spécifiques. Widrow et Hoff [Widrow 60] développent de leur coté le système ADALINE (ADAptive LInear Element) qui se distingue surtout du Perceptron par une règle d'apprentissage différente, ce qui lance alors l'intérêt pour explorer des pistes très diverses de fonctionnement pour les RN.
Frustration et discrédit : en 1969, Minsky et Papert [Minsky 69] publient un livre dans lequel ils généralisent les limitations des Perceptrons simple couche à des systèmes multicouches en qualifiant amèrement cette voie de "stérile". Les financements pour les RN ainsi que l'intérêt général s'en trouvent pour le moins diminués.
Période d'innovation : malgré un intérêt général réduit, quelques chercheurs continuent leurs travaux et pendant cette période, plusieurs paradigmes ont été produits, développés encore actuellement. Citons les travaux de Steve Grossberg [Grossberg 88] avec l'ART (Adaptive Resonance Theory), de A. H. Klopf [Klopf 72] sur l'apprentissage par hétérostase, de Paul Werbos [Werbos 74] sur la rétro-propagation très utilisée dans les travaux actuels, ou de F. Kunihiko [Fukushima 75] sur le Cognitron à base de RN multi-couche capable de reconnaître l'écriture manuscrite.
Renaissance : ces avancés ont alors contribué à relancer l'intérêt pour les RN et permis à une importante communauté de se créer, et qui produit de nos jours une quantité significative de travaux.

On peut trouver des informations très complètes sur les détails des fonctionnements des différents types de RN dans les livres d'Anderson [Anderson 95] et de Hertz, Krogh et Palmer [Hertz 91]. Le récent livre "Understanding Intelligence" de Rolf Pfeifer et Christian Scheier [Pfeifer 01] présente également une discussion très intéressante sur les limitations des RN actuels face au "Symbol-Grounding Problem" (le problème de la capacité d'un système artificiel à associer un objet ou une action du monde réel à une représentation symbolique de celui-ci).
Par ailleurs, on peut constater que des travaux sur les RN et sur les Agents se rejoignent, mais il s'agit pour la grande majorité d'intégrer simplement un RN au sein de l'agent pour lui donner des capacités d'apprentissage. Ces travaux ne s'intéressent aucunement à intégrer les mécanismes des RN au sein de SMA pour contribuer à la capacité d'auto-organisation de ceux-ci.

L'apprentissage et la question de l'émergence
Dans leur principe de base, les RN reposent entièrement sur les concepts d'auto-organisation et d'émergence : des règles locales de base d'interaction entre de nombreuses entités qui produisent au niveau global des comportements de plus haut niveau qui ne sont pas décrits au sein des règles. Si on leur rajoute en respectant toujours ces principes des capacités de création de neurones formels et d'apparition de nouveaux liens, ils présentent une technique intéressante pour la résolution de problèmes par émergence.
Mais encore une fois, le principe peut être biaisé par l'application technique. Le point délicat pour les RN réside dans l'apprentissage imposé au réseau. Sous certaines formes, cet apprentissage peut en effet introduire artificiellement au sein du réseau en devenir les caractéristiques observées en sortie censées être émergentes. Les pages 167 à 177 du livre cité dans le point précédent, "Understanding Intelligence" [Pfeifer 01], contiennent une discussion détaillée de ce problème avec notamment les présentations des différences entre apprentissage supervisé, par renforcement, ou non supervisé, et leurs conséquences, ainsi qu'un exemple d'application pour illustrer les propriétés émergentes ou non. Il s'agit de l'application NETTalk qui a pour but de prononcer correctement du texte anglais donné en entrée. Les auteurs montrent qu'une partie du comportement appris est effectivement émergent (l'association réussie des lettres en fonction de leur contexte avec les bons phonèmes), mais que la distinction entre consonnes et voyelles au sein même de la couche cachée qu'un observateur pourrait juger émergent, est en fait induite par le fait que cette distinction se trouve déjà dans les exemples fournis au système (les phonèmes ne sont pas les mêmes pour les voyelles et les consonnes).
Il est délicat d'argumenter sur l'apprentissage dans les RN sans exemple détaillé et je préfère renvoyer à la lecture de ce passage plutôt que de m'y attarder ici, d'autant plus que les RN ont d'autres caractéristiques inappropriées pour le problème de la programmation émergente comme je le détaille au point suivant.

Spécificité caractéristique et le problème de la programmation émergente
Tout d'abord, dans leur grande majorité, les RN présentent des neurones formels homogènes, i.e. aux mécanismes identiques. Quand les RN incluent des types de neurones formels différents, il s'agit en fait seulement de faire varier la sommation des entrées, le seuil d'activation ou autre ajustement du même principe fondamental inspiré des neurones biologiques. Or la programmation émergente, de par son lien avec les langages de programmation, implique forcément des entités aux fonctionnements très variés. En fait, les instructions d'un langage sont justement choisies afin de fournir une expressivité maximale au langage et il en existe donc un grand nombre aux fonctionnements très spécifiques répondant à des besoins ne rentrant pas dans une seule catégorie avec variation.
Ensuite, une fois l'apprentissage effectué, tout le fonctionnement du RN repose sur les poids des liens (dont la matrice représentative représente en fait la fonction apprise) et les variations possibles des poids donnent les différentes fonctions du RN. Or le principe de la programmation émergente repose sur l'association d'une structure d'organisation donnée à la fonction produite. Pour changer de fonction, la structure de l'organisation doit changer. En fait, lors du calcul à proprement parler, un système reposant sur des instructions doit simplement déclencher les instructions dans l'ordre, l'intensité du signal de déclenchement importe peu : une donnée qui circule est forcément activante pour l'instruction qui la reçoit.
Ces distinctions reposent en fait sur la nature très différente des fonctionnements des RN et de la programmation émergente. Les RN reposent sur un parcours continu de l'espace de recherche dû aux modifications continues du réseau (changements des poids) afin de produire une fonction généralement continue (changements continus en fonction des changements continus des entrées). La programmation émergente nécessite, elle, des mécanismes discontinus (modification de l'organisation) qui produisent une fonction en général discontinue (un programme peut réagir très différemment suivant ses entrées). Une discussion sur ces distinctions se trouve au  REF _Ref70059603 \r \h Chapitre I, partie  REF _Ref70059611 \r \h 6.
Si par contre on pousse plus loin le principe des RN dynamiques avec l'apparition de neurones et de liens qui permettent alors des changements structurels poussés, et si on rajoute des neurones aux fonctionnements variés calqués sur des instructions, ainsi que des stratégies locales d'interaction et d'auto-organisation entre les neurones formels ainsi définis, la programmation paraît alors abordable. Mais ne sommes nous pas par ces modifications en train de transformer les neurones formels en agents et les RN en SMA ?

Algorithmes de colonies de fourmis et optimisation par essaims particulaires
Les algorithmes de colonies de fourmis (ACF) et les techniques d'optimisation par essaim particulaires (PSO pour particle swarm optimisation) sont deux techniques beaucoup plus récentes s'inspirant de comportements observés dans la nature. Ces deux techniques sont en quelque sorte plus précises et spécifiques que le calcul évolutionnaire ou les réseaux neuronaux artificiels, dans le sens où elles s'inspirent de comportements très précis. Pour les ACF, les mécanismes miment ceux donnés par les éthologues quant aux comportements de fourragement des fourmis, et pour les PSO, ceux attribués aux comportements d'essaim observés dans les bancs de poissons ou les vols d'oiseaux.
J'ai regroupé ces deux techniques ici à cause des similitudes entre elles, mais surtout de par leur proximité conceptuelle avec le principe d'auto-organisation. J'en conclus de ce fait, et grâce aux propriétés génériques des SMA, qu'il peut être envisageable de les redéfinir sous forme de SMA, ou tout du moins de réutiliser leurs principes lors de la définition des mécanismes d'auto-organisation pour les SMA.

Algorithmes de colonies de fourmis
Cette approche trouve son origine dans la description du fourragement des fourmis, et en particulier de leur capacité à trouver le plus court chemin du nid vers la nourriture, en termes de mécanismes simples reposant principalement sur le dépôt de phéromone et l'orientation en fonction des traces de phéromones présentes dans l'environnement. Les premiers travaux sont dus à Colorni, Dorigo et Maniezzo [Colorni 92] et proposent une modélisation algorithmique qui représente des mécanismes collectifs de résolution de problèmes par stigmergie. La stigmergie est le principe décrit initialement en biologie selon lequel des communications indirectes au travers de la modification de l'environnement produisent des comportements spécifiques sur le collectif.
Concrètement, les fourmis naturelles déposent des substances volatiles appelées phéromones qui servent de moyen de communication. Elles sont en effet très sensibles à cette phéromone et ont une tendance à suivre les dépôts qui sont de véritables pistes ou chemins pour la colonie. Un certain nombre des décisions des fourmis restent cependant stochastiques, ou c'est du moins comme cela que nous pouvons les considérer, et permettent l'exploration de zones non encore explorées, tout comme le choix aléatoire pondéré entre deux pistes de phéromones. Mais la donnée principale réside dans le suivi prioritaire de plus grandes quantités de phéromones. La capacité à trouver le chemin le plus court se comprend alors en fonction de cette préférence : le plus court chemin accumule plus rapidement des phéromones car les fourmis mettent moins de temps à effectuer les déplacements entre le nid et la nourriture, et les fourmis "préfèrent" alors progressivement ce chemin parce qu'il présente une concentration plus élevée de phéromone (cf.  REF _Ref70068221 \h Figure 6). L'évaporation naturelle de la phéromone renforce encore plus cette tendance par l'affaiblissement des chemins plus longs.
Il existe alors différentes variations du même algorithme de base qui se contente d'accumuler suivant une formule donnée la phéromone virtuelle sur les chemins possibles d'un problème donné, de définir une règle de déplacement appelée "règle aléatoire de transition proportionnelle" [Bonabeau 99] et de calculer l'évaporation de la phéromone (règle de mise à jour des chemins). Les problèmes du type "voyageur de commerce" se prêtent particulièrement bien à cette approche.

Optimisation par essaims particulaires
L'analogie est ici faite avec les déplacements collectifs observés chez certains animaux et basée uniquement sur l'observation locale du comportement des voisins. L'approche par PSO (Particle Swarm Optimisation) a été principalement définie par Kennedy et Eberhart [Kennedy 95] [Eberhart 01] et repose sur l'apparition de dynamiques collectives particulières ne dépendant que des comportements locaux des individus en fonction de paramètres tels que la position et la vitesse des voisins proches. L'exemple classique est le comportement d'évitement d'un banc de poissons confronté à un prédateur. On suppose que les poissons n'ont que des comportements définis sous forme de "rester proche des voisins", "ne pas entrer en collision", "se déplacer à la même vitesse", ajouté à l'évitement individuel d'un prédateur ou d'un obstacle quand celui-ci est suffisamment proche pour être détecté.
Il est alors aisé d'imaginer l'implication de l'approche d'un prédateur pour les déplacements du banc entier : les poissons percevant le prédateur effectuent des trajectoires pour l'éviter et les autres poissons se contentent de calquer leurs mouvements de proche en proche. L'ensemble du banc de poisson effectue alors un déplacement d'évitement alors qu'il n'a été initié que par quelques poissons. La plupart des poissons ont pu d'ailleurs ne pas se rendre compte de la présence du prédateur, si ce n'est par l'accélération des déplacements.
L'algorithme formel repose sur la définition de particules possédant un vecteur de déplacement ainsi que des "voisins". Ce voisinage peut prendre des formes variées et n'est pas forcément spatial. L'évolution du vecteur de déplacement est alors calculée en fonction des déplacements précédents couplés avec les déplacements des particules voisines. Si l'on rajoute une évaluation de la position des individus, et que cette évaluation influe pour la prise en compte de l'importance des différents voisins d'une particule donnée, le principe de la PSO permet alors d'explorer l'espace de recherche pour atteindre de meilleures positions, pour un individu donné ou pour le collectif.
Les références précédentes présentent exhaustivement le domaine et une synthèse en français peut se trouver dans [Clerc 02].

L'auto-organisation évidente et la question de l'émergence
Les deux approches précédentes ainsi que diverses autres reposant sur le même genre d'inspiration sont généralement regroupées sous les termes d'"Intelligence Collective". Il s'agit en fait d'inspirations directes de phénomènes naturels cités comme exemples de phénomènes d'auto-organisation. Il s'agit à chaque fois de reposer la résolution du problème sur les conséquences de l'interaction d'un certain nombre d'individus agissant selon un comportement défini uniquement par des règles locales aux individus. De plus, dans les principes exposés, ces règles ne sont pas informées du but global et de comment l'atteindre.
La forme du parcours de l'espace de recherche est alors bien un phénomène émergent dans le sens où aucune information n'explicite ce parcours. Mais il est bien entendu facile d'introduire au sein de l'algorithme générique des informations constituant un biais pour la recherche de la solution. Nous ne pouvons qu'insister sur le fait que dans les problèmes réels difficiles, ceci est irréaliste.

Retour aux SMA
Les approches par Intelligence Collective semblent particulièrement intéressantes pour une approche de la résolution de problèmes par émergence. Elles possèdent cependant des caractéristiques particulières qui nous semblent restrictives. En effet, chacune est très proche de son pendant biologique et en prend donc les formes particulières, spécifiques à chacun des modèles. Il est alors souvent difficile de les réutiliser pour des problèmes présentant des topologies ou contraintes différentes. Une forte traduction et adaptation sont alors nécessaires. De plus, elles reposent en général chacune sur un mécanisme d'auto-organisation particulier et se restreignent à n'utiliser que celui-là : phéromones pour les ACF, déplacement des voisins pour les PSO, par exemple.
Considérons maintenant le paradigme des SMA. Au final, il présente surtout une structure générale, une "vue" de haut niveau des systèmes sous forme d'entités en interaction. Manipuler n'importe quel programme ou considérer n'importe quel phénomène comme un SMA revient simplement à le structurer sous forme d'agents et à définir leurs comportements. Or justement, rien ne spécifie ces comportements dans les définitions des SMA, si ce n'est de donner toutes les possibilités relatives à cette vision systémique sous forme d'accointances, de croyances, etc… Les SMA apparaissent alors comme une technique extrêmement générique au sein de laquelle toute forme de fonctionnement est définissable. Ceci explique d'ailleurs l'utilisation de plus en plus répandue des SMA ou simplement des agents dans des domaines et pour des utilisations très variés.
En ce qui concerne l'auto-organisation dans les SMA, il suffit en fait d'expliciter les mécanismes régissant les comportements des agents en accord avec les caractéristiques particulières du principe d'auto-organisation. Dès lors, rien ne nous empêche de redéfinir les algorithmes des approches par Intelligence Collective en terme de SMA : il suffit d'introduire les mêmes mécanismes au sein des agents. Dès lors, nous pouvons également combiner les diverses inspirations biologiques en donnant plus de possibilités aux agents. De plus, le fonctionnement concret des SMA est certainement plus proche des modèles biologiques (simulation des interactions plus réalistes).
Approcher la résolution de problèmes par des SMA basés sur des mécanismes d'auto-organisation signifie alors explorer la variété de mécanismes possibles dans un cadre générique les supportant. Nous avons ainsi une grande liberté qui permet à la fois de se reposer sur une combinaison d'inspirations issues de toutes les techniques présentées précédemment, comme d'explorer de nouvelles voies.

Autres techniques
Il existe de très nombreuses techniques de résolution de problèmes que l'on retrouve souvent sous l'appellation de "méthodes d'optimisation". Elles vont de techniques très pointues seulement applicables à une poignée de problèmes (car utilisant des connaissances précises sur la nature de l'espace de recherche et des solutions) à des approches très génériques, certaines se contentant de donner une idée générale de comment procéder.
Nous pouvons ainsi citer la méthode du Recuit Simulé inspirée de phénomènes physiques tels que l'agencement ordonné des spins magnétiques dans un morceau de métal au fur et à mesure que la température décroît, qui est un exemple classique d'émergence (des travaux sur les SMA s'en sont d'ailleurs inspirés comme ceux de Khaled Ghédira et T. Daouas [Daouas 94]). Cette méthode repose sur une gestion du désordre et de l'ordre en fonction d'un paramètre général (la température) décroissant lentement. La modification progressive des déplacements de molécules donnant les cellules de Bénard est une autre façon de considérer les mécanismes de cette technique. Nous pouvons également citer la recherche avec Tabous qui est une technique plutôt générale mais limitée dans ses applications. Il s'agit simplement de stratégiser les déplacements dans l'espace de recherche en choisissant les "meilleurs" états possibles (même s'ils sont moins bons que le précédent) et en gérant une mémoire qui évite de retomber trop directement dans l'état précédent (pour éviter les minima locaux).
L'excellent livre "Métaheuristiques pour l'optimisation difficile" de Dréo, Pétrowski, Siarry et Taillard [Dréo 03] présente de façon claire et précise un grand nombre de ces techniques, avec entres autres, en plus des techniques précédentes :
des variantes du recuit simulé (diffusion simulée, recuit microcanonique, méthodes du seuil, du "grand déluge", du "voyage de record en record");
la méthode du bruitage;
la méthode de recherche distribuée;
la méthode Aliénor;
les algorithmes à estimation de distribution;
la méthode GRASP;
la méthode "Cross-Entropy";
les systèmes immunitaires artificiels;
l'évolution différentielle;
d'autres algorithmes inspirés des insectes sociaux.

Il faut noter que la plupart présentent des caractéristiques très spécifiques qui contraignent fortement leur utilisation. L'idée principale que je voudrais faire ressortir de ce premier chapitre est l'utilisation de cette grande variété comme source inépuisable d'inspirations diverses afin de définir des mécanismes d'auto-organisation puissants et génériques pour des SMA. La capacité à exhiber des phénomènes émergents me paraît être primordiale pour les problèmes que nous voulons traiter, en particulier celui de la programmation émergente. C'est pourquoi j'ai présenté tout au long de ce chapitre des discussions sur les conséquences des règles et mécanismes d'auto-organisation qui veulent montrer qu'il est délicat de rester dans un cadre strict d'auto-organisation et conduisant ainsi à des phénomènes émergents.
Théorie AMAS Technologie AMAS
Ce chapitre présente les fondements sur lesquels s'appuie mon travail de thèse. Il résulte surtout des travaux de l'équipe durant ces dix dernières années et est le fruit théorique des réflexions autour de nombreux problèmes traités expérimentalement. De ces systèmes artificiels traités au cas par cas, l'équipe a extrait les bases théoriques présentées ici dans la partie "Théorie AMAS" (AMAS pour Adaptive Multi-Agents Systems). La façon d'appliquer concrètement et génériquement cette théorie au moment de la conception d'un système artificiel a été regroupée sous l'intitulé "Technologie AMAS". Je présente également brièvement dans ce chapitre ce vers quoi tend une partie des efforts actuels de l'équipe : le développement d'une méthodologie de conception pour servir de guide dans l'utilisation de l'approche AMAS pour la résolution de problèmes. Et les derniers points traités ici concernent l'apport de mon travail dans celui de l'équipe et pour la théorie AMAS, ainsi qu'une réflexion sur une catégorisation des problèmes traités par l'équipe.

Introduction aux travaux de l'équipe
Comme je l'ai montré dans l'introduction et dans l'état de l'art, la résolution de problèmes présente des façons très diverses d'aborder la multitude de cas instanciés des situations du monde réel que nous nous efforçons de traiter depuis les débuts de l'informatique. Et cette diversité ne concerne pas seulement les techniques utilisées. En effet, il y a des différences plus fondamentales, l'une concernant par exemple le caractère émergent du fonctionnement interne, ce que j'ai étudié tout au long de l'état de l'art. C'est à mon sens, bien sûr, un aspect fondamental dans les futures approches de la résolution de problèmes.
Mais de la même façon, la technique utilisée pour traiter le problème n'influe pas seulement sur la façon de le résoudre mais également sur la nature même du problème (dans le sens où la technique peut éventuellement le dénaturer). C'est donc également un critère à prendre en compte. Ce sont ces deux points que j'aborde dans la suite de l'introduction aux travaux de l'équipe.

Au sujet des systèmes multi-agents
L'expression "cas instanciés des situations du monde réel" utilisée précédemment signifie qu'une transformation, sous forme de simplification et de formalisation, est effectuée sur la situation qui est le sujet d'étude afin de pouvoir y appliquer un traitement automatique informatisé. Or cette simplification, bien que nécessaire au traitement, éloigne souvent le problème effectivement traité de la situation réelle. Par exemple, l'introduction d'un fonctionnement basé sur des probabilités, même s'il semble bien refléter le fonctionnement réel, ne peut en aucune façon traduire toute la complexité du monde réel et atteint rapidement ses limites dès que le comportement du problème sort un tant soit peu des bornes prévues par le modèle. On peut au final avoir une résolution très satisfaisante pour l'esprit mais qui ne va en fait s'appliquer aux cas réels que dans des bornes bien précises. Ceci est, à mon sens, rédhibitoire pour un bon nombre de problèmes.
Avec l'augmentation de la puissance de calcul, l'approche par systèmes multi-agents permet peut-être une des approximations les plus justes du monde réel, car seule la limite de la puissance réfrène la complexité du fonctionnement et des interactions au sein du système. Comme la modélisation sous forme d'un système multi-agent est souvent très intuitive car reflétant structurellement ou fonctionnellement le problème réel dans bien des cas, il suffit de complexifier le fonctionnement du système pour se rapprocher d'un fonctionnement réel. Ainsi, lorsqu'une résolution est trouvée dans le système artificiel, elle reflète mieux une solution du problème réel. C'est certainement l'une des raisons qui ont conduit nos travaux à se focaliser sur cette technique, i.e. pour rester "proche" des problèmes réels.

L'approche émergente comme fondement
Tout en considérant l'importance du choix de la technologie utilisée, la ligne directrice fondamentale est cependant l'utilisation de la notion d'émergence. Pourquoi avoir décidé d'aborder la résolution de problèmes avec une approche émergente ? Très tôt, lors des premières tentatives de résolutions de problèmes, il est apparu que dès que les problèmes traités s'éloignaient de "toy problems", les stratégies ou techniques de résolution classiques devenaient de plus en plus difficiles à appliquer. Plus le problème est complexe, plus les algorithmes de résolution classiques, qui peuvent toujours être vus comme des algorithmes de recherche dans des espaces d'états, ont besoin d'être informés. Ce problème est dû à l'utilisation d'une fonction de coût.
En se référant à [Wolpert 95] [Wolpert 97], on peut dire qu'en général aucun mécanisme d'adaptation ou d'apprentissage qui impose l'utilisation et donc la connaissance d'une fonction de coût est meilleur qu'un autre, que l'algorithme soit centralisé ou distribué. C'est le "No Free Lunch theorem for search" : "In our investigation of the search problem […] the first question we addressed was whether it may be that some algorithm A performs better than B, on average. Our answer to this question, given by the NFL theorem is that this is impossible". Cela signifie que n'importe quelle technique se basant sur une fonction de coût nécessite une connaissance spécifique au domaine d'application pour être efficace. Cette nécessité d'un biais empêche une technique d'être plus efficace qu'une autre lorsque le corpus de test est suffisamment large.
Or justement, la complexité croissante des problèmes auxquels nous nous confrontons rend sinon impossible, du moins particulièrement ardue la tâche de trouver la "bonne" fonction de coût pour un problème donné qui permettra une résolution efficace. Nous pensons donc qu'il est nécessaire de trouver une méthode de résolution de problèmes ne se basant pas sur des fonctions de coût ou en tout cas qui ne soient pas spécifiques à un problème.
En se référant aux définitions de l'émergence et de l'auto-organisation (cf.  REF _Ref71960367 \n \h  \* MERGEFORMAT Chapitre I), on peut dire que si une fonction de coût globale (ou autre information explicite) était utilisée au niveau inférieur par les parties du système comme mécanisme d'adaptation, le résultat ne serait pas émergent au sens strict du terme. Car nous pourrions alors décrire, expliquer ou prédire ce qui se passe au niveau global (au niveau du système). Donc, si nous parvenons à développer une résolution se basant effectivement sur l'émergence, c'est-à-dire à appliquer l'émergence telle qu'elle existe dans les systèmes naturels aux systèmes artificiels, ce sera sans l'utilisation d'une fonction de coût, ni spécifique, ni explicite; en d'autres termes sans sa connaissance par le concepteur du système.
Le système, tout en étant capable d'adaptation, serait alors en dehors des limites fixées par le No Free Lunch Theorem. Nous aurions alors trouvé une façon générale, ne nécessitant aucunement des connaissances spécifiques, de résoudre des problèmes. D'où notre intérêt pour une approche explorant les moyens de concevoir des systèmes artificiels capables de s'adapter en utilisant les mécanismes de l'émergence.

La théorie AMAS
Cette partie pose les bases théoriques qui permettent à un système, dont les seuls critères d'auto-organisation sont de nature strictement locale aux entités le composant, d'atteindre l'adéquation fonctionnelle. Cette notion est définie par la suite, ainsi qu'un certain nombre d'axiomes et de lemmes qui conduisent à un théorème qui justifie l'interdépendance qui peut exister entre un comportement local coopératif et l'adéquation fonctionnelle de la fonction globale collective.
Théorème de l’adéquation fonctionnelle
Le théorème suivant, sur lequel se base la théorie AMAS, traite de l'adéquation fonctionnelle (voir Note 1) de systèmes artificiels, l’adéquation fonctionnelle d’un système étant un jugement effectué par un observateur sur la pertinence de son activité dans l’environnement. Il permet de se consacrer à l'étude et l'élaboration de systèmes à milieu intérieur coopératif (voir Note 2) afin d'obtenir des systèmes fonctionnellement adéquats.

Théorème. Pour tout système fonctionnellement adéquat, il existe au moins un système à milieu intérieur coopératif qui réalise une fonction équivalente dans le même environnement.
Note 1 : Au sujet de l'adéquation fonctionnelle. "Fonctionnelle" réfère à la "fonction" du système, c'est-à-dire ce que le système est en train de faire ou de produire, ce qu'un observateur jugerait comme étant le comportement du système. Et "adéquat" signifie simplement que le système est en train de faire "ce qu'on lui demande", d'avoir le "bon" comportement, jugé par un observateur ou par l'environnement. Donc l'"adéquation fonctionnelle" d'un système peut être vue comme le fonctionnement permettant d'avoir "le comportement approprié pour la tâche en cours".
Note 2 : Au sujet du milieu intérieur coopératif. Un système possède un "milieu intérieur coopératif" lorsqu'il n'existe plus, en son sein, de "situations non coopératives" (cf.  REF _Ref47500761 \w \h 3.2 -  REF _Ref47500761 \h  \* MERGEFORMAT Les Situations Non Coopératives (SNC) pour une définition des SNC). On peut cependant se faire une première idée intuitive de la coopération en termes d'absence de problèmes, conflits, inutilité, etc, tirés de la métaphore sociale.
La démonstration de ce théorème [Camps 98] se déduit de l’application de l’axiome et des quatre lemmes suivants par des opérations de surjection et d’inclusion d’ensembles. Je ne présente pas ici les démonstrations mais une petite explication textuelle suit chacun d'eux.

Axiome. Si un système n'a aucune activité antinomique sur son environnement alors il est fonctionnellement adéquat.
Note 3 : au sujet d'antinomique. Une "activité antinomique" signifie que cette activité va à l'encontre des intérêts d'une autre entité.
La véracité de cet axiome ne peut pas être prouvée, car il faudrait un observateur extérieur à l'activité de tous les systèmes évoluant dans un certain univers physique, tout en n'interagissant aucunement avec celui-ci afin de ne pas le perturber.

Lemme 1. Tout système coopératif est fonctionnellement adéquat.
La démonstration s’appuie sur l’axiome précédent, car par définition un système coopératif n’a pas d’activité antinomique ou indifférente.

Lemme 2. Pour tout système S fonctionnellement adéquat, il existe au moins un système coopératif S* qui soit fonctionnellement adéquat dans le même environnement.
La démonstration consiste en la déconstruction du système S pour en construire un nouveau S*. Elle est réalisée en quatre étapes : définir un algorithme de construction d'un système coopératif, montrer que cet algorithme se termine, montrer que le système coopératif obtenu est équivalent au système initial pour l'environnement, montrer que le nouveau système est fonctionnellement adéquat.

Lemme 3. Tout système à milieu intérieur coopératif est un système coopératif.
Le milieu intérieur correspond aux parties du système ainsi qu’aux supports physiques nécessaires à leurs échanges. Un système à milieu intérieur coopératif possède des échanges coopératifs avec son environnement, car ceux-ci sont un sous-ensemble des échanges que réalisent ses parties.

Lemme 4. Pour tout système coopératif, il existe au moins un système à milieu intérieur coopératif avec une fonction équivalente dans le même environnement.
La méthode est identique à celle du lemme 2. La particularité réside dans l’objet de la construction qui est maintenant chaque partie du système.
Le théorème de l'adéquation fonctionnelle permet de ne s’intéresser qu’à des systèmes très particuliers (à milieu intérieur coopératif) pour obtenir des systèmes fonctionnellement adéquats dans un environnement donné (cf.  REF _Ref47513039 \h Figure 7).
Ces systèmes possèdent plusieurs propriétés permettant de situer cette théorie dans les théories de l’émergence :
Que l’application matérielle de cette théorie s’incarne ou non par des agents, elle se situe dans le cadre de la théorie des systèmes.
Un système coopératif dans l'environnement est fonctionnellement adéquat, ce qui lui évite de connaître la fonction globale qu’il doit réaliser pour s'adapter.
Même si un système n’a pas de but, il peut agir pertinemment dans son milieu. En fonction de ses perceptions de l'environnement, des représentations qu’il en possède et de ses compétences, il agira au mieux pour que son comportement soit coopératif.
La notion de rétroaction n'est pas contraignante dans cette théorie car le système doit seulement juger si les changements s’opérant dans le milieu sont coopératifs de son point de vue sans savoir si ces changements sont dépendants de ses propres actions passées.

En conséquence, cette théorie vérifie les conditions que j'ai énoncées dans l'étude sur l'émergence ( REF _Ref46116486 \w \h  \* MERGEFORMAT -ð -  REF _Ref71960367 \h  \* MERGEFORMAT Le phénomène d'émergence et son utilisation :  REF _Ref47513541 \w \h  \* MERGEFORMAT 1.1.2 -  REF _Ref47513545 \h  \* MERGEFORMAT Définition et  REF _Ref41881828 \w \h  \* MERGEFORMAT 1.2 -  REF _Ref41881828 \h  \* MERGEFORMAT L’émergence en informatique), ce qui la positionne comme une théorie de l’émergence. Je rappelle ici la définition "computationnelle" de l’émergence posée dans l'étude sur l'émergence, en insistant sur le troisième volet qui précise la technologie AMAS utilisée conjointement à la théorie et dont je montre dans la suite du chapitre qu'elle se satisfait particulièrement bien du paradigme multi-agent.

Objet
Un système informatique a pour finalité de réaliser une fonction adéquate à ce que l'on attend du système. C'est cette fonction, pouvant évoluer au cours du temps, que nous voulons faire émerger. Condition
Cette fonction est émergente si le codage du système ne dépend aucunement de la connaissance de cette fonction. Ce codage doit contenir des mécanismes permettant l'adaptation du système au cours de ses échanges avec l'environnement afin de tendre à tout instant vers la fonction adéquate. Méthode
Dans la théorie AMAS, pour changer la fonction il suffit de changer l'organisation des composants du système. Ces mécanismes sont spécifiés par des règles régissant l'auto-organisation entre les composants et ne dépendant pas de la connaissance de la fonction collective. 

Adapter le système par ses parties
Spécifier un modèle a priori pour un système qui aura à faire face à des imprévus, c’est contraindre (peut être inopportunément) l'espace des possibles. Depuis Bertalanffy, de nombreux auteurs ont étudié des "systèmes de divers ordres qui ne peuvent s'appréhender par l'étude de leurs parties prises isolément." [Bertalanffy 93], [Rosnay 75], [Haken 78], [Maturana 97].
Un moyen d'apprendre pour un système S consiste à transformer sa fonction actuelle fs de manière autonome (donc par auto-organisation) afin de s'adapter à l'environnement, considéré comme une contrainte qui lui est donnée (cf.  REF _Ref47514121 \h Figure 8). Chaque partie Pi d’un système S réalise une fonction partielle fpi de la fonction globale fs. fs est le résultat de la combinaison -notée par l'opérateur "o"- des fonctions partielles fpi (les flèches dirigées vers le haut dans la  REF _Ref47514121 \h Figure 8). La combinaison étant déterminée par l'organisation courante des parties, il s'ensuit que fs = fp1 o fp2 o … o fpn. Comme généralement fp1 o fp2 ( fp2 o fp1, transformer l'organisation (les doubles flèches courbées dans la  REF _Ref47514121 \h Figure 8) conduit à changer la combinaison des fonctions partielles et donc à modifier la fonction globale fs, devenant par là même un moyen d'adapter le système à l'environnement.
Pour un système multi-agent, la mise en œuvre de cette adaptation implique que le concepteur ne s'intéresse qu'à l'agent (les entité produisant fpi dans la  REF _Ref47514121 \h Figure 8) et lui donne les moyens de décider de manière autonome de changer ses liens avec les autres agents pour tendre vers une organisation coopérative. Ainsi, en fonction des interactions qu'a le système multi-agent avec son environnement (les doubles flèches extérieures au système dans la  REF _Ref47514121 \h Figure 8), l'organisation entre ses agents émerge et constitue une réponse pour faire face aux imprévus.

La Technologie AMAS
La théorie AMAS est indépendante du support technologique pour la mettre en œuvre mais la métaphore sociale qu'incarne le paradigme multi-agent est particulièrement adaptée. Car pour pouvoir utiliser concrètement le théorème de l'adéquation fonctionnelle il faut pouvoir construire un système capable d'atteindre par lui-même un milieu intérieur coopératif et les systèmes multi-agents, si on leur donne des capacités d'adaptation conformes à la théorie, possèdent le potentiel nécessaire par le biais de l'activité locale et autonome des ses parties que sont les agents. De plus il est "naturel", ou "facile" de parler en termes de "coopération" et de "réorganisation" dans un système multi-agent. La technologie AMAS est constituée par l'ensemble des moyens alloués aux agents par le concepteur pour leur permettre de tendre en permanence (voire d'atteindre) un milieu intérieur coopératif.
Les composantes d'un agent AMAS
En elle-même, l'organisation qui émerge est une organisation observable non prédéfinie par le concepteur du système. Mais ce qui nous intéresse le plus c'est l'émergence de la fonction du système qui est produite par l'organisation entre les agents à un instant donné. Pour réaliser cela, les agents sont programmés pour être en situation coopérative avec les autres agents du système. Cela se traduit par le fait qu'à tout instant, un agent reçoit les informations pertinentes pour réaliser sa fonction et qu'il transmet des informations utiles à d'autres.
Un agent peut localement décider s'il est en situation coopérative. En effet, par rapport aux croyances qu'il a sur lui-même, il peut localement déterminer si ce qu'il reçoit est compréhensible et lui permet de réaliser une action. De la même manière, en fonction de ses perceptions, il pourra juger localement si ses actions ont été utiles. D'une manière générale, cinq parties sont indispensables à un agent coopératif pour qu'un comportement collectif cohérent puisse être observé à partir de l'agrégation de comportements individuels.

Les compétences sont des connaissances d'un domaine particulier qui permettent à l’agent de réaliser la fonction partielle qui lui est assignée. Aucune contrainte technique n'est imposée pour le développement (système de production, méthode objet,…).
La représentation de lui-même, des autres agents et de l’environnement confère à l’agent une croyance sur ce qu'il sait de lui-même, des autres et de son environnement. Les croyances peuvent être implicites ou explicites.
L’attitude sociale appelée la coopération permet de définir des critères locaux qui vont permettre à l'agent de décider de son comportement et de se réorganiser avec les autres agents c'est-à-dire de modifier ses liens avec les autres agents. Elle est au cœur de la théorie.
Les agents ont un langage d'interaction qui leur permet de communiquer soit directement par envoi de messages soit indirectement par l'environnement (cf.  REF _Ref48041666 \h  \* MERGEFORMAT Figure 9).
Les aptitudes sont les capacités qu’un agent possède pour raisonner sur ses représentations et sa connaissance.

Les Situations Non Coopératives (SNC)
L’organisation d’un système est décrite par les liens d’interaction entre agents. Dans notre approche, un agent autonome considère qu’il a trouvé la bonne place au sein de l’organisation s’il interagit coopérativement avec autrui ; dans le cas contraire, il agira pour chercher une place plus adaptée. A chaque instant son comportement coopératif (de son point de vue) est guidé par ses compétences et croyances courantes. Les conditions de non coopération conduisant au processus de réorganisation dérivent immédiatement de notre conception de la coopération idéale qui peut se définir alors par l'absence totale de situations de non coopération définies elles-mêmes par :
Non coopération = NCperception ( NCDecision ( NCaction
Non Coopération de Perception (NCperception): Un signal perçu est incompris ou possède de multiples interprétations (ambiguïté). Dans ce cas, un agent coopératif ne va pas ignorer le signal car il le considère nécessaire à l’activité du système. Il va donc tenter de le transmettre à d’autres agents qu’il estime plus compétents ou bien se faire aider par autrui afin de lever les ambiguïtés.
Non Coopération de Décision (NCdecision) : L’information reçue est déjà connue ou n’a aucune conséquence logique. L’agent coopératif ne peut pas tirer profit de cette information pour transformer le monde, il va donc chercher d’autres agents qui pourraient en bénéficier.
Non Coopération d'Action (NCaction) : Compte tenu de ses croyances courantes, l’agent considère que la transformation de l’environnement qu’il peut opérer n’est pas bénéfique à autrui. Cette situation englobe les notions de conflit et de concurrence qui sont fréquemment étudiées dans le domaine. Par exemple, un conflit de résultat peut survenir si l’agent aboutit à une conclusion opposée à celle d’un autre. Une concurrence est détectée si l’agent aboutit à des conclusions identiques à celles d’un autre.

Quand le système est plongé dans un environnement dynamique, de nombreuses situations imprévues du point de vue local d’un agent peuvent survenir, compte tenu de la fonction qu’il sait réaliser. Cette notion d’imprévu est définie par rapport à la fonction habituelle de l’agent. Sa capacité à répondre à cette situation imprévue, reconnue comme une situation non coopérative à ce moment, peut être considérée comme un traitement d’exception en programmation classique. A ces moments-là, un observateur du système peut assister à un processus interne de recomposition des fonctions partielles par la modification des relations entre les agents. Cette recomposition amène une transformation de la fonction globale du système tendant à supprimer les situations imprévues.
Ainsi, un agent réalise en permanence sa fonction partielle, mais il doit aussi agir simultanément sur l’organisation interne du système s’il détecte les situations non coopératives précédemment énoncées. La conception d’un système multi-agent coopératif consiste ainsi en la définition, pour chaque composant - les agents - pris isolément, de tous les états non coopératifs et les activités associées pour les supprimer. Rappelons que, conformément aux conditions énoncées sur l'émergence, ces décisions sur la coopération sont locales aux agents et ne sont pas dictées par la connaissance de la fonction globale du système.

L'algorithme de coopération
La  REF _Ref47516363 \h Figure 10 présente formellement ce qu'est l'attitude coopérative pour un agent conforme à la théorie AMAS, c'est-à-dire le cœur de son algorithme, centré autour du traitement des SNC [Georgé 03b] [Capera 03]. En résumé, en fonction de ses perceptions, si l'agent détecte des SNC, il se doit de trouver un moyen de les résorber.
D'après la théorie AMAS, un agent doit être à la fois capable de détecter le fait d'être dans une situation non coopérative et doit avoir un moyen d'agir afin de revenir dans une situation coopérative. Dans l'algorithme, il y a deux états majeurs auxquels le processus de décision peut être confronté : soit l'agent est en situation coopérative (en fonction de ses perceptions), soit il est en situation non coopérative. Dans le premier état, l'agent choisit simplement l'action qui possède la plus haute priorité parmi celles faisables. Ces actions sont dites utilitaires dans l'algorithme, c'est-à-dire utile pour le but de l'agent, pour un autre agent ou pour le système. Dans l'autre état, l'agent est dans une situation non coopérative et va, en plus d'une éventuelle action utilitaire, choisir l'action correctrice à plus forte priorité en fonction de ses perceptions.
En suivant cet algorithme, les agents cherchent toujours à rester dans une situation coopérative et le système en entier converge vers un état coopératif en son sein et avec l'environnement (sous condition, bien sûr, que les actions correctrices le permettent). Cela conduit – d'après le théorème de l'adéquation fonctionnelle – à un système adéquat.
Cet algorithme décrit le processus de décision typique pour un agent générique basé sur la théorie AMAS. Mais les situations non coopératives, la façon de les détecter, et surtout les actions correctrices pouvant être utilisées pour les résorber ne peuvent rester génériques : le concepteur doit écrire l'ensemble des situations non coopératives et des actions associées pour chaque agent du système, compte tenu des composantes (cf.  REF _Ref48989419 \w \h 3.1) qui lui sont attribuées, elles-mêmes fonction du système développé (et donc spécifiques au système). Cet inventaire est fait au moment de la conception des agents :
Inventaire exhaustif des situations non coopératives auxquelles chaque agent pourrait être confronté;
Pour chacune d'elle, trouver l'action pertinente qui permettra de la résoudre ou de tendre vers sa résolution.

Vers une distribution industrielle : la méthodologie ADELFE
Depuis trois ou quatre ans, la théorie AMAS et surtout la technique associée ont atteint une maturité suffisante pour envisager une distribution à grande échelle. Mais comme toutes les techniques avancées de conception logicielle, elle nécessite un ensemble d'outils permettant son utilisation par des personnes autres que celles qui l'ont développée. C'est ce que va fournir ADELFE (Atelier de DEveloppement de Logiciels à Fonctionnalité Émergente) [Bernon 03] [Bernon 02a] [Bernon 02b] en guidant le développeur tout au long de la conception d'un système multi-agent adaptatif conforme à la théorie AMAS.
Contenu
ADELFE est une méthode complète de conception de systèmes basés sur la théorie AMAS comprenant :
Un processus de développement orienté agent;
Des langages de modélisations : UML et AUML;
Un outil (OpenTool développé et commercialisé par TNI-Valiosys) qui met en oeuvre les notations UML (Unified Modeling Language) et AUML (Agent Unified Modeling Language);
Un outil d'aide à la décision permettant de savoir si l'approche basée sur la théorie AMAS est nécessaire pour concevoir une application particulière;
Un outil interactif pour appliquer le processus de conception à une application, en faisant appel notamment aux outils précédents;
Une bibliothèque de composants.

Ce travail est actuellement l'objet d'une thèse dans l'équipe et vise principalement deux objectifs : répandre cette approche dans le monde de la recherche et proposer aux industriels un outil adapté à leurs nouveaux besoins.

Visibilité internationale
La visibilité internationale au sein du monde de la recherche est progressivement devenue un point important des efforts de l'équipe car l'approche AMAS est maintenant suffisamment développée pour qu'une confrontation à d'autres spécialistes du domaine, à des idées différentes, à des utilisations et des interprétations variées, puisse l'enrichir et l'affiner. Il ne suffit plus de présenter l'énoncé d'une théorie pour que d'autres se l'approprient : ce genre d'approche avancée demande un effort initial important pour arriver à expérimenter et tirer des enseignements. Et devant la multitude d'idées qui foisonnent rien qu'autour du paradigme multi-agent par exemple, il est nécessaire de permettre un accès facile aux autres équipes de recherche et de développement au travers de packages d'outils comme ADELFE.
L'objectif de l'équipe serait que d'autres personnes utilisent l'approche AMAS pour la confronter à leurs propres problèmes d'une part, ainsi que pour l'enrichir de leurs notations, outils ou simplement idées. Des approches formelles de démonstration de propriétés et de preuves de convergence et d'adéquation nous intéresseraient également tout particulièrement sur le plan de la théorie pour accompagner nos propres recherches. Mais le plus gros intérêt serait un affinage de la technologie, c'est-à-dire de faciliter l'utilisation de systèmes multi-agents adaptatifs conformes à la théorie. Si d'autres outils puissants venaient se rajouter à ADELFE tels qu'une plate-forme de développement pour produire rapidement des logiciels à fonctionnalité émergente basés sur des systèmes multi-agents adaptatifs conformes à la théorie AMAS, cela faciliterait grandement la distribution industrielle de cette approche.

Distribution industrielle
L'équipe a déjà pu se confronter aux réalités des besoins industriels en participant par exemple au développement d'un système de prévision de crues (cf. partie  REF _Ref47846643 \w \h  \* MERGEFORMAT 6 -  REF _Ref47846652 \h  \* MERGEFORMAT Étude et discussion de quelques applications AMAS). Mais ce développement s'est effectué en collaboration étroite et a demandé un suivi constant par notre équipe pour arriver à appliquer la théorie AMAS à la spécificité du problème. Nous souhaiterions à termes une distribution à grande échelle et une réelle autonomie des utilisateurs est donc nécessaire. ADELFE remplit une partie des besoins en fournissant un guide pour le concepteur.
Une distribution industrielle à large échelle fructueuse fournirait, par la grande variété de problèmes traités, une preuve empirique de la généricité de l'approche AMAS. Le fait de traiter des problèmes réels et de produire au final des systèmes confrontés à une utilisation réelle sur une échelle de temps conséquente, en cas de réussite bien sûr, prouverait également l'adéquation fonctionnelle de systèmes basés sur la théorie AMAS en utilisation concrète.

Living Design
Par son originalité (basée sur l'émergence, utilisation d'un système multi-agent adaptatif par auto-organisation), cette approche permet également de chercher de nouvelles façons d'aborder le développement logiciel. Le Living Design [Georgé 03a] est un exemple sur lequel nous avons travaillé qui utilise les propriétés particulières des systèmes basés sur la théorie AMAS pour répondre au nouveaux besoins exprimés par les Open Computational Systems (OCS). Ce sont des systèmes qui possèdent une structure complexe et dynamique avec un grand nombre d'entités autonomes en interaction (généralement ce nombre est d'ailleurs inconnu car des entités peuvent apparaître et disparaître dans le système). Les concepteurs d'OCS sont confrontés dès le début à un problème difficile : comment complètement spécifier ces systèmes.
Nous pouvons constater que nous arrivons à produire des mécanismes ou des modèles mathématiques plutôt réussis de systèmes biologiques lorsque l'on se place au niveau du fonctionnement du système. Mais nous nous heurtons à des difficultés dès qu'il s'agit d'intégrer la complexité des dynamiques apparaissant durant l'ontogenèse auto-organisée au sein du système biologique en devenir [Maturana 94]. De la même façon, concevoir des OCS nous semble du même type et du même degré de complexité, d'où les nombreux problèmes rencontrés. La notion de complexité est ici utilisée dans son sens large et intuitif pour parler de systèmes non traçables. De nombreuses définitions peuvent être trouvées [Edmonds 99] mais je me soucie ici seulement des conséquences de tout type de complexité sur la phase de conception de systèmes artificiels. Puisque ce que l'on appelle les systèmes complexes sont généralement difficiles à étudier et comme il est également difficile de prédire le comportement émergent d'un grand nombre d'entités autonomes en interaction, les concepteurs pourraient être significativement aidés par la possibilité d'observer des entités incomplètement spécifiées interagissant dans un environnement simplifié.
En considérant cela, une solution que nous explorons en ce moment est la conception de OCS comme des systèmes biologiques. Nous prétendons que les OCS ne peuvent être conçus comme des systèmes classiques, principalement parce que nous sommes incapables, durant la phase de conception, de définir ce que le système sera dans le futur et quelle fonction il aura à produire. En résumé, comme pour les systèmes vivants, toute forme de finalisme est inappropriée pour un OCS. C'est pourquoi les OCS doivent être supportés par des théories de l'émergence et l'idée du Living Design est de se servir des propriétés des systèmes émergents pour développer une nouvelle approche de conception. En faisant évoluer les systèmes dans leur environnement et en développant des théories décrivant leur comportement "vivant", les systèmes pourraient être conçus en cours d'exécution : c'est ce que nous appelons Living Design.
Pour résumer cette idée qui a été présentée initialement dans [Georgé 03a], il s'agit ici de commencer à développer un prototype en état de fonctionner pour détecter les besoins du système et de rajouter au fur et à mesure au système en fonctionnement, les fonctionnalités qui lui manquent. Ceci est fait, pour un système multi-agent, au niveau des agents et on peut distinguer deux types majeurs de modifications à apporter au système en cours d'exécution :
Préciser la spécification d'un agent quand le concepteur reconnaît l'apparition d'un événement inattendu et qu'il peut en déduire que cela est dû à une limitation des compétences ou des aptitudes de l'agent.
Préciser la spécification du comportement social de l'agent quand le concepteur reconnaît une situation inattendue provoquée par des problèmes dus aux interactions entre agents.

J'ai présenté ici brièvement une des voies que nous explorons qui se situe dans le domaine de la conception et du génie logiciel pour la mettre en opposition à l'approche expérimentale de problèmes et leur résolution empirique (bien que guidée par la théorie AMAS) qui constitue une autre voie importante dans la stratégie de l'équipe.

L'apport de mes travaux dans l'approche AMAS
J'ai pris part au cours de ma thèse au développement ainsi qu'à la distribution de l'approche AMAS, mais la majeure partie de mes travaux se place sur le plan de l'exploration et de l'expérimentation. En fait, à l'opposé des travaux de type "outils et méthodologies", je placerais les travaux d'expérimentation qui viendront ensuite alimenter la théorie et les outils qui en découlent.
L'approche expérimentale indispensable
Lorsque l'on est confronté à des systèmes complexes et donc à la notion d'émergence, le procédé scientifique consistant à développer des théories formelles basées sur des preuves ne peut plus se suffire en soi. On retrouve ce genre d'argumentation chez Edmonds par exemple [Edmonds 03], [Edmonds in press] qui explique la complémentarité du théorique et de l'expérimental dans l'étude et la conception de systèmes artificiels, domaine où jusqu'à présent, le formel était roi. La théorie joue certes un rôle important dans la compréhension et le développement d'approches basées sur l'émergence en fournissant des bases et des preuves de la pertinence de ce type d'approche, comme pour la théorie AMAS. Et d'autres théories sont certainement nécessaires pour enrichir encore notre connaissance du phénomène d'émergence.
Mais la complexité de ce genre de systèmes ainsi que la nature même de l'émergence font que les théories vont devoir se développer conjointement et grâce à des méthodes proches de celles utilisées dans les sciences naturelles (en opposition aux sciences formelles). En d'autres termes, un grand nombre de ces théories et des ces propriétés vont devoir être découvertes et confirmées expérimentalement. Cependant, comme pour les sciences naturelles, cela ne signifie aucunement que ces théories ne seront pas formelles au final, mais juste que ce seront de théories contingentes (au sens philosophique du terme : non nécessaires/obligatoires/vrais, ou pouvant être remises en question suite à d'autres observations) dont la pertinence et la véracité devront être établies inductivement au cours d'expérimentation, sans avoir jamais, probablement, de preuve finale [Georgé 04].
C'est également le point de vue de l'équipe qui cherche effectivement des théories sur le fonctionnement et donc l'utilisation de ces mécanismes computationnels qui produisent des systèmes à fonctionnalité émergente, ceci afin de construire des systèmes artificiels robustes adaptatifs. Et cela en étant convaincu que ces théories seront très probablement différentes de celles que l'on trouve habituellement en Informatique (développées a priori, formelles et démontrées), car établies par la méthode scientifique expérimentale classique et donc contingentes.

L'approche expérimentale dans l'équipe
Pour développer la théorie AMAS et la façon de l'appliquer, la base de travail au cours des dix dernières années a été la confrontation à un certain nombre de problèmes variés. Pour en citer quelques uns : prévision de crues, résolution d'équation, robotique collective, e-commerce, e-learning, simulation de fourmilière, routage adaptatif, gestion d'emploi du temps, etc… (cf. partie  REF _Ref47954606 \w \h  \* MERGEFORMAT 6 -  REF _Ref47954624 \h  \* MERGEFORMAT Étude et discussion de quelques applications AMAS pour quelques références).
Pour chaque problème traité, l'essentiel du travail a été l'analyse de la notion de coopération, d'abord assez vague puis affinée au fur et à mesure pour arriver à la définition donnée dans la partie  REF _Ref47500761 \w \h 3.2. Concrètement, il a fallu trouver pour chaque problème quelles étaient les situations non coopératives que les parties du système pouvaient rencontrer ainsi que celles rencontrées par le système confronté à son environnement. Puis, il a fallu trouver les actions correctrices possibles à effectuer par les parties pour résorber ces situations non coopératives. Et ce, en ne se focalisant que sur des connaissances locales aux parties.
Ce travail, par ses résultats positifs, a permis de montrer qu'une approche basée sur l'auto-organisation des parties d'un système par des règles locales permet d'obtenir un système adaptatif qui produit une fonction adéquate. Le point clé était pour chaque application de bien obtenir la convergence des résultats globaux vers un niveau convenable, à partir d'une élimination locale de situations non coopératives n’étant pas explicitement dictée par la fonction à obtenir, i.e. la résolution de problèmes ne connaît pas explicitement le but global (i.e. comment y arriver).
Pourquoi traiter autant de problème plutôt que de se consacrer à un seul en particulier pour en tirer toutes les conclusions utiles ? La raison principale est tout simplement que ces problèmes sont de nature très diverse, i.e. ils ont des différences fondamentales. J'effectue une catégorisation et une analyse de cette diversité de natures dans la partie  REF _Ref47954606 \w \h  \* MERGEFORMAT 6. Ces différences se situent notamment au niveau de l'espace de recherche, de la continuité/discontinuité de la fonction produite, de la continuité/discontinuité de l'auto-organisation, de la nature du feedback, etc…
Ainsi, d'une part la théorie AMAS a besoin de se confronter à des problèmes éclectiques pour pouvoir acquérir le niveau de généricité voulu, et d'autre part, en accord avec ce qui a été dit sur la nécessité de l'approche expérimentale, ceci est nécessaire pour tout simplement justifier la pertinence de la théorie AMAS.

Un pas plus loin : le problème de la programmation émergente
L'idée de programmation émergente comme décrite dans l'introduction, et détaillée au  REF _Ref71960111 \r \h Chapitre III, s'inscrit typiquement dans une approche expérimentale d'exploration de problèmes. Ce problème est également catégorisé et sa nature analysée dans la partie  REF _Ref48121406 \w \h  \* MERGEFORMAT 6 où je montre les caractéristiques qui font de lui un représentant d'une classe particulière de problèmes.
L'idée de travailler sur ce problème est directement liée à ses caractéristiques car il met la théorie AMAS en confrontation avec la classe des problèmes les plus difficiles qu'elle prétend résoudre. Sans vouloir rentrer dans les détails ici, on peut noter que ce problème est typique des problèmes à fonction discontinue, à réorganisation discontinue, à nombre d'éléments variables, à feedback limité et à différence de niveau (le but des agents n'est pas de même nature que celui du système). Tout ceci sera détaillé dans la partie  REF _Ref48121488 \w \h  \* MERGEFORMAT 6.
En fait, en se plaçant au plus bas niveau possible pour des systèmes artificiels (les instructions) et en respectant toutes les conditions des phénomènes émergents, la résolution de ce problème montrerait toute la puissance de l'approche AMAS, qui en se focalisant sur la résorption de situations non coopératives au niveau des instructions, permettrait d'obtenir n'importe quel programme adéquat au niveau global. Tous les systèmes artificiels actuels étant composés d'instructions, la programmation émergente pourrait alors être une solution aux difficultés rencontrées lors de l'élaboration de systèmes complexes.
Il est à noter ici que l'application de la théorie AMAS à la programmation émergente se place dans le cadre des problèmes très peu informés (comment dicter aux instructions les changements nécessaires pour obtenir un programme adéquat ?). On se trouve alors à l'extrême opposé des problèmes traitables avec une fonction de coût de haut niveau ou autre information explicite (qui typiquement "explique" au système comment obtenir le résultat souhaité). Se référer à la partie  REF _Ref48032891 \w \h  \* MERGEFORMAT 1.2 -  REF _Ref48032894 \h  \* MERGEFORMAT L'approche émergente comme fondement de ce chapitre et au  REF _Ref71960367 \w \h  \* MERGEFORMAT Chapitre I - partie  REF _Ref69907343 \r \h  \* MERGEFORMAT 2.2 -  REF _Ref69907343 \h  \* MERGEFORMAT Auto-organisation, émergence et règles de comportement locales pour une discussion sur les contraintes imposées par une approche basée sur l'émergence et l'auto-organisation.
Bien évidemment la programmation émergente impose de nombreuses contraintes qui rendent cette approche plus ou moins adaptée et si l'on peut utiliser n'importe quelle autre approche de plus haut niveau ou plus informée, cela sera d'autant plus efficace. Ceci est d'ailleurs la première chose que vérifie ADELFE : la nécessité d'utiliser la théorie AMAS pour un problème précis. Mais suivant l'adage classique "qui peut le plus, peut le moins", si la théorie AMAS se satisfait du manque d'information inhérent à la programmation émergente, tout problème un tant soit peu plus informé ou de plus haut niveau n'en sera que plus facile. Et l'adage deviendrait "qui peut avec le moins, peut avec le plus".

Étude et discussion de quelques applications AMAS
Le travail présenté dans cette partie s'est en fait déroulé simultanément à l'élaboration du système multi-agent chargé de résoudre le problème de la programmation émergente (cf.  REF _Ref70659355 \r \h  \* MERGEFORMAT Chapitre III). Mais sa place au sein de ce chapitre se justifie du fait qu'il concerne la théorie AMAS en général et se sert des applications développées dans l'équipe comme terrain de réflexion. Il peut éventuellement être intéressant de s'y référer après avoir lu, au moins en partie le  REF _Ref70659355 \r \h  \* MERGEFORMAT Chapitre III (en particulier la description détaillée du problème de la programmation émergente et de la façon dont le travail présenté dans cette thèse l'aborde). L'origine des considérations développées ici se trouve dans le constat d'une difficulté imprévue à instancier la théorie AMAS et les techniques associées au problème de la programmation émergente. La nature particulière de ce problème nous est alors apparue et fait de lui un représentant d'une classe de problèmes spécifiques. Nous avons alors entrepris d'étudier le panel de problèmes abordés par l'équipe en se focalisant sur les caractéristiques les distinguant les uns des autres, et qui font que ces problèmes conduisent à des applications, bien que toujours basées sur la théorie AMAS, aux fonctionnements techniques fondamentalement différents.
Cette partie est une première ébauche de classification des problèmes nécessitant une approche non conventionnelle (adaptation, apprentissage, auto-organisation, …) à partir d'un certain nombre d'éléments les décrivant : nature et topologie de l'espace de recherche, notions de continuité/discontinuité de la fonction produite comme de la recherche et de la réorganisation, nature du feedback, définition d'une solution coopérative, distance but local / but global, etc… Ces éléments sont présentés dans le point suivant et suivis de quelques applications. La présentation de ces problèmes illustre les éléments de catégorisation proposés en permettant de considérer des classes de problèmes présentant des points communs mais également des différences fondamentales avec le problème de la programmation émergente. Ce dernier problème est ensuite caractérisé avec les éléments définis ici pour montrer que ce type de problème présente des difficultés accrues par rapport aux autres types.

Eléments pour la classification de problèmes
Un certain nombre de caractéristiques ont été distinguées dans les problèmes traités par l'équipe pour expliquer leurs approches techniques différentes dans le cadre de la théorie AMAS. Cette identification ne constitue pas une approche formelle, ni même une catégorisation rigoureuse, mais plutôt une énumération d'éléments qui nous semblent importants. Il faut également noter qu'un problème donné peut parfaitement présenter plusieurs facettes qui font que ces caractéristiques ne sont pas exclusives. De plus, certains problèmes peuvent rendre floues les frontières et définitions suivantes. Tous ces éléments ne sont d'ailleurs pas de la même importance pour effectuer à terme cette catégorisation, mais constituent néanmoins des différences qui influent sur les fonctionnements d'auto-organisation des SMA produits pour résoudre ces problèmes. Ces éléments sont les suivants :
Nature de la réorganisation au sein du système;
Nature de la fonction globale du système;
Origine et nature de la résorption des SNC;
Existence ou non d'un feedback et distinction "but local / but global";
Distance entre fonction des parties et fonction globale;
Utilisation d'une mémoire;
La question des systèmes ouverts;
Nature de l'environnement de l'agent.

Nature de la réorganisation au sein du système
Le principe même d'un SMA fonctionnant par auto-organisation impose aux agents de modifier d'une façon ou d'une autre l'organisation constituée par l'ensemble des agents afin de modifier la fonction produite par cette organisation, ceci dans le but de répondre au problème posé. Chaque agent doit donc être capable de se réorganiser avec les autres agents, et cette réorganisation peut être de deux types distincts : continue ou discontinue. A strictement parler, la capacité de l'agent à se réorganiser peut s'appuyer sur les deux types au travers de mécanismes différents, mais chaque mécanisme peut être classé dans une des deux catégories.
La notion de continuité est ici simplement une généralisation de celle associée aux fonctions mathématiques qui indique qu'il n'y a pas de "saut" de valeurs, que les valeurs se suivent. De même, nous allons dire que la réorganisation est continue si l'agent peut effectuer des changements qui "se suivent", d'une façon ou d'une autre, et qui produisent des changements progressifs dans l'organisation. Typiquement, quand des agents ajustent des valeurs numériques progressivement pour produire des changements progressifs sur ce que produit l'organisation, les mécanismes sont continus. Mais plus généralement, si l'on est capable de produire une sorte d'ordre total des changements, ceux-ci peuvent être considérés comme continus (par exemple, une discrétisation d'une valeur continue ne la rend pas discontinue pour autant au sens utilisé ici, car avec une certaine approximation, les valeurs se suivent). La discontinuité peut généralement se détecter quand un changement local d'un agent peut changer radicalement ce que cet agent produit, ce qui implique alors souvent, mais pas toujours, un changement radical de la fonction produite par l'organisation. Un exemple classique serait le problème du voyageur de commerce : le choix d'une ville différente pour un chemin change radicalement ce chemin.
La façon dont les agents se réorganisent indique en fait comment est effectué le parcours de l'espace de recherche. Ce point est certainement l'un des plus importants par son influence directe sur la façon de concevoir et d'implémenter les mécanismes d'auto-organisation au sein du SMA.

Nature de la fonction globale du système
Le point précédent est généralement lié en partie à la nature de la fonction produite par le système. Celle-ci peut également se distinguer en continue et discontinue, ce qui influe sur le type de feedback renvoyé éventuellement au système, sur comment ce feedback peut être interprété (et utilisé) par le système, et donc, de façon générale, comment le système évalue son parcours de l'espace de recherche. Le cas continu regroupe par exemple tous les systèmes produisant une fonction mathématique continue en sortie, ou souvent les systèmes cherchant à optimiser une valeur. L'exemple précédent du voyageur de commerce, bien qu'ayant un parcours discontinu, produit une valeur continue (la distance totale). Mais le comportement d'un robot ayant des choix d'actions différentes (se déplacer, prendre un objet, …) est typiquement discontinu.
En fait, la nature du problème et la nature de la réorganisation sont cependant souvent liées et se mélangent dans certains types de problèmes dans lesquels nous ne distinguons pas clairement les mécanismes de réorganisation internes, des changements de fonction globale. L'analyse d'un problème en fonction de la nature de la réorganisation doit généralement prendre en compte la nature de la fonction produite, et cet élément nous semble également l'un des points principaux de catégorisation.

Origine et nature de la résorption des SNC
Nous nous intéressons plus particulièrement à l'approche par la théorie AMAS des problèmes, mais ce point peut se reformuler plus généralement par la considération de la façon dont sont détectés les problèmes et les changements nécessaires dans un système. Pour la théorie AMAS, cela consiste à détecter les SNC. Nous pouvons ici différencier les cas où l'agent détecte lui-même un problème des cas où l'agent reçoit la description d'une SNC par autrui (un autre agent ou l'environnement). Dans les deux cas, l'agent doit prendre en compte cette SNC, mais on peut considérer que généralement, l'agent possède potentiellement plus d'information sur une SNC détectée par lui-même. De plus, une partie des SNC détectées par l'agent lui-même peut être résorbée par des actions personnelles, sans forcément faire appel à autrui, ou sans modification de la fonction du collectif. Les SNC venant d'autrui, et plus particulièrement si l'origine est l'environnement (et constitue donc un feedback), sont, elles, généralement plus difficiles à résorber, soit parce que l'agent manque d'information, soit parce qu'elles impliquent des changements importants de l'organisation (et de la fonction produite).
Nous pouvons généraliser en supposant que plus la détection d'une SNC est éloignée de l'agent et plus la résorption sera distribuée sur les agents, plus elle constituera un cas difficile pour le système.

Existence ou non d'un feedback et distinction "but local / but global"
La nature des problèmes abordés et la façon de les traiter n'impliquent pas forcément l'existence d'un feedback quelconque. En effet, le feedback n'est pas requis quand le but du système découle de celui des entités du système et où aucun jugement extérieur ne vient contraindre celles-ci. Nous retrouvons ici un grand nombre de simulations qui laissent le système évoluer, et observent cette évolution, mais également des systèmes pour lesquels l'obtention d'un état dans lequel les agents ont satisfait au mieux leurs buts correspond à une solution du problème donné.
L'atteinte de cette solution n'est pas pour autant évidente, mais les agents oeuvrent en connaissance de cause car ils cherchent à satisfaire leurs propres buts. En fait, ce critère influe sur les informations et actions disponibles pour les agents, et traiter ses propres besoins au travers de ses compétences est souvent plus facile à mettre en place que si les agents doivent arriver à satisfaire collectivement les besoins d'un environnement. Dans le cas où un feedback évalue le système afin de le faire tendre vers une solution particulière, les agents doivent arriver à traduire cette contrainte pour l'intégrer à leurs propres buts. Cette traduction s'avère généralement difficile.

Distance entre fonction des parties et fonction globale
Un autre critère est la différence de nature et de compétences entre les agents pris individuellement et le système global constitué par le collectif. Cette distance entre les fonctions des parties et la fonction globale varie entre deux extrêmes : la distance est la plus faible quand le système produit une fonction de nature identique à celles des parties (il s'agit alors d'une sorte de sommation de fonctions individuelles), et elle est la plus grande quand la nature est radicalement différente et d'un autre niveau de complexité.
Dans le cas du fourragement au sein d'une fourmilière par exemple, la fonction globale est de même nature que celle des parties : le but de la fourmi est de fourrager, ce qui est aussi le but du collectif, même si le but collectif impose également en plus un critère d'efficacité qui émerge du comportement collectif. Par contre, la programmation émergente est un exemple particulièrement représentatif de l'autre extrême : les instructions possèdent des fonctions extrêmement simples mais le collectif (l'organisation et donc le programme) peut représenter n'importe quel type de fonction au sens large du terme (n'importe quel programme) et est d'un niveau de complexité largement supérieur.

Utilisation d'une mémoire
Ce point concerne la capacité d'un agent à mémoriser des informations sur son environnement, les agents avec lesquels il est ou était en interaction, et surtout, sur son parcours au sein de l'espace de recherche. Ce critère peut être intéressant à prendre en compte car il indique à quel point l'agent peut ensuite utiliser cette mémoire comme indication quant aux actions à entreprendre. Ceci peut donc constituer une indication sur la direction à prendre pour l'agent, et ainsi pour le système tout entier dans l'espace de recherche. L'utilisation d'une mémoire est un cas classique par exemple dans les problèmes de planification en robotique (exploration, déplacements) avec la constitution d'une carte de l'environnement.

La question des systèmes ouverts
Ce point concerne la capacité du système à accepter, et utiliser pour sa réorganisation, l'apparition et la disparition d'agents en son sein. Ce n'est pas seulement un paramètre qui indique le nombre d'agents dans le système, mais comment le système peut se servir de cette capacité pour explorer différemment l'espace de recherche. Les problèmes imposant ou nécessitant cette capacité sont alors généralement d'une complexité supérieure.

Nature de l'environnement de l'agent
La nature de l'environnement (au sens large : les autres agents sont considérés comme faisant partie de l'environnement d'un agent donné) influence également grandement la conception du système. En effet, en dehors des changements internes à l'agent, tout autre moyen d'action se fait via cet environnement. Il pose donc des contraintes sur ces actions, et par conséquent, sur les mécanismes d'auto-organisation. Dans la méthodologie ADELFE (cf. partie  REF _Ref70841161 \r \h 4), l'environnement d'un agent désigne tout ce qui est extérieur à l'agent. On distingue l'environnement dit social c'est-à-dire les agents qu'il connaît, et l'environnement dit physique, constitué des ressources matérielles présentes dans le champ de perception de l'agent ou de ses propres effecteurs. Une caractérisation a dès lors été effectuée, suivant les termes utilisés dans [Russel 95], [Wooldridge 00] et [Lind 01] :
Environnement accessible (par opposition à "inaccessible") : le système peut obtenir une information complète, exacte et à jour sur l'état de son environnement. Dans un environnement inaccessible, seule une information partielle est disponible. Un robot qui évolue dans un environnement possède des capteurs pour le percevoir et, en général, ces capteurs ne lui permettent pas de connaître tout de son environnement, qui ne peut alors être considéré comme accessible.
Environnement continu (par opposition à "discret") : le nombre d'actions et de perceptions possibles dans cet environnement est infini et indénombrable. Dans un environnement discret, le système possède des perceptions distinctes, clairement définies, qui décrivent l'environnement. Par exemple, dans un environnement simulé tel qu'un éco-système, le nombre d'actions ou de perceptions qu'une entité virtuelle (comme une fourmi ou un robot) peut avoir est généralement limité (cela dépend en fait du modèle utilisé), l'environnement est alors discret.
Environnement déterministe (par opposition à "non déterministe") : une action a un effet unique et certain. Si le système agit dans son environnement, il n'y a aucune incertitude sur l'effet de son action sur l'état de l'environnement. L'état suivant de l'environnement est complètement déterminé par l'état courant. Dans un environnement non déterministe, une action n'a pas un effet unique garanti. Par nature, le monde physique réel est un environnement non déterministe.
Environnement dynamique (par opposition à "statique") : l'état de l'environnement dynamique dépend des actions du système qui se trouve dans cet environnement mais aussi des actions d'autres processus. Aussi, les changements ne peuvent pas être prédits par le système. Un environnement statique ne peut changer sans que le système agisse.

Quelques problèmes traités par la théorie AMAS
Pour illustrer les éléments de catégorisation présentés dans le point précédent, et aussi parce que ces éléments en sont issus, je vais présenter ici un panel d'applications réalisées par l'équipe pour résoudre des problèmes spécifiques. Je n'ai la place ici que de donner un bref aperçu des problèmes, de la façon dont ils ont été abordés, et de leurs caractéristiques principales. Chacun des problèmes suivants présente en réalité de nombreuses caractéristiques distinctes mais j'évoque ici seulement celles qui imposent des fonctionnements techniques bien spécifiques qui les distinguent ou rapprochent du problème de la programmation émergente. Pour plus de détails, voir les références accessibles sur www.irit.fr/SMAC.

ANTS (Fourragement de fourmis)
Il s'agit d'une simulation de fourragement de fourmilière : une arène virtuelle dans laquelle sont disposés des ressources et un nid, et au sein de laquelle évoluent des agents-fourmis capables d'explorer l'arène, de fourrager et de laisser des traces de phéromones (ce qui peut être considéré comme une sorte de mémoire pour les agents). Dans un premier temps, le système suivait les règles imposées par les éthologues, ensuite nous avons introduit des attitudes coopératives au sein de ces agents pour améliorer les performances.
Ce cas est typique des simulations où il n'y a souvent aucun feedback de l'environnement : les agents se contentent de suivre leurs buts individuels. Aucun apprentissage n'est d'ailleurs effectué, seuls les changements apportés par le programmeur modifient la façon dont fonctionne le système. De plus, la fonction réalisée par le système (le fourragement) est aussi, en simplifiant, celle des agents. En réalité, la fonction du système intègre des notions d'efficacité qui émergent des activités des agents alors que ceux-ci ne contiennent pas ces notions, mais il est évident qu'il y a une distance très faible entre les deux fonctions.

Résolution d'équation
Ce problème mathématique consiste à trouver les poids des variables d'une équation à n inconnues représentant la somme de ces variables pondérées par leurs poids (£ai.xi = v). Ce sont les poids qui sont ici considérés comme des agents et chacun va essayer de trouver, en accord avec les autres et avec l'équation, la valeur du poids qu'il représente. On fournit au système un ensemble de valeurs pour les variables ainsi que le résultat v de l'équation, et les agents ajustent coopérativement leur poids pour se rapprocher de la bonne valeur.
Il y a bien ici une sorte de feedback sous forme de contraintes imposées aux agents de cadrer à l'équation, ce qui le distingue du problème précédent. Par contre, ce problème est typique des problèmes à réorganisation continue pour produire une fonction continue. En effet, les agents ajustent progressivement leurs poids et constatent ensuite la variation progressive sur la distance au but. Le parcours est alors plus aisé au sein de l'espace de recherche. On peut également noter ici que les agents n'ont pas réellement de but propre : ils ne font qu'essayer de satisfaire l'équation, et donc les contraintes de l'environnement qui ne sont au final qu'une expression du but global.

Routage téléphonique
Le SMA défini ici est chargé de réguler des communications téléphoniques en procédant à des commutations d'acheminement. Chaque centre de commutation est représenté par un agent qui a pour but, pour simplifier, de réguler sa charge en fonction de la connaissance de celle d'agents voisins.
Ce problème est très proche du précédent car les agents changent progressivement leurs charges, ce qui répartit progressivement la charge globale. Ceci représente le but du système. Mais contrairement au problème précédent, il n'y a pas de feedback (les agents suivent leurs propres buts, en fonction de leur observation de l'état local du réseau) et l'atteinte du but des agents correspond ici à l'atteinte d'une solution. Ceci facilite le travail des agents qui n'ont pas besoin d'interpréter un feedback résultant de l'activité du collectif en terme d'ajustements personnels.

SYNAMEC (Génération de mécanismes)
Le projet Synamec est actuellement en cours et présente un riche panel de caractéristiques. Il s'agit de laisser à un SMA le soin d'engendrer des mécanismes complexes comme ceux utilisés par exemple dans les ailes d'avions. Chaque agent est une pièce mécanique donnée qui est potentiellement reliée à d'autres suivant des joints permettant des mouvements. On obtient alors un mécanisme dont le mouvement est activé par un point particulier qui fait office de moteur. Le but du système est de permettre à un point particulier de la structure (ce point étant également à trouver par le système) d'effectuer une trajectoire imposée par les concepteurs (et donc par l'environnement du système par feedback).
Plusieurs possibilités sont accessibles aux agents : disparition de pièces, apparition de pièces, ajustement de la taille des pièces (ajustement continu), changement de points de jointure entre les pièces (et donc de la structure du mécanisme représenté : ajustement discontinu), déplacement du point-trajectoire qui est également un agent (à la fois continu, le long d'une barre par exemple, et discontinu, lors du changement de pièce d'attache). La fonction produite par le système est principalement continue mais on peut noter des points singuliers qui font que le mécanisme change subitement et complètement de mouvement, et ceci constitue un "pas" ou "saut" discontinu.
La capacité (et nécessité) du système à changer radicalement d'organisation pour produire une fonction différente est une similitude avec le problème de la programmation émergente. Mais Synamec a à sa disposition une heuristique importante : le SMA est couplé à un simulateur qui exécute les mouvements des pièces dans la structure décrite par le SMA et lui indique la trajectoire du point, bien sûr, mais également par des valeurs pour les pièces, à quel point celles-ci "forcent" au moment de l'exécution du mouvement. Cette information est en fait une sorte traduction du feedback pour chaque agent et facilite le parcours par ailleurs très difficile de l'espace de recherche.

Robotique collective
Initié par quelques travaux antérieurs, ce travail en cours se focalise sur les comportements coopératifs à donner à des robots très simples (pas de communication par exemple) chargés d'effectuer de la collecte de ressources et confrontés à des problèmes de circulation dans des couloirs. Les seules actions disponibles pour le robot, en plus du retrait et du dépôt de ressources, sont les changements de direction pour éviter les autres robots et se diriger efficacement dans l'arène.
Comme pour ANTS et les simulations en général, il n'y a pas ici non plus de feedback de l'environnement demandant au système de s'ajuster : les robots ne connaissent pas la performance globale dont la maximisation est le but du système. La réorganisation est continue (pas de changements brutaux de fonctionnement) et la fonction globale aussi (efficacité de la collecte). De plus, les robots ont accès à une mémoire de la localisation de conflits au sein de l'environnement.

SCIO (Organisation sémantique)
SCIO est un système constitué d'agents représentant des termes utilisés dans les informations et requêtes en langage naturel transmises au système (ce sont simplement des mots de la langue utilisée). Chaque agent est un terme et se lie aux autres pour former une sorte de réseau sémantique qui permet d'activer éventuellement certains agents particuliers qui représentent des entités de niveau supérieur, en fonction des requêtes transmises au système. SCIO a été utilisé dans Abrose, un logiciel de commerce électronique où chaque utilisateur et fournisseur de contenu sont représentés par une instance de SCIO, et dans Forsic, un logiciel de gestion de profils d'enseignants, où chaque instance de SCIO est chargée de représenter les compétences des enseignants. Le principe est l'ajustement de l'organisation des agents-termes pour que des termes précis contenus dans une requête, conduisent à l'activation de fournisseurs pertinents dans Abrose, ou à l'activation d'enseignants (s'ils sont compétents). Le principe présente en fait des similitudes avec les réseaux neuronaux.
La réorganisation est ici continue car effectuée principalement par ajustement de poids, et la modification de la topologie de l'organisation, quand elle a lieu, entraîne des changements continus pour l'organisation. La fonction globale du système peut aussi être considérée comme continue car il s'agit d'une valeur d'activation qui est produite par le système, valeur plus ou moins proche de la solution attendue.

STAFF (Prévision de crues)
Cette application est utilisée effectivement sur le terrain pour la prévision de crues sur le bassin de la Garonne et en cours de déploiement sur d'autres sites en France. Il s'agit dans le principe, d'un ensemble d'agents représentant des capteurs de pluviosité et des capteurs de niveau d'eau, qui doivent, par une sommation pondérée, produire une courbe représentant la variation future du niveau d'eau. Chaque agent doit en fait trouver son influence pour la prévision en ajustant son poids représentatif.
Cette application est de ce fait proche du problème de la résolution d'équation avec une réorganisation et une fonction continues. En effet, les actions des agents se bornent à modifier légèrement leurs poids et observer l'influence sur la fonction globale. Celle-ci est visualisable sous forme d'une courbe évoluant en fonction des valeurs des capteurs et est donc typiquement continue. Le feedback, sous forme de distance à la courbe réelle de la rivière, est également relativement explicite puisqu'il indique à l'agent si son changement a été utile ou non à la fonction globale et lui permet alors de s'ajuster. Le feedback est d'ailleurs la seule source de SNC et comme le but de l'agent est la corrélation de ses variations avec la réalité, on peut en fait considérer qu'il détecte lui-même cette SNC et s'ajuste uniquement avec ses propres compétences et informations. Bien sûr, sa seule contribution ne suffit pas à la fonction globale et c'est bien l'ensemble des ajustements des différents agents-capteurs qui produisent un modèle de la réalité.
La distance entre la fonction des agents et celle du système est à nouveau très faible, comme pour les fourmis et la résolution d'équation. En effet on peut considérer que chaque agent-capteur a pour but et compétence la prévision du niveau d'eau. Ce problème peut dès lors être à mon sens considéré comme représentatif d'une catégorie de problèmes relativement faciles pour une approche par SMA basé sur l'auto-organisation coopérative. En effet, les mécanismes de l'auto-organisation sont plus faciles à mettre en place à cause de la nature continue des ajustements et de la fonction globale, qui permet d'en extirper des informations servant alors de guide pour le parcours de l'espace de recherche.

ETTO (Emploi du temps)
Le système ETTO (Emergent Time Table Organization) permet la résolution des contraintes imposées par la création d'un emploi du temps : agencer des cours (enseignant + groupe d'étudiants) sur une durée donnée dans des créneaux horaires et dans des salles aux caractéristiques diverses. Dans ce système, chaque enseignant et chaque groupe d'étudiants est représenté par un agent pour un cours donné (dans le cas où un enseignant donne plusieurs cours, il aura plusieurs agents représentatifs, de même pour le groupe). Il s'agit alors pour les agents représentatifs, en fonction des contraintes de ceux qu'ils représentent (horaires, caractéristiques des salles, …), de s'agencer au sein de l'environnement constitué des créneaux et des salles, afin de satisfaire au mieux l'ensemble des agents. Les agents parcourent donc la "grille" (ensemble des horaires et des salles) des possibilités à la recherche de "cases" (un horaire et une salle donnés) leur convenant. Les agents sont capables de communiquer pour s'échanger des informations. Ceci est notamment le cas quand deux agents rentrent en conflit pour la réservation d'une case. Après échange d'information sur les contraintes et sur les alternatives rencontrées, l'agent auquel le changement de salle impose le moins de préjudice poursuit sa recherche. Il faut noter que le temps de recherche augmente ce préjudice.
Ce problème est intéressant car la réorganisation est bien discontinue : abandonner une case change radicalement la situation de l'agent en le mettant en préjudice. De plus, il n'est pas certain de retrouver facilement une autre case. Il y a cependant des éléments de continuité pour guider la réorganisation : le préjudice et le relâchement progressif de contraintes de l'agent. De plus, l'agent connaît exactement son but et la satisfaction atteinte actuellement. Or justement, la fonction globale est ici aussi simplement issue de la satisfaction du mieux possible de l'ensemble des buts des agents. L'agent peut dès lors se concentrer sur la résolution de son propre but, tout en restant coopératif avec les autres agents. Il n'y a pas de feedback imposant au système une fonction globale spécifique. On peut d'ailleurs noter que cette fonction globale, bien que les agents se réorganisent de façon discontinue, est de nature continue : on peut la considérer comme une variation de la satisfaction globale des agents.
Les SNC sont ici exclusivement détectées par les agents eux-mêmes quand ils entrent en conflit avec les autres. Ils ont alors à leur disposition toutes les informations nécessaires pour effectuer un choix (préjudice de chacun des agents dans le conflit, contraintes de chacun, alternatives potentielles). Et encore une fois, il y a une faible distance entre les compétences des agents (trouver une case) et le système (trouver un ensemble de cases).
Bien que plus complexe que le problème précédent (prévision de crues) par les réorganisations discontinues, ce problème est aussi peut-être plus facile par le fait qu'il n'a pas à se soucier d'un feedback.

Conclusion
Ces problèmes présentent un panel assez vaste avec des caractéristiques variées qui permettent de les ranger dans des catégories plus ou moins spécifiques et représentant des classes de problèmes. Mais bien que nous distinguions des similitudes avec le problème de la programmation émergente, aucun ne semble typique des spécificités de celui-ci au premier abord. Le point suivant va donc étudier ces caractéristiques particulières.

Éléments caractéristiques de la programmation émergente
Bien que nous ne soyons pas encore entrés dans les détails de la programmation émergente, nous pouvons déjà considérer la nature du problème. En effet, il s'agit pour les instructions représentées sous forme d'agents de trouver l'agencement (l'organisation) permettant de produire la fonction attendue par l'utilisateur.
Nécessité de feedback
Les agents ont donc pour but de trouver des partenaires qui leurs conviennent pour effectuer un "calcul" (qui représente l'exécution d'un programme). Le résultat est alors jugé par l'environnement (l'utilisateur) et un feedback est renvoyé au système qui va imposer aux agents de produire une organisation qui non seulement satisfasse leurs propres buts (être tous calculants) mais également ceux de l'utilisateur (calculer la bonne fonction). Nous sommes donc dans le cas d'un feedback qui impose au système de trouver la bonne fonction globale.

Discontinuité de la réorganisation, discontinuité de la fonction
Ensuite, considérons la réorganisation au sein du système : les seuls changements possibles pour les agents afin de tendre vers une satisfaction du but se font au travers de la modification de l'organisation. Pour un agent, il s'agit de trouver de nouveaux partenaires, ce qui modifie généralement radicalement la fonction qu'il produit. Nous sommes bien dans un cas de réorganisation discontinue. Et ces changements radicaux se propagent sur la fonction globale qui peut changer du tout au tout pour le moindre changement au sein du système. En fait, la programmation est discontinue de façon inhérente : par exemple, l'utilisation d'une instruction If-Then-Else impose un branchement qui peut produire deux comportements distincts pour le programme. Les agents ne peuvent donc pas parcourir l'espace de recherche par "petits pas" en jugeant de la pertinence du collectif pour choisir la direction à prendre.

Distinction "but local / but global"
Si nous considérons le but des agents qui est simplement de trouver des partenaires pour effectuer un calcul quelconque, nous voyons que l'environnement a besoin d'imposer son but au système par un feedback pour espérer obtenir de celui-ci la bonne fonction. Comme cette valeur n'indique en aucune façon pour un agent donné s'il est à la "bonne place" dans l'organisation ou à quelle distance de cette bonne place il se trouve (à cause de la discontinuité des réorganisations), les agents doivent traduire cette contrainte. Cette traduction me semble particulièrement difficile. Pour clarifier, nous pouvons comparer avec le problème de l'emploi du temps : dans ce problème, dès que les agents ont satisfait au mieux leurs buts, le but global est atteint. Pour la programmation émergente, les agents peuvent tous avoir satisfait leur but sans pour autant satisfaire l'environnement. Toute la difficulté consiste à savoir comment permettre aux agents de s'approprier le but de l'environnement.

Détection locale et distante de SNC
Nous retrouvons la même idée dans la détection et la résorption des SNC. Les SNC détectées directement par les agents comme le manque de partenaires pour effectuer le calcul sont relativement faciles à résoudre : l'agent doit chercher d'autres partenaires en contactant ses accointances et, par coopération, les agents vont satisfaire les contraintes du collectif (à l'image des agents du problème de l'emploi du temps en quelque sorte). Par contre, la production d'une fonction erronée engendre également une SNC, détectée par l'environnement (qui est le seul apte à juger de la pertinence de celle-ci), et transmise dans le système. Les agents vont donc recevoir des messages les informant d'une SNC qu'ils n'ont pas détectée eux-mêmes et pour laquelle ils n'ont pas directement les compétences pour la résorber (ils doivent changer d'organisation sans savoir, a priori, si la nouvelle organisation sera plus pertinente que la dernière). Cette SNC, qui est d'ailleurs le feedback du système, est ainsi beaucoup plus complexe à traiter.

Un système ouvert
Dans la programmation classique, il est autant question de l'agencement adéquat des instructions, que du choix des instructions à intégrer dans un programme. De la même façon, la résolution du problème de la programmation émergente nécessite impérativement de considérer des stratégies et des mécanismes d'ajout et de suppression d'agents-instructions au sein du système en devenir. De par le très grand choix de possibilités, et parce que cela agrandit l'espace de recherche d'un facteur très important, cette caractéristique entraîne évidemment un surcoût de complexité pour les mécanismes d'auto-organisation.

Distance "instruction / programme"
Une difficulté supplémentaire (et primordiale à mon avis) est la distance importante entre les compétences (et donc la fonction) des agents, et celles du système en entier. Un programme informatique produit une fonction bien plus complexe et de haut niveau que chacune des instructions. Cela se voit même sur des exemples très simples ne contenant que quelques constantes, une addition et une multiplication. Bien que les agents, comme les fonctions globales possibles, effectuent du calcul numérique (et cet exemple élémentaire montre une certaine proximité), les fonctions globales possibles ne sont ni des additions, ni des multiplications, mais des fonctions composées de plus haut niveau avec des comportements déjà plus riches. Plus le panel d'instructions différentes est grand, et leur nombre important, plus ce que produit le système pourra être éloigné des compétences des éléments le composant. Pour comparaison, ceci n'est pas le cas dans la simulation de fourmilières : on peut rajouter autant de fourmis que l'on veut, elles continueront à faire du fourragement, comme le système dans sa globalité. Je pense que cette caractéristique joue un rôle prépondérant dans la difficulté à introduire la prise en compte du but global au sein de mécanismes d'auto-organisation des agents.
Conclusion
A la constatation des caractéristiques précédentes, et après étude des différents problèmes traités avec la théorie AMAS, il apparaît que le problème de la programmation émergente est d'une catégorie différente de ceux traités, même si des points communs apparaissent. Ces caractéristiques, ainsi que les difficultés rencontrées au cours de ce travail de thèse, nous amènent à penser que ce problème, comme tout type de problème éventuel appartenant à la même catégorie, est d'une complexité supérieure qui rend son approche plus difficile que pour d'autres problèmes traités par la théorie AMAS. Il s'agirait donc d'un défi supplémentaire qui enrichira notre théorie de l'auto-organisation par coopération.

EPE : Environnement de Programmation Émergente
Ce chapitre constitue le cœur de mon travail : il regroupe ma vision de la programmation émergente et la partie expérimentale de ma thèse. Comme je l'explique dans le  REF _Ref53889998 \r \h Chapitre I lors de la présentation de la théorie AMAS, cette voie de recherche est fondamentalement liée à l'expérimentation pour la compréhension et la validation. Cette partie s'inscrit donc dans ce cadre, et après avoir présenté deux travaux proches de l'idée de programmation émergente, je décris ici en détail mon cheminement en partant de l'idée brute jusqu'à la description détaillée des différents mécanismes d'auto-organisation développés, les expérimentations associées et les résultats obtenus.

La programmation émergente : introduction et description détaillée
Dans l'introduction de ma thèse, lors de l'analyse de la problématique, je présente mon point de vue sur un certain nombre de domaines qui, de par leurs natures, me semblent particulièrement réfractaires aux approches classiques et que nous qualifions de problèmes de Neo-Computation (par exemple : autonomous computing et ubiquitous computing). En fait, pour résumer la problématique ici, je dirais que dès qu'un programmeur rencontre des difficultés de fond pour implémenter un programme, la programmation émergente pourrait intervenir pour explorer, à sa place mais tout en étant guidé par lui, l'espace des possibilités de programmes. La programmation émergente est un moyen de déléguer la recherche du programme adéquat (ce qui est le but de tout programmeur) à un processus automatisé.
Cette première partie est constituée de la description détaillée de l'idée de programmation émergente au sens large du terme ainsi que de notre approche à travers le concept d'EPE (Emergent Programming Environment ou Environnement de Programmation Émergente).

L'idée de programmation émergente
On peut se représenter la conception d'un système artificiel comme la recherche d'un ensemble d'instructions agencées convenablement afin qu'elles produisent lors de leur exécution un résultat conforme à la tâche demandée. Cette recherche s'effectue dans l'espace des programmes possibles, c'est-à-dire dans l'ensemble des programmes exprimables avec une Machine de Turing Universelle. Inutile de préciser que cet espace de recherche est absolument gigantesque.
Pour donner un ordre de grandeur, nous pouvons nous référer à la partie  REF _Ref53994137 \r \h 3.1 où j'effectue une analyse statistique pour un problème simple avec 10 instructions. L'ensemble des "programmes" possibles avec cet ensemble d'instructions dans EPE a une cardinalité de 1012. Il est donc possible de construire 1.000 milliards de programmes avec seulement 10 instructions (du type utilisé dans EPE) ! Bien sûr, la grande majorité de ces programmes sont non viables, d'autres appartiennent aux mêmes classes d'équivalence. Mais d'une façon ou d'une autre, il faut avoir les moyens de les éliminer lors de la recherche du programme adéquat. D'où la rude tâche du programmeur confronté à des programmes qui font des dizaines ou des centaines de milliers d'instructions.
La programmation émergente a pour but de fournir un moyen de faire une recherche automatisée efficace pour explorer l'espace des organisations représentant les programmes possibles. Dans une vision naïve du concept, il suffit d'imaginer l'ordinateur essayer, tel un joueur de legos virtuels, des combinaisons d'instructions jusqu'à obtenir celle voulue. Un exemple simple consisterait à trouver le bon emplacement des parenthèses dans la formule a + b * c = r afin d'obtenir le bon résultat. Deux solutions "logiques" : (a + b) * c ou a + (b * c) qui ne donnent évidemment pas le même résultat (les parenthèses de la 2ème solution sont bien sûr optionnelles si l'on suppose la priorité usuelle entre opérateurs). Si un ordinateur devait placer les parenthèses, il essaierait aussi de multiples parenthésages inutiles voire faux s'il ne dispose pas de règles de parenthésage. Mais si l'on dote l'ordinateur d'un moyen efficace de trouver le bon parenthésage, on peut alors lui demander d'effectuer le même exercice sur des problèmes qui sont hors de portée de l'humain.
Pourquoi parler de programmation "émergente" et pas "automatique" par exemple ? On peut très bien imaginer (et coder sans problème) un processus de production automatique de programmes qui essaye soit systématiquement, soit au hasard, absolument tous les programmes jusqu'à trouver le bon. Comme pour l'exemple du chimpanzé sur sa machine à écrire qui finit par produire par hasard l'intégralité de l'œuvre de Shakespeare, si on laisse suffisamment de temps à ce processus, il finira bien par "trouver" le bon programme. A l'opposé, si une connaissance du problème nous guide de bout en bout dans notre recherche, nous trouverons rapidement la bonne solution. C'est le cas avec les programmes classiques où, grâce à l'expérience ou même à des méthodologies, le programmeur est guidé de bout en bout jusqu'au programme adéquat. Or justement, dans le cas de la Neo-Computation, cette connaissance ne nous est tout simplement pas disponible, en tout cas pas pour l'instant avec les outils dont nous disposons. Il faut alors trouver une solution entre ces deux extrêmes, d'où l'idée de l'utilisation du phénomène d'émergence tel qu'il est décrit dans le  REF _Ref46116486 \r \h  \* MERGEFORMAT -ð, partie  REF _Ref69529291 \r \h  \* MERGEFORMAT 1.
Pour résumer, le principe fort de l'émergence est l'apparition d'un tout cohérent à partir d'interactions locales non explicitement informées de ce tout cohérent. C'est à ce concept que la programmation émergente veut faire appel. Le principe est de permettre aux instructions de s'agencer en suivant des règles dites "locales" : ces règles n'utilisent pas une connaissance explicite de la fonction globale souhaitée. Chaque instruction possède des règles liées à sa nature pour s'agencer aux autres instructions et doit être capable de changer sa place dans l'organisation ainsi produite en fonction des perturbations que le système (l'ensemble des instructions) subit de la part de son environnement ainsi que des perturbations engendrées par les autres instructions. Mais bien que le comportement des instructions soit non explicitement informé du but global, il est quand même influencé par lui. En effet, par son comportement global, le système est amené à entrer en conflit avec son environnement (qui demande un fonctionnement bien spécifique) et ce conflit va être répercuté sur les entités le constituant qui vont, en apportant une réponse aux perturbations, prendre en compte de façon indirecte et distribuée le but global.
Je reste ici volontairement abstrait et généraliste car l'idée de programmation émergente doit sûrement pouvoir être appliquée concrètement avec des techniques très différentes. La seule contrainte forte étant de rester dans le cadre de la définition de l'émergence. Pour ma part, mon travail de thèse consistait à aborder le problème de la programmation émergente avec le paradigme multi-agent, et plus précisément, avec des systèmes multi-agents adaptatifs fonctionnant sur le principe de la coopération telle qu'elle est définie dans la théorie AMAS. Cette approche est décrite en détail dans la partie  REF _Ref55372697 \r \h  \* MERGEFORMAT 1.3.

Travaux connexes
Mon état de l'art étant généraliste afin de présenter différentes approches pour aborder la Neo-Computation, je voudrais ici entrer dans le détail de la programmation émergente en abordant brièvement deux travaux proches de mes préoccupations. Très peu de travaux abordent effectivement le problème de la programmation émergente, même si certains travaux se préoccupent d'émergence ou bien de systèmes adaptatifs dans certaines mesures, mais rien n'est directement comparable à EPE ou aux deux exemples suivants.
Protean : interaction entre Machines de Turing
Le travail de Shinichiro Yoshii, Satoshi Ohashi et Yukinori Kakazu, décrit dans [Yoshii 98] a ceci de particulier qu'il se place à très bas niveau: l'auto-modification de machines de Turing. Leur travail étant particulièrement technique et demandant des connaissances approfondies sur les machines de Turing, je vais juste en donner les concepts clefs.
Une machine de Turing est un modèle mathématique de calculs ou d'algorithmes, permettant de représenter n'importe quelle procédure de calcul connue à ce jour. Sans entrer dans les détails, le fonctionnement est similaire aux automates finis. Une machine de Turing est constituée d'un contrôle, d'une tête de lecture qui lit une cellule de la bande d'entrée à la fois et de plusieurs ensembles d'états.
Leur travail utilise en fait une machine de Turing Universelle, c'est-à-dire capable de simuler le fonctionnement de machines de Turing décrites sur sa bande d'entrée. Ils spécifient cette machine afin qu'elle traite un certain nombre de machines de Turing dont le comportement quant à lui, n'est en aucune façon spécifié. Chaque machine de Turing va alors modifier le génotype (la bande) qui représente une autre machine de Turing ce qui modifie son phénotype (son comportement). (cf.  REF _Ref66002361 \h \* MERGEFORMAT Figure 11).
L'idée est donc bien de laisser des machines de Turing s'auto-modifier afin de changer de comportement et cette modification est absolument indépendante d'un quelconque but global puisque chaque machine de Turing décide en fonction de son génotype comment elle modifie les génotypes d'une autre. Le mécanisme est donc intéressant mais la comparaison avec ce que veut faire EPE s'arrête là car il n'y a pas adaptation du système à un environnement, simplement auto-modification interne, et le système ne peut donc être amené à fournir un comportement spécifique.
En fait, ce n'est pas surprenant car ces travaux s'inscrivent dans le domaine de la Vie Artificielle [ALife] qui s'intéresse principalement à observer et étudier les comportements de systèmes artificiels proches des systèmes naturels afin d'en comprendre les mécanismes. On n'attend donc pas forcément de ces systèmes en évolution qu'ils produisent un comportement adéquat à une tâche spécifique: une simple observation de l'évolution au cours du temps est déjà une riche source d'informations.
Mais dans le cas de la néo-computation, les systèmes artificiels produits doivent constamment s'adapter afin d'être à tout moment le plus proche possible de la fonction souhaitée. Les préoccupations ne sont donc pas tout à fait les mêmes.

Le Santa Fee Trail et la fourmi artificielle en LISP
Avec certains travaux de J. R. Koza [Koza 91], nous touchons exactement à ce qui nous intéresse. Seul le modus operandi et la portée diffèrent. En effet, dans l'exemple traité, il propose de modéliser le comportement d'une fourmi artificielle qui va devoir suivre, sur une grille de 32*32, un chemin communément appelé "Santa Fee Trail" (cf.  REF _Ref66008967 \h \* MERGEFORMAT Figure 12). Tout le long du chemin qui serpente, sont disposés des cailloux (marqueurs) mais il y a des trous où les cailloux ont disparu. Sans coder le comportement de la fourmi au départ, on veut qu'elle parcoure tout le chemin.
Le comportement de la fourmi est codé par une expression en LISP reliant ses quelques actions de base comme "avancer", "tourner" et "lire le détecteur". Au début, l'expression est quelconque. Comme méthode d'apprentissage, il utilise la théorie des algorithmes génétiques, i.e. une sélection entre les différents croisements d'expressions LISP, suivant une fonction de "FeedBack" qui est la distance parcourue sur le chemin. A chaque génération, on garde les individus qui sont allés le plus loin et on les croise "génétiquement" (on fait un mélange de leurs expressions LISP représentées sous forme d'arbre).



Au bout d'un certain nombre de générations, il en résulte une fourmi avec le comportement décrit ci-après :
(IF-SENSOR (ADVANCE)
(PROGN (TURN RIGHT)
(IF-SENSOR (ADVANCE) (TURN-LEFT))
(PROGN (TURN-LEFT)
(IF-SENSOR (ADVANCE) (TURN-RIGHT))
(ADVANCE))))

Et l'arbre correspondant est représenté à la  REF _Ref66009289 \h \* MERGEFORMAT Figure 13.
Cette approche est particulièrement intéressante car, à aucun moment, on n'a "écrit" le code du comportement. Grâce au FeedBack, le pool de codes s'est modifié automatiquement pour être de plus en plus adéquat. On peut considérer que la fourmi a fait évoluer elle-même son comportement en fonction de l'environnement.
Cependant, on n'obtient pas avec cette approche un programme continuellement adaptatif : on a obtenu par génération émergente un programme pour une simulation donnée. Comment généraliser cela à un robot dans le monde réel ? (Pour une discussion sur les problèmes inhérents au calcul évolutionnaire et autres algorithmes génétiques se référer au  REF _Ref71960367 \w \h  \* MERGEFORMAT Chapitre I -  REF _Ref66011096 \r \h 3.2.  REF _Ref66011096 \h  \* MERGEFORMAT Calcul évolutionnaire et algorithmes génétiques).

EPE : Description
Je vais maintenant expliquer ce que nous entendons par "Environnement de Programmation Emergente" en décrivant ses caractéristiques, son fonctionnement et les principes fondamentaux sur lesquels il repose. Je décris ainsi le rôle de l'émergence et les mécanismes reposant sur un SMA fonctionnant sur le principe de l'auto-organisation par coopération, appliqués à l'idée présentée en  REF _Ref66433113 \r \h 1.1.

Concept
Objectifs
Le but est de faciliter la conception de systèmes complexes en fournissant au programmeur une assistance à la programmation sous forme d'un environnement au sein duquel il assemble et "sculpte" le système souhaité. Par systèmes complexes nous entendons par exemple des systèmes devant s'adapter à un environnement dynamique, répondre à des problèmes partiellement spécifiés ou bien, tout simplement, dont le fonctionnement interne devient difficile à maîtriser. Nous employons le terme de système plutôt que programme car le fonctionnement interne des systèmes produits n'a que peu de points communs avec l'idée que l'on se fait d'un programme classique, i.e. des ensembles figés de lignes de codes.
Utilisation de l’émergence
Plutôt que d'affronter la complexité des systèmes par la rigueur contraignante de formalismes prônant le "tout contrôle", nous allons au contraire utiliser cette complexité en la cadrant à la "base" et au "sommet", tout en la laissant s'exprimer entre les deux. Par "base" j'entends l'ensemble des mécanismes simples qui vont, par leur nombre et leurs interactions, produire la complexité, et par "sommet", l'observation de ce que produit cette complexité.
En se référant à la programmation classique, la "base" est tout simplement l'ensemble complet des instructions d'un langage de programmation ainsi que leur spécification syntaxique et sémantique. Nous avons ainsi, d'une part, la même expressivité que pour un langage de programmation classique (i.e. maximale si le choix du langage est pertinent) et d'autre part, un contexte rigoureux grâce à cette spécification syntaxique et sémantique.
Les instructions des langages de programmation sont étudiées depuis les débuts de l'informatique tant sur le plan syntaxique que sémantique. Elles nous fournissent donc un cadre parfaitement connu pour nos règles de fonctionnement et forment ainsi des fondations solides sur lesquelles développer notre concept. Mais contrairement à la programmation classique pour laquelle il faut assembler laborieusement ces instructions afin d'obtenir le résultat voulu, nous allons laisser ces instructions s'assembler dans une complexité cadrée uniquement par des règles de "base" et juger ensuite du résultat émergent. Ce jugement est le processus qui va contraindre le système et l'"obliger" à tendre, par adaptation, vers une fonction spécifique. Et cette adaptation sera émergente car régie par ces règles de "base" qui ne nécessitent aucune connaissance explicite de la fonction à atteindre. Ces règles sont une instance appliquée à la programmation émergente de celles décrites dans la théorie AMAS (cf.  REF _Ref66436610 \r \h Chapitre I pour la théorie, et  REF _Ref66436675 \r \h 1.3.3 de ce chapitre pour la description des règles).

Les instructions du langage
Je vais maintenant donner forme à l'idée de programmation émergente en la modélisant sous forme de système multi-agent.
Instruction = agent
Chaque instruction est un agent car nous lui donnons ainsi l'autonomie nécessaire à l'auto-organisation. Cet agent aura pour rôle d'effectuer la ou les actions correspondantes à l'instruction qu'il représente. En interagissant avec d'autres agents représentant eux aussi des instructions, nous faisons ainsi fonctionner des instructions ensemble, comme dans l'enchaînement de lignes de code dans un programme classique.
Prenons par exemple un agent "égale", i.e. représentant l'instruction effectuant le test d'égalité. Cet agent travaille avec 3 autres agents : 2 agents qui lui fournissent chacun une valeur quelconque à comparer et un troisième agent auquel l'agent "égale" fournit le résultat booléen de la comparaison.
Pour rester fidèle au modèle agent, chaque agent-instruction doit donc posséder :
des compétences : c'est la capacité, propre à chaque instruction, d'agir suivant sa spécification sémantique.
des accointances : ce sont les connaissances que possède un agent sur d'autres agents, comme entre autre les agents instructions auquel un agent donné est lié et avec lesquels il va réaliser sa fonction (ces agents particuliers seront nommés dans la suite "liens", "partenaire de travail" ou "agent d'entrée/sortie").
la capacité de communiquer et d'interagir avec ses accointances afin de réaliser le déroulement du "programme".

De la même manière, tout autre élément d'un langage de programmation peut être défini (mots clés, identificateur, …). Nous avons donc ainsi à notre disposition les "briques" nous permettant, en les agençant convenablement, de construire des systèmes computationnels.
Computation = coopération entre agents
Tout seul, un agent, à l'instar d'une instruction, ne produit rien de significatif. Mais combinées entre elles, et si le langage est suffisamment sophistiqué, les instructions peuvent coder n'importe quel programme actuellement potentiellement faisable. De la même manière, les agents vont devoir interagir pour produire des résultats. Le paradigme des systèmes multi-agents spécifie des règles d'interaction très variées dont la communication.
Plusieurs moyens de communication entre agents sont formalisés dont les plus couramment utilisés actuellement sont ceux se basant sur l'envoi de messages. Ce moyen de communication expressif et peu contraignant convient parfaitement pour notre problème et c'est ainsi que nos agents vont interagir : ils vont s'envoyer des messages, d'une part pour s'organiser, et d'autre part pour agir les uns sur les autres en fonction de leurs compétences. Nous aurons ainsi des envois de requêtes, de questions, de réponses, de valeurs, d'activations, etc…
Toute cette activité d'interaction va amener les agents à produire un comportement global, une activité commune, un résultat. Le point clef de cette conceptualisation de la programmation est bien sûr la façon dont vont s'organiser les agents : quel agent travaille avec qui, et à quel moment.

Application de la théorie AMAS
Nous allons maintenant voir comment la théorie AMAS (cf.  REF _Ref66438084 \r \h Chapitre I) décrit le fonctionnement réorganisateur des agents et ce que cela induit comme caractéristiques avantageuses. C'est la mise en place de l’auto-organisation par coopération pour les agents-instructions.
Connaissance locale des agents entre eux
Pour que des agents puissent travailler ensemble, i.e. communiquer afin de produire ensemble un résultat, une tâche plus globale, il doivent se connaître. Devant la complexité de la mise en rapport de tous ces agents suivant les nécessités et la dynamique, une supervision globale qui gèrerait cette topologie des agents ne nous paraît pas envisageable. C'est pourquoi les agents n'ont qu'une vue locale des autres agents. Par "locale" nous exprimons le fait qu'un agent ne possède qu'un nombre réduit d'accointances qui lui sont "proches" dans le sens où il les connaît relativement bien, soit parce qu'il a déjà eu des interactions avec elles, soit parce qu'un autre agent lui en a "parlé".
Ainsi, la gestion de ces "liens" se fait de façon répartie. Cela répond par exemple au problème de l'introduction d'un nouvel agent dans le système : que faut-il mettre à jour ? Ici, il suffit qu'il soit mis en relation avec un seul agent. L'agent introduit se mettra en relation de lui-même avec les autres lors des phases de réorganisation. Une condition sine qua non reste cependant le caractère connexe de ce réseau d'accointances : il doit exister un "chemin" de n'importe quel agent à un autre, via les accointances des uns et des autres.
Lorsqu'un agent nécessite la mise en relation avec un agent bien spécifique, il va demander à ses accointances si elles sont compétentes. Si ce n'est pas le cas, elles transmettront la demande à leurs propres accointances. Tout le réseau peut ainsi être parcouru. Cette gestion locale est bien sûr en accord avec le principe d'émergence qui ne prévoit pas de contrôle global du fonctionnement des parties qui composent un système.
Plus précisément, cette gestion locale se présente sous la forme d'un ensemble d'accointances propre à chaque agent et maintenu à jour par l'agent [Ferber 95]. Une accointance, correspondant à un agent connu particulier, se compose de l'idée que se fait l'agent gérant l'accointance au sujet de cet agent, ainsi que bien sûr, une "adresse", quelqu'en soit la forme, grâce à laquelle ils peuvent communiquer. Cette représentation que se fait un agent 1 au sujet d'un agent 2 peut contenir, par exemple, les croyances de l'agent 1 au sujet des compétences de l'agent 2, un jugement de la confiance qu'apporte l'agent 1 à l'agent 2, une mémoire de leurs interactions, des obligations vis-à-vis d'engagement pris, …
Réorganisation des "liens" entre agents
Pour qu'une telle connaissance répartie soit efficace, il ne faut en aucun cas que l'organisation des agents soit immuable. Si chaque fois qu'un agent doit transmettre un message à un autre agent qui ne fait pas partie de ses accointances, ce message se voit démultiplié et transite par un grand nombre d'agents pour pouvoir l'atteindre, le système sera rapidement saturé. Comme l'efficacité de cette répartition repose sur le fait qu'un agent va avoir en général des interactions qu'avec un nombre réduit d'agents, il faut le mettre en rapport direct avec ces agents.
C'est là qu'intervient une partie du mécanisme d'auto-organisation. Chaque fois qu'un agent est mis en contact avec un autre qu'il ne connaissait pas avant, cet agent est rajouté à ses accointances. Ainsi, ils vont pouvoir interagir directement ensemble. De même, des mécanismes d'oublis sont mis en place pour éviter à un agent de devoir gérer un nombre trop important d'accointances. On modifie ainsi toute la topologie des liens entre agents. Cette modification se fait potentiellement indéfiniment suivant les besoins des agents. Une certaine stabilité est cependant à espérer sinon les agents passeraient leur temps à se réorganiser et non à effectuer ensemble les tâches pour lesquelles ils sont créés.
Coopération et situations non-coopératives
Mais qu'est-ce qui va "pousser" les agents à se réorganiser ou même à communiquer ? Et cela de façon productive, qui plus est ! Ce principe fondamental, ce moteur de l'activité, est appelé "coopération" par la théorie. Ce principe est caractérisé par les trois règles suivantes :
un signal ou message est compris et interprété sans ambiguïté par l'agent,
toute interprétation doit produire de l'information pertinente,
les conclusions (actions entreprises) doivent être utiles à autrui.

Détection
Si l'on réfléchit à ce que ces trois règles représentent pour des agents instructions, nous découvrons en fait un cadre relativement strict de fonctionnement pour ces agents. Prenons ces règles une à une et étudions leur signification pour les agents-instructions.
Règle (1) : pour qu'un message soit compris et interprété sans ambiguïté par un agent, il faut que cet agent ait les compétences correspondant à ce message. Prenons par exemple un agent "If-Then-Else", fonctionnant suivant le principe du choix conditionnel présent dans tous les langages sous une forme ou une autre. Cet agent attend d'un autre agent un message de type "booléen" pour agir. Si l'agent reçoit par exemple une valeur numérique quelconque, il n'est pas en coopération avec l'expéditeur du message car leur interaction pose problème.
Règle (2) : si un agent reçoit un message et qu'il se juge apte à le traiter, encore faut-il que ce message contienne de l'information pertinente. Reprenons l'exemple précédent et imaginons que l'agent "If-Then-Else" reçoive 2 messages de type "booléen" identiques du même agent. Le deuxième message n'apporte aucune information supplémentaire. Là également, il n'est pas en coopération avec les expéditeurs des messages.
Règle (3) : et si tout se passe bien du côté des entrées de l'agent, il reste une condition indispensable au bon fonctionnement de l'agent : le résultat qu'il produit ou l'action qu'il entreprend doit être utile à autrui. En effet, si son fonctionnement n'est pas utile, voire néfaste, pour le système, nous sommes également en présence d'un comportement non coopératif. Si un agent "addition" effectuant l'addition ne possède pas de partenaire à qui fournir le résultat de son calcul, il est bien évidemment inutile pour autrui.

Traitement
Chaque fois que se produit une des situations précédentes, nous disons qu'une situation non coopérative (SNC) s'est produite et a été détectée. L'agent doit alors bien caractériser cette SNC (nature exacte, autres agents responsables, …) et répondre à cette SNC pour tenter de redevenir coopératif. Cette réponse est souvent complexe car il ne suffit pas qu'il modifie son comportement, il faut également que les autres agents liés d'une façon ou d'une autre à la SNC réagissent. L'agent qui détecte une SNC doit donc transmettre cette SNC convenablement décrite (i.e. un message décrivant cette SNC) aux agents qu'il pense concernés. De même, ces agents vont devoir traiter cette SNC en fonction de sa nature et éventuellement la transmettre eux aussi.
Au final, un certain nombre d'agents vont donc se mobiliser pour traiter la SNC afin de retrouver un état coopératif collectif. Pour que cet état coopératif puisse avoir des chances d'être atteint, il faut donner les moyens aux agents de répondre aux SNC de façon à faire converger le système vers une solution. Toute la difficulté se trouve donc dans la définition précise de la stratégie de chaque agent envers chaque SNC.
Note: La détection de SNC et leurs résorptions, ainsi que l'attitude coopérative à chaque choix d'actions pour un agent, constituent l'aspect le plus difficile de ce travail de thèse. Par conséquent, je présente ici une première approche qui sera complétée tout au long de la suite de ce chapitre et particulièrement dans la partie  REF _Ref68432611 \r \h 2.4.4 -  REF _Ref68432611 \h  \* MERGEFORMAT Attitude coopérative et stratégies de réorganisation.

Rôle du "programmeur"
Mais un système coopératif à l'intérieur (i.e. dont les agents ne sont pas en conflits entre eux) ne suffit pas à produire des résultats satisfaisants pour un observateur extérieur qui attend du système un comportement bien spécifique ou au moins satisfaisant suivant des critères définis.

"Environnement" de programmation
Nous pouvons continuer à qualifier la personne participant à la création d'un système tel que nous l'avons décrit de "programmeur" mais nous dirons qu'il "agit" sur le système et non plus qu'il "programme". Pour lever les ambiguïtés dans certains cas, nous appellerons néo-programmeur le programmeur utilisant la programmation émergente. Le néo-programmeur agira, comme pour de la programmation classique, au travers d'un environnement de programmation. Je n'ai encore que peu abordé cet aspect du concept mais nous pouvons déjà imaginer que cet environnement fournit des outils de communication avec le système en création ainsi que des choix sur le type d'agent, le nombre, l'ajout, la suppression. Mais comme nous nous appuyons sur l'émergence et l'auto-organisation, la plupart des changements devront se faire d'eux-mêmes à l'intérieur du système et ces outils seront principalement des outils d'influence ou d'information sur le système.
Nous pouvons donc distinguer plusieurs "environnements" :
L'environnement de programmation classique utilisé pour la programmation classique et inutile ici.
L'environnement de néo-programmation au travers duquel le néo-programmateur influe sur le devenir du système (le SMA constitué des agents-instructions).
L'environnement du système qui constitue la partie de l'environnement de néo-programmation avec laquelle il est effectivement en interaction.

Pour simplifier, nous pouvons considérer que le néo-programmeur est en fait l'environnement du système.

Influences sur les agents : produire des situations non coopératives
Pour influencer les agents, et grâce à la théorie de l'auto-organisation par coopération, il suffit en fait de "dire" au système qu'il n'est pas coopératif car il ne produit pas le résultat ou comportement souhaité. En fait, la théorie peut être appliquée à des agents mais également à tout ensemble d'entités que l'on peut considérer comme autonomes et interagissant avec d'autres. C'est le cas du système résultant si on le considère comme un ensemble interagissant avec l'environnement de programmation.
La communication avec le système concernant la coopérativité de leur interaction s'effectue sous la forme de messages signifiant l'apparition d'une SNC. Si par exemple le système fournit, au travers d'un agent que nous qualifions d'agent de "sortie", une valeur qui n'est pas pertinente pour le néo-programmeur, une SNC complète est renvoyée à l'intérieur du système (i.e. un message décrivant le conflit engendré par cette situation), au travers de cet agent de "sortie". Cet agent est ainsi confronté à une SNC (non pertinence ou inutilité) qu'il va devoir traiter et sûrement propager aux autres agents. Les agents vont alors devoir réagir pour amener le système à redevenir coopératif dans ses interactions avec son environnement.
Auto-organisation des agents et composition du système
La capacité d'adaptation du système est donc basée sur cette capacité des agents à s'auto-organiser pour faire face aux SNC. Nous remarquons tout de suite que nous n'obtiendrons un système fonctionnellement adéquat, i.e. qui produit le résultat souhaité, uniquement si les agents présents dans le système possèdent effectivement, dans leur ensemble, le potentiel nécessaire. Les agents représentant des instructions, il suffit que le nombre ainsi que le type d'agents présents dans le système correspondent aux besoins. Le système, en tant qu'entité doit donc admettre l'ajout de nouveaux agents nécessaires ainsi que la suppression des agents inutiles.
Il faudra donc élaborer, pour que le concept fonctionne, une stratégie pour savoir quand est-ce qu'un agent est à même de demander l'ajout d'un nouvel agent (car c'est évidemment au niveau des agents que se produit tout changement). De même, il faudra décider à quel moment un agent se sentira superflu et s'auto-détruira.
Mais la plus grande inconnue reste la capacité du système à converger vers une solution. La théorie AMAS prévoit que la solution, si elle est possible, est forcément atteinte mais saurons-nous appliquer la théorie efficacement dans notre cas ? En effet, on peut très bien imaginer que les agents se réorganisent à l'infini, sans jamais produire le résultat ou comportement adéquat. Et, comme pour tout ce qui touche à l'émergence et qui ne peut donc pas être modélisé rigoureusement, il faut procéder par expérimentations. C'est ce que je propose d'effectuer dans les parties  REF _Ref66440771 \r \h 2 et  REF _Ref68336949 \r \h 4.

De l'utilisation des briques…
On peut pousser le concept encore plus loin en considérant un système adaptatif tel que nous le concevons comme un module indépendant pouvant interagir avec ce qui l'entoure. En fait, cela revient à le considérer comme un agent complet de granularité supérieure. C'est un concept assez classique des théories multi-agents qui prévoient ainsi une structure récursive d'agents où chaque agent peut être décomposé en agents plus petits, et ainsi de suite [Ferber 95] [Occello 97].
Un tel module peut alors être ré-utilisé dans toute situation qui corresponde un tant soit peu à ses compétences. Ayant des liens vers l'extérieur bien définis, un système adaptatif continuera de fonctionner suivant le même principe et détectera automatiquement le changement d'environnement. Sa capacité d'adaptation lui confère ainsi une ré-utilisabilité maximale.
En se basant sur le fonctionnement des langages objets, on peut imaginer d'assembler des modules adaptatifs entre eux, chacun ayant son rôle dans l'ensemble. Et pourquoi ne pas faire fonctionner ce nouveau système, constitué de modules/agents, comme un système multi-agent auto-organisateur par coopération ? Dans un tel système les modules seraient plus stables que les liens entre eux mais pourraient quand même se modifier si nécessaire.
Nous voyons donc que ce concept offre des potentialités énormes et qu'il pourrait être un outil très puissant pour la conception de toutes sortes de systèmes, et plus particulièrement de systèmes complexes nécessitant une adaptabilité avancée et continuelle.

Dynamisme et spécification partielle
On peut noter pour de tels systèmes deux caractéristiques particulièrement remarquables que n'exhibent pas, ou incomplètement à mon avis, la plupart des systèmes classiques.
Une réponse aux problèmes incomplètement spécifiés
Une caractéristique remarquable est la capacité du système à réellement se créer de nouvelles compétences et à modifier radicalement son comportement. Si l'ensemble des instructions composant le système change, dans sa composition ou dans sa connectivité, il n'y a pas de limite aux nouvelles propriétés émergentes du système. Nous pouvons nous servir de cela dans les cas où nous ne connaissons que peu, ou même pas du tout, les mécanismes conduisant au résultat souhaité.
Prenons par exemple le cas d'une équipe de football. Tout le monde sait que le but est de marquer des …buts, justement, pour remporter la victoire. Mais comment une équipe doit-elle jouer ? Quelle stratégie doit-elle adopter pour cela ? On connaît les caractéristiques des joueurs mais comment savoir à quel moment faire la passe, à qui, où se placer ? Les entraîneurs ont bien sûr chacun leur théorie mais les résultats sont imprévisibles. Heureusement pour l'attrait du sport, d'ailleurs.
L'idée est que nous sommes continuellement confrontés à des problèmes qui peuvent même paraître simplistes dans leurs énoncés mais pour lesquels nous ne possédons que très peu d'indications quant à la façon de les résoudre correctement. Le point  REF _Ref71393247 \n \h  \* MERGEFORMAT 1.3.6.3, un peu plus bas, explicite un exemple historique de cet état de fait.
Un système continuellement adaptatif
Une fois que le système est jugé favorable à une utilisation réelle par le néo-programmeur, il n'en devient pas pour autant un système classique. En effet, cette capacité à s'auto-organiser continue à fonctionner suivant les mêmes principes sauf que l'environnement n'est plus le même. Il suffit que le système reçoive un "retour" quelconque de l'environnement qu'il puisse interpréter sous forme de SNC.
On obtient ainsi un système continuellement adaptatif à l'environnement et permettant d'être utilisé en milieu dynamique. Ce problème de milieu dynamique est généralement illustré par l'exemple du robot qui évolue et essaie d'effectuer des tâches au milieu d'autres robots ou d'humains qu'il doit donc éviter et dont il doit prendre en compte le comportement et les actions. On ne peut pas prévoir toutes les situations possibles auxquelles le robot pourrait être confronté et il doit donc s'adapter pour continuer à pouvoir effectuer ses tâches. Cette adaptation est permise par notre système.
Un exemple historique : le problème du "deadlock"
La communauté informatique s'est confrontée pendant de nombreuses années au problème du "deadlock" et de l'exclusion mutuelle des sections critiques pour du traitement multiprocesseur. Je pense que c'est typiquement avec ce genre de problème qu'une génération de code adaptatif comme ce que propose EPE se montrerait particulièrement performante.
Ce problème de l'exclusion mutuelle [Kesteloot www] a été proposé en premier par T. Dekker en 1962 mais il a fallu attendre 1965 pour que Edsger Dijkstra propose dans un célèbre article d'une page [Dijkstra 65] une solution (compliquée) du problème qui s'applique à plus de deux processus. Cette solution garantissait l'exclusion mutuelle, empêchait les deadlocks et les "livelocks", mais n'empêchait pas le problème de la famine (un processus pouvait rester bloqué dans la section d'entrée de la section critique pendant que d'autres pouvaient y accéder). Ce papier a été rapidement suivi par la solution également compliquée de Donald Knuth [Knuth 66] mais qui garantissait l'impossibilité de famine.
Mais pour les deux algorithmes précédents, si un processeur venait à s'arrêter alors qu'un processus était dans une section critique, tout le système pouvait être bloqué indéfiniment. Une autre faiblesse était qu'ils supposaient un fonctionnement atomique (non interruptible, exclusif) de la lecture et de l'écriture en mémoire, ce qui n'est souvent pas le cas.
Huit ans (!) après l'article de Knuth, Leslie Lamport publia une solution [Lamport 74] qui non seulement était plus simple que celles des deux premiers mais qui autorisait également à la fois qu'un processeur s'arrête à n'importe quel moment et que l'écriture en mémoire puisse être en conflit avec la lecture. De plus, cette solution apportait une propriété supplémentaire intéressante : la garantie que les processus en attente devant une section critique soient servis dans leur ordre d'arrivée.
Encore sept ans plus tard (!), en 1981, Gary Peterson publia l'algorithme définitif pour deux processus [Peterson 81] ainsi qu'une généralisation à n processus. Cet algorithme était si simple par rapport aux précédents qu'il jugeât qu'une preuve n'était même pas nécessaire.
Voilà ce que cela donne en substance :
/* Entry section for P1 */ /* Entry section for P2 */
Q1 := True; Q2 := True;
TURN := 1; TURN := 2;
wait while Q2 and TURN := 1; wait while Q1 and TURN := 2;

/* Exit section for P1 */ /* Exit section for P2 */
Q1 := False; Q2 := False;

Il aura donc fallu à la communauté scientifique près de 20 ans pour arriver à assembler une poignée d'instructions… Mais quand on sait qu'avec une dizaine d'instructions données on peut produire dans les mille milliards d'agencements possibles (cf. parties  REF _Ref66532236 \r \h 1.1 et  REF _Ref53994137 \r \h 3.1), toute la complexité du problème nous apparaît. Il faut alors un guide solide pour nous conduire à la bonne solution mais l'intelligence humaine ne suffit pas toujours.
Un concept comme EPE montrerait alors toute son utilité pour explorer les programmes possibles jusqu'à obtenir la fonction adéquate fournissant un fonctionnement sans deadlock, sans famine, sans livelock. Si l'une de ces situations venait à apparaître, une situation non coopérative serait renvoyée au système qui chercherait alors une autre configuration d'instructions plus adéquate.

Les difficultés
Le concept tel qu'il est décrit précédemment est vaste et bien au-delà du contenu d'une seule thèse. Pour pouvoir aborder un "gros" problème on le découpe généralement en des sous-problèmes plus "petits" ou on trouve un problème plus simple représentatif du problème initial. Une première classification des difficultés de la programmation émergente peut se présenter en trois points :
Le feedback, i.e. les contraintes de l'environnement ou du néo-programmeur sur le système qui le conduira à se réorganiser pour trouver la fonction adéquate. Quelle forme doit prendre ce feedback pour être suffisamment informatif pour le système sans pour autant nécessiter une connaissance explicite du but à atteindre et de la façon d'y arriver ? Et comment le système doit-il le prendre en compte, quels sont les mécanismes d'intégration et de réponse au feedback ?
Les mécanismes d'auto-organisation par coopération pour les agents-instructions et ce pour un langage complet. Il faut pouvoir trouver comment instancier les mécanismes de la technologie AMAS à des agents de très bas niveau et particulièrement génériques par rapport à la fonction globale du système. Les instructions ayant des comportements spécifiques suivant leur nature, les agents-instructions pour un langage complet seront longs à déterminer exhaustivement.
Le contenu du système et donc le problème de l'ajout et de la suppression d'agents-instructions. Dans un programme classique, c'est le rôle du programmeur de décider quelles instructions il va utiliser pour arriver à sa fin. Pour la programmation émergente, le système va devoir décider en fonction de ses besoins où et quand introduire ou supprimer des agents. Sur quels critères les agents vont-ils se baser et quels seront les mécanismes mis en œuvre ?

Je propose d'aborder ces difficultés sur un sous-problème simplifié en fixant un certains nombre de contraintes et en restreignant le cadre d'application. C'est ce qui est décrit dans la partie suivante de ce chapitre.

Le "Toy Problem" de la Factorielle : un sous-problème représentatif
Pour concrétiser l'approche expérimentale sur un concept aussi vaste qu'est EPE, je me suis efforcé de trouver un sous-problème suffisamment simple pour être abordable expérimentalement tout en étant significatif afin de pouvoir en tirer les leçons nécessaires à l'enrichissement d'EPE. Dans cette partie, je décris en détail le premier sous-problème implémenté et je justifie ce choix par ses caractéristiques.
Présentation
En référence à la partie  REF _Ref67041772 \r \h 1.4 sur les difficultés, je vais procéder à une simplification dans chacun des trois points. Tout d'abord, concernant l'ajout et la suppression d'agents, la simplification consiste à ne prendre qu'un ensemble fixe d'agents, suffisants pour un problème donné. C'est peut-être la simplification la plus importante quant au concept d'EPE mais c'est de toute façon une étape nécessaire car lors de la recherche de l'organisation adéquate, si les bonnes instructions sont présentes dans le système, encore faut-il qu'elles soient capables de s'agencer dans le bon ordre.
Ensuite, je restreins le problème au calcul numérique sur les entiers positifs. Cela a pour conséquence à la fois une simplification du feedback et une restriction sur les agents nécessaires. En effet, le feedback consistera alors simplement à fournir au système au travers d'une SNC un jugement sur la valeur numérique produite par le système. Au système alors d'effectuer les changements nécessaires pour produire une valeur différente. Cela est alors du ressort des agents composant le système et comme la restriction au calcul numérique réduit le nombre de types d'agents nécessaires, il est ainsi possible de se concentrer sur les mécanismes d'auto-organisation par coopération nécessaires pour ces types d'agents. Les possibilités pour les organisations restent cependant conséquentes et la question du parcours de l'espace de recherche demeure complexe.
Je me suis focalisé sur un exemple particulier : la fonction factorielle i.e. le système doit produire le même comportement que la fonction factorielle. La discussion du choix et la description complète sont fournies dans les points suivants.

Justification et avantages
Composition simple mais mécanismes complexes
Je pense qu'un bon nombre des problèmes rencontrés avec le calcul numérique seront identiques à ceux rencontrés avec un système plus général. Tout d'abord, à un certain niveau, informatique numérique oblige, toute forme de donnée est avant tout numérique. Quand il faudra traiter des formes plus complexes de données, il faudra simplement construire sur les bases des mécanismes trouvés pour le calcul numérique.
Ensuite, il y a relativement peu de différences fondamentales entre les instructions du calcul numérique et le reste des instructions d'un langage de programmation complet. Ou en tout cas, il existe de nombreuses similitudes. Prenons l'exemple de l'instruction d'addition : cette instruction a besoin de deux données en entrée pour produire en sortie une nouvelle donnée, qui est la somme des deux entrées et qui confirme l'opération effectuée en fournissant le résultat de cette opération, ce qui permet de continuer le calcul. Si l'on considère ensuite l'instruction d'affectation, elle a besoin en entrée d'une variable et d'une valeur correspondant à la nature de la variable pour effectuer la modification de la variable à laquelle elle va attribuer la valeur d'entrée et produire en sortie la confirmation de l'opération effectuée, ce qui permet de continuer l'exécution du programme. (Note : pour une discussion plus poussée d'autres agents instructions se reporter à la partie  REF _Ref67049582 \r \h  \* MERGEFORMAT 2.1 -  REF _Ref67049588 \h  \* MERGEFORMAT Vers une généralisation – de la conclusion).
Il y a également des spécificités de la fonction factorielle qui font de cet exemple un tremplin idéal pour ensuite aborder des programmes plus complexes. De par sa nature, la fonction factorielle, pour calculer une valeur donnée, nécessite deux mécanismes cruciaux en programmation : la structure de contrôle de boucle et celle de test. Quelle que soit la façon dont on définit ou calcule la factorielle, il faut effectuer un certain nombre de multiplications jusqu'à un cas d'arrêt. (Exemple : !4 = 4*3*2*1).
Et finalement, le calcul numérique abordé instruction par instruction possède le même type de difficulté que pour un programme normal : si l'on change une instruction de place, le résultat produit par la nouvelle séquence sera très probablement radicalement différent du précédent. Si par exemple le parenthésage change dans le calcul r = (a + b) * c, le résultat est complètement différent.

Réduction de la complexité
L'avantage le plus flagrant est la réduction de la complexité. En restreignant l'ensemble des comportements globaux possibles attendus du système par le programmeur (i.e. seulement du calcul numérique), nous pouvons énormément réduire la quantité des mécanismes "de base" nécessaires. Cela se traduit par un nombre restreint de types d'agents nécessaires à l'accomplissement des tâches et de leurs mécanismes d'auto-organisation.
En se restreignant à une fonction particulière, on réduit le nombre d'agents constituant le système et on obtient une meilleure supervision du fonctionnement du système (nécessaire dans un premier temps pour arriver à trouver les bons mécanismes d'auto-organisation des agents mais en excluant tout contrôle global du système). Nous obtenons ainsi une observation plus directe, facilitée et plus complète, dans le sens où nous manipulons un petit nombre d'agents bien spécifiés. Nous espérons ainsi, pour ces premiers pas, observer concrètement, tracer en quelque sorte, l'auto-organisation du système. Ainsi, un travail efficace peut être effectué sur les mécanismes d'auto-organisation et sur la coopération.
Du point de vue d'un agent donné, qu'importe le nombre d'agents présents dans le système, les mécanismes locaux de prise en compte des SNC rencontrées seront les mêmes. Par conséquent, le temps de convergence vers la fonction adéquate devrait être en relation linéaire avec le nombre d'agents. Le cas échéant, ce résultat sera étudié ultérieurement, car il est en contradiction avec les travaux usuels sur la complexité des problèmes.

Simplification du feedback
Le résultat produit par le système est en lui-même un avantage. En effet, en ne produisant que des valeurs numériques, nous facilitons le jugement du programmeur sur l'adéquation du système. Si nous avons une idée de la valeur à obtenir, nous pouvons, en fonction de la valeur produite, renvoyer une SNC appropriée au système. De plus, nous pouvons facilement automatiser, si nous le désirons, ce feedback en comparant le résultat du système à une liste de valeurs, une observation réelle, un résultat obtenu classiquement, etc…
Concrètement, pour une valeur numérique fournie en sortie, on peut distinguer trois types de feedbacks :
Sous forme booléenne (Vrai/Faux). Si la valeur fournie par le système en fonction de l'entrée ne correspond pas à la valeur attendue, une SNC est retournée au système lui signifiant simplement "mauvaise valeur". C'est la première voie explorée lors de l'implémentation d'EPE pour traiter factorielle. Je montrerai par la suite que pour des instructions, ce type de feedback est trop peu informé même si nous avions des raisons de penser que cette voie pouvait être explorée.
Sous forme de direction : plus grand / plus petit. La SNC retournée dans ce cas au système lui indique si la valeur fournie est trop grande ou trop petite par rapport au résultat attendu. Ceci est particulièrement utile pour un agent instruction qui a alors un but précis pour résorber une telle SNC : essayer de fournir une valeur numérique plus grande ou plus petite. (Note : l'agent ne possède pas pour autant une information explicite du but dans le sens où l'on ne peut de toute façon pas indiquer à l'agent comment l'atteindre). Ce type de feedback a été exploré dans l'implémentation de ce que j'ai appelé l'exemple atomique (cf. partie  REF _Ref68336949 \r \h 4).
Sous forme de distance au but. La SNC retournée au système contient la différence entre la valeur fournie et la valeur attendue. Ce type de feedback ne s'est pas avéré nécessaire pour l'instant mais constitue bien sûr une information supplémentaire dont pourrait éventuellement se servir un agent.

Un dernier cas pourrait venir à l'esprit : celui de fournir au système directement la valeur attendue. Mais comme la note de la deuxième puce l'indique, le système n'en possède pas pour autant une connaissance sur le moyen d'atteindre cette valeur. En fait, la seule information qu'un agent pourrait tirer de la connaissance de la valeur à obtenir serait une information qui rentrerait dans un des trois cas précédents.

Description du sous-ensemble d’agents
La restriction consiste simplement à n'utiliser qu'un sous-ensemble des instructions d'un langage de programmation complet ou bien des versions simplifiées (notamment pour l'instruction "If-Then-Else"). J'ai choisi ce sous-ensemble de façon à ce que le système, constitué d'instances de ce sous-ensemble, ne puisse produire que des valeurs numériques et, pour encore plus de simplicité, j'ai préféré ne pas utiliser toutes les instructions nécessaires à un système exhaustif de résolution de problèmes numériques, mais seulement les instructions "fondamentales", les autres instructions en étant simplement dérivées. Ainsi, je me limite aux calculs sur les entiers positifs possibles avec l'addition et la multiplication. Cependant, pour rester proche des problèmes posés par la programmation, j'introduis également des instructions de test et la possibilité de boucles. Ces instructions sont décrites dans les points suivants et représentent le minimum nécessaire pour la fonction factorielle. Elles permettent déjà des calculs très variés, et par conséquent impliquent une complexité importante.
Spécification générale
La spécification de chaque agent est décrite en fonction de la tâche qu'il accomplit, de ses "entrées" et ses "sorties". Tous les agents communiquent par message mais pour accomplir le calcul à proprement parler, on peut considérer que les agents attendent des valeurs en entrée pour pouvoir fournir des valeurs en sortie. Schématiquement, on peut considérer les échanges liés au calcul comme des câblages électroniques se fixant sur les "entrées" et les "sorties" des agents (cf.  REF _Ref67193606 \h \* MERGEFORMAT Figure 14). De plus, certains messages liés non plus à la valeur produite elle-même, mais à un certain "contrôle" sur l'agent, seront considérés comme arrivant à l'agent par des entrées "contrôle". En fait, ce sont simplement des entrées comme les autres (des messages d'autres agents) mais qui servent à l'agent les recevant pour prendre des décisions quant à son comportement (à faire des choix). Pour visualiser plus aisément le fonctionnement d'un système, nous les considérons comme des contrôles sur l'agent.
Nous avons aussi décidé de connecter un seul agent par entrée, et un ou plus par sortie. Imposer un seul agent pour chaque entrée garantit la non ambiguïté du calcul. Par contre, la valeur produite par un agent peut être utile à plusieurs autres agents et il peut donc posséder plusieurs agents connectés à une sortie donnée.

Les nombres comme agents : 0, 1, …
Tout d'abord, le système, pour être capable de produire des nombres, doit manipuler une représentation quelconque de ceux-ci. Dans l'optique "tout-agent", un nombre est représenté, lui aussi, par un agent. Ainsi, l'agent représentant l'entier "1", que j'appellerai par abus de langage "agent 1", est un agent dont la seule tâche est de fournir l'entier "1" à tout agent en ayant besoin pour accomplir sa propre tâche (cf.  REF _Ref67198954 \h \* MERGEFORMAT Figure 15). Il suffit alors d'un agent "+", représentant l'opération d'addition, décrit au point suivant, pour construire, à l'image des entiers de Peano, tout entier naturel. Je spécifie de la même manière l'agent "0". Cet agent sert pour le cas particulier du zéro dans la factorielle (!0 étant par convention égale à 1). L'agent "1" existe alors simplement pour son aspect pratique (i.e. éviter d'avoir commencer à zéro).

Les opérateurs numériques : +, *, …
Le calcul lui-même est effectué par des agents représentant les opérateurs mathématiques habituels. Ainsi, l'agent "+" est spécifié de la façon suivante : il possède deux entrées aptes à recevoir des valeurs numériques x1 et x2, et il fournit en sortie la somme de ses deux entrées, soit x1+x2 (cf.  REF _Ref67201137 \h \* MERGEFORMAT Figure 16).
De façon analogue, l'agent "*", effectue la multiplication de ses deux entrées et fournit le résultat en sortie. Pour les expérimentations que j'ai implémentées, ces deux agents suffisent mais n'importe quel opérateur arithmétique peut être représenté ainsi.
Les opérateurs de contrôle : "=", sélecteur,…
Pour pouvoir effectuer des calculs plus complexes, i.e. en plusieurs étapes et avec choix, à l'image des calculs basés sur des algorithmes, il nous faut des agents de contrôle. Tout d'abord, le test d'égalité est fondamental. Il sert tout d'abord pour les cas initiaux dans les algorithmes ainsi que pour la terminaison du calcul. Il est donc représenté sous la forme d'un agent recevant une valeur quelconque sur chacune de ses deux entrées (mais de même type), les compare et renvoie un booléen en sortie qui indique l'égalité ou non de ses 2 entrées (cf.  REF _Ref67201413 \h \* MERGEFORMAT Figure 17).

Ensuite, pour le choix à proprement parler, (tout type de branchement dans les algorithmes), nous avons besoin d'une sorte de "If…Then…Else". Dans le même souci de simplicité, je vais spécifier une instance particulière de ce choix. Cet agent, que j'appellerai "agent F" pour "FirstTime", possède deux entrées de types quelconques mais identiques et une sortie correspondant au type de ses entrées, et se comporte de la façon suivante : la première fois qu'il fournit une valeur, il transmet la valeur reçue sur son entrée n°1 et toutes les autres fois, celle sur son entrée n°2. Son utilisation réduit le nombre d'agents pour un calcul dans lequel une initialisation est nécessaire. Je montrerai son utilisation en détail dans l'exemple de la factorielle où nous verrons qu'il est également l'agent qui permet un fonctionnement de boucle pour les agents instructions.
Les agents d’entrée et de sortie : In et Out
Finalement, pour que le système puisse agir avec son environnement, je spécifie deux agents d'interfaçage : l'agent "In" et l'agent "Out". L'agent "In" est chargé de fournir aux autres agents du système les valeurs que fournit l'environnement, i.e. les valeurs que le programmeur veut faire calculer par le système, quelqu'en soit la forme (saisies à la main, liste, produites par une autre entité, …). L'agent "Out" se charge, lui, de fournir à l'environnement, quand le système le juge adéquat, le résultat du calcul effectué par l'ensemble des agents.
C'est sur cette sortie que le programmeur portera un jugement et enverra un FeedBack sous forme de SNC au système. Cet agent "Out" possède une entrée "contrôle" pour donner au système le choix du moment de l'émission d'une valeur vers l'environnement (cf.  REF _Ref67227589 \h \* MERGEFORMAT Figure 18). En fait ce contrôle est une valeur booléenne fournie par un autre agent dans le système qui la dérive de ses propres entrées et ainsi de suite. C'est pourquoi je considère que cela peut être vu comme un moyen pour le système de "choisir" le bon moment pour interagir avec son environnement.
Fonctionnement
Fonctionnement général
Dans le fonctionnement global, la phase computation et la phase auto-organisation sont distinguées, dans un premier temps, pour spécifier plus facilement le fonctionnement, mais ces deux phases s'enchevêtreront au final.
Computation
La plus simple est la phase computation (en référence à l'exécution d'un algorithme puisque c'est ce que représente le fonctionnement en commun de ces agents instructions) qui constitue l'ensemble des comportements des agents conduisant à la production d'un résultat. A priori, ce résultat ne peut avoir de sens que si l'ensemble des agents est dans un état coopératif. En effet, si ce n'est pas le cas, certains agents sont dans un état non-coopératif et vont donc demander à ce que l'organisation de l'ensemble des agents change pour qu'ils redeviennent coopératifs. Après réorganisation, le résultat ne sera plus le même. Mais là aussi ce n'est qu'une première approche simplificatrice car nous pourrions tirer profit d'une situation où le système produirait une valeur satisfaisante alors que certains agents constitutifs du système sont improductifs et donc peut-être superflus.
La synchronisation est importante dans tout système multi-agent car chaque agent fonctionne indépendamment et doit donc se coordonner en fonction de la tâche à accomplir avec certains agents. Dans un système computationnel comme celui décrit ici, elle est primordiale car certains calculs doivent s'effectuer avant d'autres. Nous avons pour cela choisi un fonctionnement s'inspirant du fonctionnement des réseaux de Pétri, i.e. propagation de "jetons" qui déclenchent le calcul et la propagation d'autres jetons. Ces réseaux de Pétri sont utilisés entre autre pour la formalisation du parallélisme et nous paraissent donc pertinents, d'autant plus qu'ils sont régulièrement utilisés pour modéliser des SMA. Pour notre système, un jeton est tout simplement un message du processus de calcul. Nous rajoutons cependant la restriction suivante : un agent ne peut recevoir qu'un seul message de type calcul (qui fournit à un autre agent ce dont il a besoin pour effectuer son propre calcul) à la fois sur chacune de ses entrées. Nous évitons ainsi l'accumulation de messages et le fonctionnement inutile (ou à une vitesse non pertinente pour les autres) d'un ensemble d'agents du système.
Les agents se comportent donc de la façon suivante :
Dès qu'un agent est disponible pour effectuer la tâche pour laquelle il a été conçu, il le fait savoir par message à son ou ses agents d'entrées.
Lorsqu'il a reçu tout ce dont il a besoin pour effectuer son calcul, il envoie le résultat du calcul à ses accointances en sortie, dès qu'elles sont prêtes.
Une fois le résultat fourni à tous ses demandeurs, il est à nouveau disponible pour le calcul suivant.

A tout moment il peut traiter les messages lui précisant qu'un de ses agents de sortie est prêt à recevoir un message de type calcul.
D'agent à agent, le résultat du calcul est acheminé vers l'agent "Out" qui décide, en fonction du contrôle, si ce résultat doit être transmis vers l'environnement.
Auto-organisation
Comme nous le verrons dans la partie  REF _Ref67365679 \r \h 3, le fonctionnement de calcul en lui-même, comme décrit précédemment ne pose pas de problèmes. Plus complexe est la phase de réorganisation. Les mécanismes de réorganisation sont mis en œuvre dès qu'une SNC se produit dans le système. Que la SNC résulte d'une interaction du système avec l'environnement ou tout simplement de l'interaction entre deux agents à l'intérieur du système, les agents vont devoir y répondre d'eux-mêmes.
Les moyens dont disposent les agents sont la modification de la topologie des liens entre agents (quelle que soit la nature de la modification : rupture d'un lien, modification d'une "confiance" en un lien, etc…), l'ajout de nouveaux agents dans le système et la suppression d'agents. Mais toute la difficulté vient du choix de l'une de ces actions et de la localisation de l'action : quel lien briser, où rajouter l'agent, … Ces choix sont d'autant plus importants que j'ai déjà évoqué le problème de la convergence du système vers un état coopératif : il faut être sûr que le système ne se réorganise pas à l'infini, sans jamais atteindre un état stable ou du moins satisfaisant pour l'environnement.
Dans mon travail de recherche, j'ai seulement abordé et non détaillé les mécanismes d'introduction et de suppression d'agents. J'ai préféré porter mes efforts sur les mécanismes de réorganisation des liens car rien ne sert d'ajouter ou de supprimer des agents du système si avec un pool d'agents suffisant pour une fonction donnée le système n'arrive pas à trouver une bonne organisation.
Pour la réorganisation des liens, le problème principal est de savoir quel(s) lien(s) supprimer et où en rajouter de nouveaux. En effet, la cause de la SNC n'est pas forcément située au même endroit que là où elle apparaît. C'est pourquoi il est important de propager les SNC d'agent à agent. De plus, il ne me paraît pas judicieux de détruire trop de liens et cela trop facilement afin de permettre au système de converger vers un état coopératif. Pour cela, j'ai utilisé, classiquement, un mécanisme de poids sur les liens. En fait, en terme de SMA, j'ai travaillé sur la confiance que se portent les agents les uns envers les autres [Foisel 97]. Une SNC se propageant entre deux agents diminuera donc la confiance que se portent ces deux agents. Lorsque la confiance devient trop faible, ces deux agents décident de ne plus travailler ensemble (destruction du lien) et de chercher d'autres agents avec qui collaborer.

Le couplage système - environnement
La majeure partie du calcul, comme de l'auto-organisation, se faisant au sein même du système (ce sont les agents qui gèrent pratiquement tout), l'environnement de programmation n'a pour l'instant qu'un rôle minimal. Il est chargé de :
Fournir des nombres au système au travers de l'agent "In";
Récolter le résultat produit par le système grâce à l'agent "Out";
Emettre un jugement sur la pertinence de ce résultat.

Pour une première approche du fonctionnement du système, et ce afin de faciliter l'expérimentation, je vais travailler à base de couples de valeurs (x,y), x étant la valeur fournie au système et y le résultat que nous aimerions voir produit par le système. L'intérêt est uniquement de tester la capacité du système à s'auto-organiser pour fournir les bons résultats i.e à trouver comment produire le résultat attendu sans qu'un programmeur ait besoin de le coder explicitement dans le système. Si le fonctionnement est satisfaisant dans ce cas, nous pourrons imaginer des feedbacks plus subtils et plus réalistes où l'environnement ne connaîtrait pas par exemple exactement les valeurs attendues.
Ensuite, après avoir récolté la valeur produite par le système, l'environnement la compare à la valeur y attendue pour une valeur x donnée. Et c'est là qu'intervient la fonction la plus importante de l'environnement : produire un feedback, un retour pour le système afin de le contraindre et ainsi le forcer à s'adapter. Conformément à la théorie AMAS, cette contrainte prend la forme d'une SNC : le système ne produisant pas la valeur attendue par l'environnement, il n'est donc pas coopératif avec celui-ci. L'environnement va donc générer une SNC qu'il va retourner au système au travers de l'agent "Out" qui se chargera de la transmettre aux autres agents. Comme discuté précédemment, la SNC retournée au système peut être plus ou moins informative. Sur l'exemple de la factorielle, j'ai commencé par expérimenter le feedback le plus simple pour lequel l'environnement génère simplement une SNC indiquant que la valeur produite n'est pas la bonne (NCSInadequateDataMessage, cf. l'implémentation décrite dans le  REF _Ref69045026 \r \h Chapitre IV).
Ce fonctionnement se réitère tant que le système n'a pas réussi à produire la bonne valeur pour une entrée donnée. Ensuite l'environnement peut continuer l'apprentissage du système sur d'autres valeurs tout en demandant au système de continuer à produire les bonnes valeurs pour les anciennes entrées. En pratique, sur l'exemple de la factorielle, le résultat est suffisamment spécifique pour une entrée donnée qu'un seul couple sur lequel travailler suffit au système (au bout d'un certain nombre d'essais sur le même couple, si le système trouve la bonne valeur, il est probable que son organisation corresponde à la factorielle).

Description de l'exemple de la fonction factorielle
La fonction factorielle a été choisie comme exemple car elle possède les avantages suivants : c'est une fonction très connue, simple, que nous savons calculer parfaitement au travers d'algorithmes itératifs comme récursifs, mais elle est suffisamment complexe pour nécessiter un algorithme avec plusieurs mécanismes distincts comme le contrôle de cas, le branchement et la répétition. Ainsi, nous pouvons facilement vérifier le résultat produit et le nombre d'agents nécessaires me paraît propice à une expérimentation légère mais pertinente [Georgé 02].
Je vais décrire ici en détail ce que le système est censé trouver avec le nombre d'agents limité introduit dans le système pour l'expérimentation. Cela me sert uniquement en tant qu'observateur du système et à aucun moment le système n'est informé de l'organisation qu'il est censé trouver. En effet, dans un problème réel, l'organisation à obtenir est justement l'inconnue.


Une organisation possible
Mathématiquement, la fonction factorielle, notée "!", peut être définie de façon récursive sur [0; +"[ ainsi :
!0 = 1
!(n+1) = (n+1) * !n pour n > 0
Pour pouvoir tester le fonctionnement calculatoire de EPE sur l'exemple de factorielle et par la même occasion donner au système le bon ensemble d'agents qu'il essayera ensuite d'agencer, une organisation possible a été donnée. L'algorithme choisi à transformer en SMA est le suivant :
factorielle (n) {
int resultat;
if (n = 0)
resultat := 1;
else if (n = 1)
resultat := 1;
else {
int i = 2;
 resultat := i;
while (i `" n) {
i := i+1;
resultat : = resultat*i;
}
}
return resultat;
}

Ce qui donne, en terme de SMA, les schémas de la  REF _Ref67470213 \h \* MERGEFORMAT Figure 19 et de la  REF _Ref67470220 \h \* MERGEFORMAT Figure 20. Les carrés représentent les différents agents et les lignes représentent les liens entre agents qui symbolisent l'échange de messages. Pour le fonctionnement de chaque agent, se référer à la partie  REF _Ref67470483 \r \h 2.3 où sont spécifiés chacun des agents utilisés.
En se référant à la  REF _Ref67470213 \h \* MERGEFORMAT Figure 19, nous voyons ainsi qu'il est possible de trouver une organisation qui calcule le mécanisme de la factorielle (j'entends par là, l'itération à proprement parler, sans les cas initiaux) avec seulement sept types d'agents différents et 10 agents en tout. Le système pourrait trouver d'autres types d'organisations mais nous savons qu'il existe une organisation possible. Dans la suite, quand je parlerai de "factorielle", sauf quand indiqué explicitement, il s'agira en fait du "mécanisme de la factorielle", i.e. sans les cas 0 et 1.
L’action du "programmeur" : définir les contraintes imposées par l'environnement au système
Pour permettre au système l'apprentissage de la fonction factorielle, i.e. de trouver une organisation des agents pour qu'ils produisent les résultats correspondant à la factorielle, le système va travailler avec des couples (n, !n). Le système reçoit donc, à travers l'agent "In", le nombre n dont nous voulons calculer la factorielle, et tant que le système ne produit pas !n, le système reçoit, de la part de l'environnement et à travers l'agent "Out" une SNC lui indiquant qu'il n'est pas coopératif avec l'environnement car il ne produit pas le bon résultat.
Il faut noter que cela se passe au niveau des interactions du système et de son environnement. Par abus de langage, le programmeur est aussi l'environnement du système, mais il va agir au travers de l'environnement informatique. Concrètement, l'environnement dans EPE est la structure dans laquelle s'exécutent les agents instructions et qui fournit au système les valeurs d'entrée, récupère les valeurs en sortie et renvoie des SNC si le système est jugé non coopératif.
Quelle que soit l'application sur laquelle aura à travailler EPE, il sera toujours possible d'imposer une tâche spécifique au système au travers de la définition des contraintes que l'environnement va lui imposer. Et de façon générale, si le système ne se conforme pas à une certaine contrainte de l'environnement (i.e. à un comportement non conforme à ce que l'environnement accepte), il sera en situation non coopérative par rapport à celui-ci et l'environnement sera à même de le détecter.
La théorie AMAS indique que les systèmes construits doivent être continuellement coopératifs, et dans leur fonctionnement intérieur, et dans leur interaction avec leur environnement, pour obtenir des systèmes fonctionnellement adéquats. C'est bien ce fonctionnement que j'essaye d'obtenir ici car les agents vont essayer de résorber les SNC envoyées par l'environnement pour obtenir une interaction coopérative avec celui-ci. Le détail du fonctionnement des agents en ce qui concerne le traitement des SNC et donc de la coopération est donné dans la partie suivante.

Attitude coopérative et stratégies de réorganisation des agents
Cette partie détaille les principes comportementaux de coopération et d'auto-organisation des agents. Ceci se traduit conformément à la théorie AMAS en la capacité de détecter les situations non coopératives, d'y répondre de façon à les résorber et d'agir continuellement le plus coopérativement possible. Ce dernier point implique en fait pour un agent d'essayer de résorber également les SNC des autres agents quand ils lui en font part : ignorer les appels d'un autre agent n'est pas coopératif.
Capacité à communiquer et représentation d'autrui
Pour pouvoir coopérer, les deux pré-requis de base sont évidemment la capacité à communiquer et la connaissance d'un certain nombre d'autres agents. Quelle que soit la forme que prend cette communication, le principe reste le même : échange d'information à travers un medium. Dans EPE, comme cela se fait en général pour les SMA, les agents communiquent au travers de messages qui peuvent être déposés dans des boîtes aux lettres personnelles à chaque agent.
Ensuite, l'auto-organisation revient à changer de partenaires (les agents avec lesquels un agent effectue le calcul à proprement parler) en fonction de ses propres besoins, de ceux des autres agents du système ou des contraintes de l'environnement. Pour que les agents puissent chercher de nouveaux partenaires potentiels et décider auxquels proposer un partenariat, ils ont besoin d'acquérir une représentation de ces autres agents. Cette représentation ne contient qu'une représentation d'une partie des agents présents dans le système pour des raisons évidentes de taille de données, dès lors qu'un système peut potentiellement contenir des millions d'agents. Même dans un petit système comme la factorielle, j'ai respecté cette contrainte et les agents n'ont à tout moment qu'un nombre restreint d'accointances variables en fonction des interactions.
Dans EPE, tout comme cela se fait classiquement dans les SMA, les agents gèrent une liste d'accointances avec des informations associées à chaque accointance. Ces informations sont habituellement très diverses et riches pour des agents de haut niveau et pourraient l'être peut-être également dans un système complet de programmation émergente (mémoriser le type de données traitées, la vitesse, le comportement dans le temps, etc…) mais dans le cas de la factorielle, chaque agent n'a que très peu d'informations pertinentes pour guider son choix. En effet, à l'exception de l'agent "Égale", tous les agents manipulent le même type de donnée. Ils sont également situés au même niveau et dans la même proximité, et ont donc des comportements très similaires, à leur fonction près. On pourrait imaginer que les agents mémorisent directement cette fonction mais cette information ne leur servirait à rien puisque justement, ils ne savent pas avec quel type d'agent ils doivent se lier pour satisfaire l'environnement.
Le choix s'est alors porté sur une valeur de confiance : si un agent a des relations régulièrement jugées positives avec un agent alors son taux de confiance envers cet agent augmente, et inversement, si des SNC apparaissent régulièrement avec un agent, alors le taux de confiance diminue au cours du temps. Cette confiance est utile d'une part pour pouvoir juger la relation de calcul avec un partenaire et éventuellement la rompre au profit d'un autre si la première était trop génératrice de SNC, et d'autre part, elle est censée guider le choix d'un nouveau partenaire. Cette solution a été la première développée et je la précise dans les points suivants.
Description des SNC
On peut catégoriser les SNC en deux groupes : celles détectées par les agents eux-mêmes à l'intérieur du système (i.e. originaire de l'intérieur du système), et celles résultant d'un conflit avec l'environnement du système (et donc détectés par l'environnement et transmises au système par lui). On peut noter que ces dernières sont en fait également détectées pas des agents, ceux du système en interaction avec l'environnement (les agents d'interface "In" et "Out") mais que, contrairement aux premières, elles ne viennent pas des buts des agents, mais des contraintes de l'environnement. Dans la première catégorie, on peut également distinguer les SNC détectées par l'agent lui-même et celles qu'un autre agent lui transmet (je précise cette transmission un peu plus loin).
Les SNC détectées à l'intérieur du système par l'agent sont les suivantes :
NCSNeedIn : l'agent n'a pas de partenaire de travail pour une de ses entrées. Comme pour être coopératif dans le système il doit être utile, et que pour être utile il faut déjà qu'il soit en mesure d'effectuer sa fonction, il se doit de trouver des partenaires capables de lui envoyer des données en entrée.
NCSNeedOut : l'agent n'a pas de partenaire pour sa sortie. Il a peut-être déjà ses partenaires d'entrée mais, comme pour la NCSNeedIn, il doit chercher à être utile et doit donc trouver un partenaire à qui fournir les résultats de ses calculs.
NCSUselessness : l'agent est inutile dans le système. Ceci est le cas s'il n'a pas réussi à trouver de partenaire. Dans ce cas on peut supposer que l'agent est inutile pour les autres agents et peut alors disparaître du système. L'agent peut détecter cela en diminuant progressivement sa confiance en lui-même (en son utilité pour le système actuel). J'évoque cette SNC ici pour montrer un type de SNC supplémentaire un peu différent des autres, mais dans le cas actuel, où le système contient exactement le nombre d'agents nécessaires, elle est inutile. Elle servira lorsque le problème de l'ajout et de la suppression d'agents sera traité.
NCSBlockingSituation : l'agent possède suffisamment de partenaires mais ne reçoit pas de données en entrée pour effectuer son calcul alors que son ou ses partenaires de sortie lui demandent une valeur. Deux situations peuvent mener à cet état. Dans le premier cas, il manque, transitivement, à ses agents d'entrée au moins une entrée (i.e. un agent dans la chaîne d'agents qui se passent les données est en NCSNeedIn). Dans le deuxième cas, il est en fait en train d'attendre une valeur d'un de ses agents d'entrée, qui est lui-même en train d'attendre transitivement la valeur de notre agent. C'est le cas du cycle qui, s'il n'est pas initialisé par une valeur à un moment donné, est en situation d'inter-blocage.

Les SNC NCSNeedIn et NCSNeedOut conduisent l'agent à communiquer afin de trouver des partenaires. Ces appels, parce que les agents doivent nécessairement les prendre en compte, prennent la forme de SNC eux aussi :
NCSNeedInMessage : l'agent reçoit un message l'informant qu'un autre agent est en situation de NCSNeedIn.
NCSNeedOutMessage : l'agent reçoit un message l'informant qu'un autre agent est en situation de NCSNeedOut.

Les SNC liées à l'environnement concernent les interactions du système avec son environnement et représentent donc le jugement qu'émet l'environnement au sujet de la fonction produite par le système, en l'occurrence, de la valeur produite par l'agent de sortie. Dans la première approche du feedback, l'environnement renvoie simplement un feedback indiquant que la valeur n'est pas celle attendue. Il n'y a donc ici qu'une SNC :
NCSInadequateData et NCSInadequateDataMessage : l'environnement reçoit une valeur du système et détecte que ce n'est pas celle attendue. Il génère donc une SNC de type NCSInadequateData et la propage à l'agent "Out" par le message NCSInadequateDataMessage.
Traitement des SNC
La détection des SNC est généralement assez facile car les SNC sont rendues visibles pas des conflits ou problèmes locaux, et les agents ont donc, quand ils sont au cœur des conflits ou que les problèmes les concernent directement, toutes les connaissances nécessaires pour expliciter ces SNC. Mais les raisons, ou les origines, ou tous les agents concernés par une SNC, sont rarement connues et jamais dans leur totalité. Si c'était le cas, on pourrait tout simplement éviter d'arriver dans cette situation en premier lieu. Le traitement des SNC, c'est-à-dire les actions à entreprendre pour sortir d'une telle situation et éviter qu'elle ne réapparaisse, est donc souvent difficile car il implique la localisation du problème et sa résolution pour toutes les entités concernées, sans entrer en conflit avec d'autres. Or justement, la plupart des SNC sont le résultat de l'historique des réorganisations du système et des interactions du système, dans sa globalité, avec l'environnement. Les agents, avec leur point de vue local, n'ont à leur disposition que des outils locaux pour agir : aucune connaissance globale ne peut être admise pour ce genre de situations.
Un autre point important qui concerne toutes les SNC est la répétition des traitements associés aux SNC : tant que l'agent détecte qu'il est dans une certaine SNC, il va répéter les actions pour la résorber jusqu'à obtention d'un résultat satisfaisant. En effet, comme je le montre plus bas, certains traitements ne sont pas immédiatement suivis de changements d'organisation car un agent n'est pas sûr d'être celui à qui incombe la décision d'un tel changement. Il va alors effectuer de petites modifications qui, si la SNC se répète chez lui, finiront par déclencher une autre action. Pour éviter de saturer l'organisation de SNC, les agents attendent un certain temps, qui correspond à ce qu'ils pensent être le temps nécessaire à la prise en compte de leur SNC par les autres, avant de réitérer.
Pour les SNC liées aux entrées et sorties manquantes des agents, les actions à entreprendre sont les suivantes :
NCSNeedIn : c'est certainement la SNC la plus facile à résoudre car l'agent a seulement à chercher un partenaire pour l'entrée manquante. Or les agents sont toujours capables, potentiellement, de fournir des valeurs en sortie à autant d'agents que nécessaires. L'agent doit donc simplement arriver à contacter un agent fournissant des données du bon type, i.e. correspondant à son entrée. Il génère donc un message de type NCSNeedInMessage qui décrit sa situation (ses besoins) et l'envoie à ses accointances (car ce sont les seuls agents qu'il connaît). Différentes stratégies sont possibles pour choisir à qui, parmi ses accointances, envoyer ce message : toutes, au hasard, faire un cycle, seulement celles en qui l'agent a le plus confiance, un tirage pondéré, etc… Ce choix vise en partie à éviter de saturer les autres agents de messages et pour cela, n'importe quelle stratégie qui n'envoie pas à trop d'agents à la fois est viable. L'autre but est de trouver le plus rapidement possible un "bon" partenaire : pas seulement pour pouvoir effectuer un calcul (pour cela, n'importe quel agent du bon type suffit), mais également pour la fonction globale car la NCSNeedIn peut résulter du traitement d'une NCSInadequateData. Je discute de cela lors du traitement de cette SNC.
NCSNeedOut : comme pour la NCSNeedIn, l'agent génère un message de type NCSNeedOutMessage qui décrit ses besoins et l'envoie à certaines de ses accointances. Cette SNC est cependant plus difficile à résoudre car un agent ne peut recevoir de valeurs que d'un seul autre agent à la fois pour une entrée donnée (pour éviter l'ambiguïté d'un calcul). L'agent doit donc arriver à trouver un agent qui soit libre sur une de ses entrées (et donc en NCSNeedIn) ou qui veuille bien changer de partenaire (voir le traitement de NCSNeedOutMessage).
NCSNeedInMessage : l'agent est informé des besoins de l'agent émetteur de la SNC et son attitude coopérative lui dicte deux actions. D'une part, il doit juger s'il est compétent pour les besoins de l'émetteur et si c'est le cas, il se propose pour être partenaire. D'autre part, même s'il n'est pas lui-même compétent, une de ses accointances peut l'être. Il va donc effectuer ce que la technologie AMAS appelle une résorption par propagation restreinte (cf.  REF _Ref67821960 \r \h 2.4.4.4).
NCSNeedOutMessage : le traitement est similaire à la NCSNeedInMessage à un point près, c'est que l'agent ne se juge compétent que s'il possède actuellement une entrée libre. Dans le cas contraire, et s'il est pour autant potentiellement pertinent (s'il n'était pas déjà pris), il considère qu'il y a un conflit d'intérêt entre son partenaire actuel et l'émetteur. C'est un cas classique où le traitement local, parce qu'il n'est pas informé de tout, doit prendre en compte plusieurs éventualités. Il est possible qu'un autre agent, ailleurs dans l'organisation, soit, lui, libre et compétent pour répondre à l'émetteur mais l'agent ne peut pas le savoir et ne sait pas non plus si l'émetteur arrivera à atteindre cet agent éventuel. Ne rien faire n'est donc pas coopératif. Mais pour autant, se proposer ne l'est pas non plus en considération de son partenaire actuel. Il choisit alors de baisser son taux de confiance envers son partenaire actuel. Si cette SNC se répète, il finira alors par rompre son partenariat actuel pour se proposer à l'émetteur (cf.  REF _Ref67821983 \r \h 2.4.4.5 pour le traitement du taux de confiance).
Une action supplémentaire bien particulière a également été rajoutée qui apporte beaucoup à la capacité des agents à trouver une solution qui les satisfasse tous au mieux : le cas de la sortie multiple (cf.  REF _Ref68080183 \h \* MERGEFORMAT Figure 21). Ce cas est détecté par un agent lorsqu'il reçoit une NCSNeedOut alors qu'il est lui-même connecté à plusieurs partenaires en sortie, et cela sans prendre en compte ses entrées (il peut même s'agir d'un agent ne requerrant pas d'entrées). L'explication est la suivante : l'agent sait qu'il y a un agent dans le système qui cherche une sortie pour lui-même (un agent à qui fournir sa valeur), c'est-à-dire une entrée libre chez un autre agent. Or, parce qu'il possède plusieurs partenaires en sortie, il est en train de "bloquer" leurs entrées et ses partenaires ne peuvent donc pas répondre immédiatement à l'agent en difficulté. L'agent va considérer que cette situation peut ne pas être coopérative car c'est une forme de monopole, dans le cas où ses partenaires se satisferaient peut-être aussi bien de l'agent en difficulté comme fournisseur. Il va alors en choisir un (par exemple celui avec le plus faible taux de confiance) et annuler leur partenariat afin de libérer l'entrée de son ex-partenaire qui pourra alors répondre favorablement à l'agent en difficulté. On peut noter que si cet ex-partenaire ne se satisfait pas du nouvel agent, rien ne l'empêche de revenir avec le premier.
NCSUselessness : cette SNC ne sera utile que lorsque EPE intégrera des mécanismes d'ajout et de suppression d'agent. Mais la disparition est relativement facile à mettre en place : il suffit qu'à chaque SNC l'agent diminue sa confiance en son utilité dans le système et que quand cette confiance arrive à zéro, l'agent décide de disparaître du système.

Avec la gestion de ces SNC, le système est capable de trouver une organisation dans laquelle tous les agents possèdent des partenaires pour leurs entrées et leurs sorties. Je parle alors d'organisation complète, dans le sens où tous les agents ont réussi à compléter leurs entrées et sorties. Mais l'organisation n'est pas pour autant capable de produire un résultat car des agents du système peuvent être bloqués. Ce qui mène aux actions à entreprendre pour la NCSBlockingSituation :
NCSBlockingSituation : que cette SNC soit due à un réel inter-blocage ou bien simplement parce qu'il manque un agent dans la chaîne de ses fournisseurs, l'agent ne peut rester indéfiniment dans l'incapacité d'effectuer son calcul. Dans ce deuxième cas, soit cette SNC se résorbe car l'agent dont il manque une entrée finit par trouver un partenaire et reçoit donc une donnée qu'il peut alors transmettre, soit l'agent décide que cela prend trop de temps et va chercher un partenaire plus réactif. Dans le cas de l'inter-blocage, l'agent arrive à la même conclusion : le temps d'attente est trop long (la spécification de ce temps d'attente ou les informations à prendre en compte pour l'évaluer sont pour l'instant dépendantes du contexte, i.e. de la simulation). L'agent décide alors de rompre son partenariat avec l'agent qui est dans l'incapacité de fournir sa valeur.

En rajoutant ce traitement de SNC, le système est capable de se trouver une organisation qui non seulement satisfasse tous les agents, mais qui soit également calculante. Tous les agents sont capables d'effectuer le calcul qui correspond à leur fonction. Ils sont alors à même d'envoyer une valeur à l'environnement qui produira certainement une NCSInadequateData dont le traitement est le suivant :
NCSInadequateData et NCSInadequateDataMessage : cette SNC indique que le système, c'est-à-dire l'organisation des agents au moment du calcul, a produit une valeur non satisfaisante pour l'environnement. Comme c'est l'ensemble des agents qui a produit cette valeur, il est a priori impossible de localiser directement le ou les agents qui ne sont pas à la bonne place dans l'organisation. Une première partie du traitement concerne donc la propagation de cette SNC dans l'organisation.
Différentes propagations ont été imaginées et en cas de viabilité, testées. Nous pensions au début pouvoir trouver pour chaque agent des raisons pour choisir sur laquelle de ses entrées propager mais pour des agents aussi simples que les instructions, l'attribution de la faute à une entrée précise est impossible : le fait que l'agent ne fournisse pas la bonne valeur peut venir de n'importe laquelle de ses entrées. Ensuite, on peut imaginer de ne propager que sur une certaine distance, la SNC s'atténuant au fur à mesure des transmissions. Mais dans ce cas, les agents proches de l'agent "Out" sont pénalisés.
J'ai ensuite testé des solutions basées sur les taux de confiance, et donc en quelque sorte un système de poids sur les liens entre agents, comme de propager sur les liens les plus fragiles. Une version améliorée a également été implémentée se basant sur un choix probabiliste pondéré (tirage de Monte-Carlo) en fonction du poids des liens : plus un lien est fragile, plus il a de chances d'être choisi pour la propagation. Cette solution intègre aussi une chance limitée d'arrêt de la propagation. Mais ces solutions possèdent également leurs effets pervers comme de fragiliser artificiellement certains agents.
Au final, la solution la plus simple consistant à propager à tous les agents le long de l'organisation qui a conduit au résultat est encore la moins biaisée. Je discute en détail des résultats de ces expérimentations dans la partie  REF _Ref67832464 \r \h  \* MERGEFORMAT 3.
La deuxième partie du traitement concerne la prise en compte par l'agent lui-même de la critique qui est faite au système dans sa globalité. Cela revient pour l'agent à se poser la question suivante : "est-ce que je fournis mon résultat à la mauvaise personne ou bien est-ce que je fournis le mauvais résultat ?". Donc doit-il remettre en cause son partenariat avec l'agent de sortie qui lui a transmis la SNC ou bien remettre en cause ses agents d'entrées ? Comme là non plus il n'a pas de moyens de juger, et que d'autre part il ne sait pas s'il est réellement responsable, il va baisser tous les taux de confiance des agents avec lesquels il a effectué le calcul qui a conduit à la SNC. L'idée est que de fragilisation en fragilisation, la partie la plus fragile de l'organisation va rompre des partenariats ce qui conduira à construire une nouvelle organisation. Et donc produire un résultat différent à fournir à l'environnement.
Résorption par propagation restreinte
Quand un agent reçoit un message lui indiquant une SNC, il est rarement sûr d'être celui qui va apporter indéniablement la solution. Comme d'autre part les agents n'ont qu'un point de vue local et par conséquent un nombre d'accointances réduit, il faut un mécanisme pour propager les messages afin de permettre d'atteindre éventuellement, par transitivité, d'autres agents peut-être susceptibles d'apporter une solution. Ce mécanisme ne doit pas pour autant saturer l'organisation de messages. Comme pour l'envoi du message initial (décrit pour la NCSNeedIn), différentes stratégies ont été testées. Elles visent toutes à assurer qu'au bout d'un certain temps des agents non connus par l'émetteur initial soient contactés, sans peser trop sur la quantité de communications.
Au final, la solution retenue dans EPE est d'effectuer un cycle sur les accointances (pour ne pas choisir toujours les mêmes) et d'en choisir un petit nombre à la fois. Des stratégies plus sophistiquées semblent inutiles car de toute façon, l'agent renouvelle régulièrement ses accointances en fonction de l'évolution de ses partenariats et des agents avec lesquels il communique.
Ensuite, une SNC ne doit pas circuler ad vitam aeternam dans l'organisation. De plus, en cohérence avec le principe de localité cher aux agents, on va supposer qu'une SNC donnée concerne en priorité les agents dans la localité (en terme d'interaction et de connaissance) de l'agent qui la détecte. Chaque message de SNC se voit donc attribué une sorte de TTL (Time To live) qui indique la distance qu'elle va parcourir. Cette distance est simplement mesurée en nombre d'agents traitant cette SNC et la propageant. Avant de propager une SNC, un agent décrémente ce TTL et vérifie si elle est encore valide. Dans le cas contraire, il ne propage pas cette SNC.
Gestion du taux de confiance
Pour pouvoir décider où et quand rompre un partenariat, et ensuite quel nouveau partenaire choisir, mon premier choix s'est porté sur un système de gestion d'une valeur associée à chaque accointance qui correspond à un jugement de la confiance accordée à cet agent en tant que partenaire de calcul. Ce mécanisme est très courant dans les SMA où les agents sont particulièrement anthropomorphisés (classiquement pour des agents représentatifs d'utilisateurs comme dans le commerce électronique par exemple) et par extension, cela est souvent appliqué même pour des agents moins cognitifs. Cela paraissait donc naturel de laisser les agents se faire un jugement sur leurs accointances jusqu'à obtenir les partenaires qui leur conviennent le mieux.
Concrètement, pour chaque accointance, j'ai associé une valeur de 0 à 100, 100 étant la confiance maximum qu'un agent puisse accorder à un autre. J'ai ensuite fixé un seuil à 50 qui constitue la limite de partenariat : si le taux de confiance passe en dessous, l'agent rompt le partenariat de travail. La valeur d'initialisation lors de la création d'un partenariat est fixée à 75. Pour chaque SNC, l'agent peut alors réduire ce taux de confiance, ce qui représente le doute que l'agent émet quant à la pertinence de leur collaboration pour la tâche donnée.
Renforcement des taux de confiance
Comme les agents baissent leur taux de confiance envers leurs partenaires quand des SNC apparaissent, il paraissait naturel de valoriser certains partenariats se déroulant dans de bonnes conditions. Mais le seul critère, lors d'un calcul donné, pour ce renforcement est le calcul lui-même, ou sa durée : un agent effectuant des calculs peut se juger positivement dans le sens où il contribue au fonctionnement des agents autour de lui. Mais dans ce cas, tous les agents augmentent de façon identique leurs taux de confiance les uns envers les autres, et ce sans pour autant être pertinent quant aux exigences de l'environnement.
Il est en fait impossible de décider qu'une partie précise de l'organisation devrait être plus "soudée" (par leurs taux de confiance) qu'une autre sans l'évaluer indépendamment des autres et pour sa fonction propre. Ce renforcement ne serait donc valide pour un système que par rapport au jugement de l'environnement. On peut donc imaginer qu'un système ayant à apprendre une fonction compliquée ait besoin d'être renforcé dans sa confiance lors du calcul de certaines valeurs satisfaisantes pour l'environnement, avant de passer à d'autres calculs qui le remettraient en cause.
Mais dans le cas de la factorielle, comme cette fonction est très spécifique compte tenu du pool d'agents, dans le cas d'un jugement positif pour une valeur donnée, le système aura probablement toujours réussi à créer la bonne organisation. Je n'ai donc pas implémenté ce renforcement dans EPE, jugeant par ailleurs qu'il incombe à la résorption des SNC de conduire à la bonne organisation.
Spécificité des agents à entrées et sorties génériques
On peut noter un comportement spécifique aux agents "FirstTime" et "Égale" quant au traitement de certaines SNC dû au fait qu'ils sont capables de manipuler un certain nombre de types de données différents. Par exemple, l'agent "Égale", bien qu'il produise toujours un booléen en sortie, peut comparer en entrée deux entiers, deux chaînes de caractères, deux réels ou même deux booléens (ou tout autre type de données si on lui donne la compétence associée). Il suffit qu'au moment où l'agent doit effectuer son calcul, ses deux entrées soient du même type. Ces agents dit "génériques" vont donc "s'instancier" au moment de choisir des partenaires et ces choix doivent être cohérents : si un agent "Égale" choisit un agent fournissant un entier comme partenaire pour une de ses entrées, il doit ensuite chercher un partenaire pour son autre entrée produisant lui aussi un entier.
Par contre, une fois instancié pour un type donné, l'agent doit pouvoir remettre en cause ce choix (choix qui, par ailleurs, a pu lui être demandé par un autre agent cherchant un partenaire) car l'organisation en cours de structuration ne peut ou ne veut pas forcément utiliser cet agent de cette façon. L'agent peut tout simplement être bloqué lui-même dans sa recherche de partenaires s'il ne trouve pas de partenaire appareillé. C'est pourquoi les agents génériques, lorsqu'ils sont confrontés à des SNC de type NCSNeedIn ou NCSNeedOut, sont capables de douter de leur typage sous forme de décrémentation de la valeur de confiance sur le typage actuel, ce qui prend la forme d'un décrémentation du taux de confiance en leurs partenaires. Et si cette confiance tombe à zéro, ils rompent leurs partenariats actuels et redeviennent génériques. De la même façon, si un agent générique reçoit des SNC de type NCSNeedInMessage ou NCSNeedOutMessage qui ne sont pas du type traité actuellement par lui (i.e. dont la demande ne correspond pas à cause du type), bien qu'il ne réponde pas à la demande en se proposant, il ne reste pas pour autant passif et il diminue sa confiance en ses partenaires actuels pour signifier son doute quant à son utilité dans la configuration actuelle qui l'oblige à traiter un certain type de données.
Le choix d'un nouveau partenaire
Au bout de plusieurs (si nécessaire) émissions de SNC de type NCSNeedInMessage ou NCSNeedOutMessage, un agent aura reçu des propositions de partenariat d'autres agents (à moins qu'il n'y ait pas d'autres agents à même de le satisfaire ou que ces agents ne sont pas atteints pas ses messages). Il peut alors choisir parmi cette liste de propositions celle qui l'intéresse le plus afin de créer un partenariat entre lui et son choix. Cette liste est en fait constituée de partenaires potentiels car comme les agents sont autonomes, une proposition à un moment donné peut très bien ne plus être valide au moment où l'agent décide de l'accepter. Par exemple, un agent à qui il manque une entrée va se proposer naturellement lorsqu'il reçoit un NCSNeedOutMessage compatible avec ses propres besoins, mais si au moment où l'agent demandeur se décide à le choisir comme partenaire il a déjà trouvé un autre partenaire, il refuse la demande. Il y a donc un mécanisme de négociation par messages pour que les agents arrivent à se synchroniser pour établir un partenariat.
Le choix en lui-même du partenaire potentiel à contacter se fait dans cette première version simplement en comparant les taux de confiance. Nous supposions au départ être capables de donner à un agent un jugement personnel sur les relations qu'il aura entretenues au cours du temps avec d'autres agents, celles entraînant plus de SNC étant jugées moins favorablement. Il paraît donc naturel de préférer pour partenaire un agent avec lequel les conflits auront été les moins nombreux. La partie  REF _Ref68076356 \r \h 3 détaille ce qu'il en est pour des agents instructions.
Un paramètre important vient se rajouter au choix basé sur les taux de confiance : la recherche de nouveauté. Comme l'organisation doit, d'une certaine manière (la plus efficace possible), parcourir l'espace des organisations pour trouver celle voulue par l'environnement, il faut à tout prix éviter de rester trop longtemps dans les mêmes configurations ou de revenir dans celles déjà parcourues. Du point de vue de l'agent, rien ne permet de l'assurer entièrement mais un mécanisme simple tenant compte de la mémoire des derniers partenariats pour effectuer le choix permet d'exprimer assez efficacement le désir d'aller vers la nouveauté, i.e. d'explorer des organisations non encore atteintes. L'agent va donc simplement privilégier des agents avec lesquels il n'a encore jamais eu de partenariats. Mais ce choix n'est pas définitif : si un autre agent insiste pour devenir le partenaire de notre agent, celui-ci tient compte des demandes répétées et relâche sa contrainte de nouveauté (il suppose que l'autre agent a de bonnes raisons de vouloir un partenariat avec lui comme par exemple le cas où il est le seul partenaire possible pour cet agent).
On évite aussi ainsi ce que j'appelle l'"effet balançoire" qui est las cas où un agent ne fait, comme unique changement, que des commutations de partenariats entre deux agents. Si tous les agents se comportaient avec un "effet balançoire", on n'explorerait en tout et pour tout que deux organisations. Ce phénomène me semble assez probable dans les SMA en général, à défaut de mécanisme de contre, car l'agent avec lequel on vient de rompre un partenariat est dans une certaine "proximité", ce qui fait qu'au prochain appel, il est probable qu'il réponde plus vite que les autres.
Résumé
Pour pouvoir discuter des choix précédents pour l'auto-organisation coopérative dans la suite, notamment pour l'explication des résultats expérimentaux ainsi que pour comparer cette première version à celle décrite dans la partie  REF _Ref68336949 \r \h 4, je vais résumer les pages précédentes sous forme de fiches pour chaque agent. Chaque fiche résume la fonction de l'agent, les SNC qu'il est capable de détecter et les corrections associées.





     
Résultats expérimentaux et analyse des organisations
L'implémentation de EPE décrite dans le  REF _Ref69045026 \r \h Chapitre IV a permis de tester pleinement le comportement théorique des agents décrit dans la partie  REF _Ref68323472 \r \h 2, notamment grâce aux outils d'observation développés au sein d'EPE. Ces outils qui donnent des informations précises à la fois sur le comportement individuel des agents, et sur l'évolution au cours du temps des organisations parcourues, ne servent en rien aux agents eux-mêmes, mais m'ont été très utiles pour deux points.
Tout d'abord ils m'ont permis de développer le code des agents jusqu'à obtention du comportement, pour chaque agent, tel que je l'avais imaginé. Cette tâche à elle seule a pris énormément de temps : il y a un gouffre entre la description du fonctionnement des agents et la réalité en terme de code. Au fur et à mesure que je lançais des simulations, il me fallait corriger le code des agents pour que leurs comportements correspondent bien à mes spécifications et évitent des effets de bord ou d'interactions imprévues. Cette phase de couplages expérimentation/implémentation est très proche de l'idée de Living Design [Georgé 03a] décrite dans la partie  REF _Ref68335117 \r \h 4.4 du  REF _Ref68335132 \r \h Chapitre I.
Ensuite, ces outils m'ont permis, en tant qu'observateur des agents et du système, de comprendre les conséquences des comportements individuels et de la dynamique des interactions. En voyant les simulations, j'ai eu un retour sur les comportements d'auto-organisation imaginés au départ et sur leurs limitations. J'ai ainsi pu expérimenter des variations de la stratégie d'auto-organisation définie initialement : gestions des accointances, gestion des taux de confiance, pénalisations plus ou moins importantes en fonction des SNC, détections des SNC, propagations des SNC, choix des partenaires, etc…
Je décris dans cette partie les résultats synthétiques obtenus lors des simulations sur EPE dans le cadre du "mécanisme" de la factorielle (i.e. de l'exemple avec 10 agents qui ne prend pas en compte les cas 0 et 1) ainsi qu'une analyse de ces résultats. En conséquence, j'ai réalisé une étude plus poussée de la topologie de l'espace des organisations possibles pour le problème de la factorielle. Des résultats de cette étude sont discutés ici ainsi que de leur implication pour la seconde stratégie d'auto-organisation par coopération décrite en détail dans la partie  REF _Ref68336949 \r \h 4.

Résultats expérimentaux et difficultés
Compte tenu des nombreux mois passés à expérimenter des multiples variations de la stratégie initiale, je ne vais présenter ici que les résultats et réflexions pour la version la plus aboutie de cette première stratégie. Et comme même cette version avancée ne donne que des résultats limités, j'insisterai surtout sur les réflexions quant aux problèmes rencontrés. En effet, je ne suis pas parvenu avec cette version de la stratégie d'auto-organisation à créer un système capable de tendre vers l'adéquation fonctionnelle souhaitée.
Avant de rentrer dans les détails je voudrais insister sur le fait que, bien que l'adéquation fonctionnelle n'ait pu être atteinte ici, d'autres mécanismes nécessaires au bon fonctionnement du système ont, eux, été testés avec succès. Ainsi, les agents instructions de EPE possèdent déjà dans cette version les compétences suffisantes pour traiter efficacement toutes les SNC originaires de l'intérieur du système, et seule la NCSInadequateDataMessage (générée par l'environnement et donc introduite dans le système de l'extérieur) ne peut être résorbée.

Une étape importante vers le milieu intérieur coopératif
Quand un système arrive à résorber toutes les SNC en son sein (et donc aussi celles qui pourraient lui être transmises par l'environnement, car elles finissent pas être reportées dans l'intérieur du système), la théorie AMAS indique qu'il est situation de "milieu intérieur coopératif". Cela signifie qu'il n'y a plus de conflits ou problèmes quelconques en suspens dans le système et donc que tous les agents sont continuellement en situation de coopération les uns envers les autres, mais aussi avec l'environnement du système. Une première étape importante vers cet état est atteinte très rapidement par les agents dans EPE pour l'exemple de factorielle : la résorption des SNC endogènes (apparues à l'intérieur du système).
Dans l'état initial, pour l'exemple factorielle, aucun agent ne possède de partenaires et ils connaissent tous une accointance (arbitrairement l'agent "In") qui les connaît tous. Ce choix sert uniquement à assurer une connexité au départ, et rapidement les agents mettent à jour leurs accointances en fonction des interactions avec des agents qu'ils ne connaissaient pas et qu'ils rencontrent grâce à la propagation de leurs messages. Les agents sont alors tous dans des situations de NCSNeedIn et NCSNeedOut : ils doivent trouver des partenaires pour pouvoir effectuer leur fonction et fournir le résultat. Bien sûr, des conflits d'intérêts (besoin ou choix du même agent, plus d'agents disponibles) apparaissent et les agents doivent coopérativement trouver des solutions les satisfaisant tous au mieux. Ils se transmettent alors des NCSNeedInMessage et NCSNeedOutMessage. De plus, pour arriver à un calcul effectif de bout en bout, ils doivent éviter les situations bloquantes (NCSBlockingSituation).
On peut constater que l'espace de recherche, même pour seulement 10 agents, est déjà énorme : 1012 (cf. partie  REF _Ref68404803 \r \h 3.2 où j'explore en détail les organisations possibles avec les agents de l'exemple factorielle). Cela signifie qu'il existe 1012 organisations possibles, en tenant compte des nombreuses organisations incomplètes (où des agents ne sont pas satisfaits). Il ne faut pas oublier que d'une façon ou d'une autre, les agents parcourent ces organisations afin d'en trouver une qui les satisfasse. Et la proportion d'organisations complètes (tous les agents ont leurs entrées et leurs sorties) n'est que de l'ordre d'une sur 10.000. Et parmi celles là, environ une sur dix serait calculante : au sein de laquelle les agents ne sont pas bloqués pour effectuer leurs calculs. Donc seulement une organisation sur 100.000 satisfait les contraintes de calculabilité propres aux agents. Les agents doivent donc arriver avec des interactions locales à "trier" en quelque sorte les organisations pour trouver une de ces organisations calculantes.
Pourtant, les agents dans EPE pour l'exemple factorielle trouvent une organisation complète en parcourant seulement moins d'une dizaine d'organisations. Cela signifie en fait que les agents n'ont besoin de rompre que très peu de partenariats établis à un moment donné et que quand ils le décident, cela se fait de façon efficace en ne rompant les liens pratiquement que là où cela est nécessaire. Les contraintes des agents concernant leurs besoins et caractéristiques sont également prises en compte en amont des décisions de partenariat et quand un agent décide d'un partenariat, son choix est la plupart du temps relativement pertinent. Ensuite, pour obtenir une organisation calculante, moins d'une centaine d'organisations est parcourue, sur les 1.000 milliards possibles. Là aussi, cela signifie que les agents évitent efficacement les situations bloquantes et que quand elles sont effectivement rencontrées, elles sont supprimées rapidement.
La théorie AMAS et son application pour des agents instructions tel qu'elles ont été développées dans EPE se sont donc révélées particulièrement efficaces pour traiter les contraintes internes au système. Comme la théorie AMAS précise que les systèmes à milieu intérieur coopératifs sont des systèmes fonctionnellement adéquats (qui produisent la fonction souhaitée), et que pour obtenir ces systèmes à milieu intérieur coopératifs toutes les SNC doivent être résorbées, les systèmes prétendant à l'adéquation fonctionnelle doivent déjà être capables de résorber les SNC endogènes. La version actuelle de EPE produit ce genre de systèmes. Ceci est un résultat encourageant pour la suite : résorber les SNC exogènes afin d'obtenir un système fonctionnellement adéquat.

Une capacité certaine à se réorganiser
Malgré l'efficacité des agents EPE à traiter les SNC endogènes, la stratégie du traitement du feedback de l'environnement par la NCSInadequateDataMessage telle qu'elle est décrite dans le point  REF _Ref68410171 \r \h 2.4.4.3, ainsi qu'un certain nombre de variantes, se sont révélées décevantes. Tous les mécanismes techniques pour explorer l'espace des organisations possibles sont bien en place, mais cette exploration ne tend pas vers une organisation fonctionnellement adéquate.
A chaque retour de l'environnement pour indiquer que le système ne produit pas la valeur souhaitée, les agents prennent bien en compte la SNC et changent d'organisation en se fiant à leurs taux de confiance en leurs accointances. Ils se réorganisent donc en de nouvelles organisations qui produisent alors des valeurs généralement très différentes. Comme de nouvelles SNC apparaissent et que la NCSInadequateDataMessage circule au travers du système, les agents mettent à jour leurs confiances et se créent une représentation des autres agents dans le système. A chaque choix de nouveau partenaire, l'agent a l'impression, par le choix d'un nouveau partenaire en qui il a confiance, de bien résorber la SNC de l'environnement. Mais, comme je le montre dans la suite, cette confiance n'a pas de lien fondamental et orienté (dans le sens où il est censé donner une direction au système) avec l'adéquation fonctionnelle.
La capacité que les agents EPE exhibent à se réorganiser en suivant des considérations locales et en arrivant à s'y conformer est encourageante. Car, bien que dans cette première tentative d'auto-organisation le critère de réorganisation (la confiance) ne permet pas un traitement correct du feedback, il suffit de trouver un autre critère à donner aux agents sur lequel ils puissent s'appuyer.

Le problème des agents autonomes et de l'opposition "but local / but global"
Le problème rencontré dans EPE est très général dans les SMA : la difficulté à gérer des agents réellement autonomes. Dans un cas simple, il suffit d'imposer une quelconque supervision aux agents afin des les amener à réaliser la tâche que l'on attend d'eux. Mais les applications qui nous intéressent, et plus généralement toutes celles qui ont une réelle spécificité "SMA", ne s'y prêtent tout simplement pas. Il faut alors intégrer au sein du comportement autonome de l'agent, et donc de façon répartie, des contraintes qui vont jouer le même rôle que la supervision : amener le système à exhiber le comportement adéquat. Ceci constitue le but global du système et ce but doit émerger par l'interaction des agents qui oeuvrent à réaliser leurs propres buts, les buts locaux.
Il convient donc d'intégrer dans les buts locaux une "graine" de ce qui donnera le but global. Mais, et c'est un point très important, le but global ne peut en aucun cas être explicitement intégré dans le but local. En effet, si on pouvait le faire, on connaîtrait directement la solution pour réaliser la tâche voulue. Par exemple, donner à chacun des agents de factorielle la liste des accointances qu'il devra prendre pour partenaire, car on connaît l'organisation qu'on voudrait obtenir. Ceci est bien sûr irréaliste dans un problème réel où, justement, on ne connaît pas cette organisation, mais on connaît par exemple les valeurs que l'on veut obtenir. Ce que l'on introduit dans le but local doit donc être d'une nature différente, tout en étant corrélé avec le but global. La coopération introduite par la théorie AMAS peut être vu comme la forme unique et "universelle" de corrélation.
La stratégie d'auto-organisation par gestion de taux de confiance se voulait une réponse à ce problème. Comme les agents se créent eux-mêmes leurs confiances en les autres agents au cours du fonctionnement du système, le but global n'a pas à être explicitement intégré dans les agents. Et comme les variations de confiance sont produites par le feedback de l'environnement, nous pensions initialement qu'elles reflèteraient à terme le but global. De par la nature du problème de la programmation émergente et par la nature du feedback, ce n'est pas le cas, comme expliqué dans la suite.

Un problème fortement discontinu
Abordé dans la partie  REF _Ref68426091 \r \h 6 du  REF _Ref69267986 \r \h Chapitre I qui présente une classification des problèmes traités jusqu'alors par l'équipe, le concept de programmation émergente est d'une nature particulière, que j'ai appelé fortement discontinue. Tout d'abord, la fonction produite par le système est elle-même discontinue. On le voit sur l'exemple de la factorielle par les valeurs produites (1, 1, 2, 6, 24, 120, 720…) qui ne résultent pas d'une courbe continue définie par équation mais d'un algorithme récursif. Plus généralement, dès qu'il y a des boucles et des branchements, on perd la notion de continuité.
Ensuite, la réorganisation du système est elle aussi discontinue : un changement d'organisation au sein du système entraîne la plupart du temps un changement radical de la fonction produite. En effet, si un agent instruction change de place dans l'organisation, le code représenté par l'organisation n'est plus le même. Le système ne peut donc pas progresser continuellement en regard de la fonction globale (avancer petit pas par petit pas et juger à chaque fois le progrès effectué).
Ces caractéristiques font, à mon avis, qu'un parcours de l'espace de recherche des organisations en programmation émergente est forcément chaotique en apparence : le système "saute" d'organisation en organisation avec à chaque fois un résultat très différent. Et c'est bien le comportement observé pour la factorielle. Mais ce parcours chaotique en apparence devrait contenir, au sein des agents, une direction garantissant un parcours efficace et non aléatoire.

Le manque d'information : un parcours "aveugle"
La gestion de taux de confiance devait permettre aux agents de se construire une représentation de la direction dans laquelle effectuer les changements pour arriver à l'organisation adéquate, tout en changeant de partenaires et donc en produisant des organisations radicalement différentes. Comme ce taux de confiance est influencé par le feedback, il s'agissait d'effectuer une forme d'approche par "essai/erreur" pour permettre aux agents d'apprendre progressivement quels partenaires donnaient les meilleurs résultats. Seulement, à cause de la nature discontinue du problème, et parce que factorielle (ou généralement tout algorithme précis) est suffisamment spécifique dans les valeurs produites, tant que le système ne tombe pas exactement sur l'organisation (et dans ce cas, la recherche est terminée), les organisations sont quelconques et le feedback signifie simplement au système que la valeur n'est pas la bonne. Le système reçoit donc continuellement le "même" feedback négatif.
De plus, la seule propagation équitable que j'ai trouvée distribue sur tous les agents ce feedback négatif : il n'est pas possible d'attribuer l'échec sur un agent ou un groupe d'agents particulier. En conséquence, les agents se forgent effectivement une confiance envers les autres, mais tous les agents le font de la même manière et sur le même critère négatif. Au final, le choix des partenaires revient à un tirage partiellement aléatoire car les taux de confiance ne sont au final qu'une mémoire d'interactions passées, toutes infructueuses. Avec cette première stratégie, il n'y a donc pas dans les mécanismes d'auto-organisation de direction donnée par une forme quelconque d'attracteur, si ce n'est une recherche de nouveauté; ce qui ne suffit pas.

Un feedback de type "plus grand / plus petit"
L'idée qui vient alors à l'esprit est de donner système un feedback qui lui indique s'il doit produire une valeur plus grande ou plus petite. Aux agents alors de traduire ce but et d'essayer de produire une organisation qui réponde à cette demande. La raison pour laquelle je n'ai pas tout de suite eu recours à cette information est due à la nature discontinue de la réorganisation du système qui implique deux inconnues importantes.
Tout d'abord, imaginons que le système produise une valeur proche de la valeur attendue mais trop petite. Le feedback lui indique alors de continuer à essayer de faire plus grand. Mais au moindre changement de partenariat au sein de l'organisation, le résultat ne sera-t-il pas complètement différent ? Par exemple beaucoup trop grand, et les agents n'ayant pas changé seront alors dans une position où ils ont reçu pour les mêmes partenaires des feedbacks contraires. Quelle confiance leur accorder alors ? Le fonctionnement par confiances tel qu'il a été défini semble alors compromis. Mais une autre forme de prise en compte du feedback pourrait être imaginée.
Ensuite, et c'est la question la plus importante, une valeur proche de la valeur souhaitée signifie-t-elle que les agents sont proches d'une bonne organisation ?

Proximité organisationnelle, proximité fonctionnelle
J'ai formulé la question de cette manière : "y a-t-il une correspondance entre la proximité fonctionnelle et la proximité organisationnelle pour une organisation donnée ?". "Proximité fonctionnelle" signifie que la valeur produite par l'organisation est proche de la valeur attendue. Et "proximité organisationnelle" signifie que l'organisation a de nombreuses similitudes avec l'organisation qui produit la valeur attendue. Ces similitudes s'expriment simplement en nombre de partenariats identiques entre les deux organisations (les même connections ou liens).
Cette question est importante car sa réponse influe sur la façon dont nous pouvons juger une organisation qui produise une valeur proche de celle attendue : cette organisation est-elle meilleure qu'une autre produisant une valeur plus éloignée ? Si oui, nous pouvons alors renforcer les préférences des agents pour ce type de configuration. Mais la réponse à la question est pour le moins incertaine à cause de la nature fortement discontinue du problème : un changement minime dans l'organisation (qui reste donc proche organisationnellement) peut amener l'organisation à produire un résultat très différent (et on perd la proximité fonctionnelle).
Avant de poursuivre mes recherches sur les stratégies d'auto-organisation, j'ai considéré comme nécessaire d'avoir une meilleure connaissance de l'espace de recherche de factorielle : combien d'organisations différentes sont parcourues, ce qui les caractérise, les proportions relatives des différents types d'organisations, les valeurs produites, le rapport entre les organisations et les valeurs produites, etc... Ce travail est explicité dans le point suivant.

Analyse statistique des organisations
Pour l'exemple de la factorielle tel qu'il est décrit, 10 agents sont nécessaires et chacun peut se lier aux autres de différentes façons (en fonction du choix du partenaire). Le nombre d'organisations différentes est de 1012 (détail du calcul dans la suite). Ce nombre est donc déjà très important malgré le nombre d'agents limité, et on peut effectuer des classements au sein de ces organisations en fonction de leurs propriétés. La propriété principale est la capacité de l'organisation à fournir ou non une valeur à l'environnement.
L'étude rapportée dans cette partie détermine le rapport entre la distance des valeurs produites par les organisations à la valeur attendue par l'environnement, et les similitudes entre ces organisations et celles qui produisent le bon résultat (il en existe plusieurs, identiques à des permutations d'agents près, dont la fonction est donc identique). C'est ce que j'ai appelé "le rapport entre la proximité fonctionnelle et la proximité organisationnelle".
Par ailleurs, l'étude explicite aussi les proportions relatives des différents types d'organisations pour nous permettre de nous rendre compte de la difficulté du parcours de l'espace de recherche par les agents. Ces différentes catégories emboîtées sont les suivantes (cf.  REF _Ref68762642 \h Figure 22) : espace de recherche total, organisations complètes théoriques, organisations complètes réelles, organisations calculantes, organisations fonctionnelles.


La question de l'espace de recherche, de son parcours et le rôle de la coopération
Une autre façon de considérer un système composé d'agents qui s'auto-organisent pour adapter le système aux contraintes de son environnement, est de discrétiser son fonctionnement en étapes élémentaires (chaque étape est un seul changement de lien qui produit une nouvelle organisation) et d'interpréter l'auto-organisation comme un processus essayant successivement, par étapes élémentaires, des organisations issues de l'ensemble des organisation possibles, et ce dans un certain ordre. L'ensemble des organisations possibles constitue l'espace de recherche, les essais successifs représentent le parcours de l'espace de recherche, et l'ordre dans lequel s'effectue ce parcours est le pendant de la stratégie de recherche.
Si une solution existe pour un problème donné, l'organisation répondant à ce problème se trouve dans l'espace de recherche et le but du système est d'effectuer le parcours le plus efficace possible pour trouver l'organisation adéquate. Les deux stratégies les plus simples mais aussi les moins efficaces sont le parcours systématique (essai combinatoire des liens, quel que soit l'ordre choisi) et le parcours chaotique (essai des liens au hasard).
La théorie AMAS affirme en substance que le critère de la coopération, telle qu'elle y est définie, est un critère pour guider localement les agents dans leurs choix afin que le système, dans sa globalité, effectue un parcours efficace de l'espace de recherche. Toute la difficulté vient de l'instanciation de la notion de coopération à un problème donné, et donc à son espace de recherche particulier. Le but de l'étude statistique des organisations effectuée ici peut se redéfinir en la recherche des critères sur lesquels baser la coopération des agents, ces critères étant liés à la nature de l'espace de recherche.

Génération des organisations et catégorisation
Pour pouvoir analyser l'espace de recherche toutes les organisations possibles ont été générées par combinatoire sur les liens, y compris les organisations partielles (dont certains agents n'ont pas toutes leurs entrées). Ces organisations font partie intégrante de l'espace de recherche car les agents parcourent effectivement ces organisations lorsqu'ils essayent de trouver des partenaires. J'ai ensuite effectué des analyses en plusieurs étapes sur ces organisations.
Taille de l'espace de recherche
Les 10 agents qui constituent le système pour factorielle sont les suivants : AgentIn, AgentOut, AgentOne1, AgentOne2, AgentOne3, AgentAddition, AgentMultiplication, AgentEquals, AgentFirstTime1, AgentFirstTime2. L'AgentIn possédant déjà son partenaire d'entrée (l'environnement), les AgentOne ne requérant pas de partenaires d'entrées, et les 6 autres agents possédant 2 entrées à satisfaire, cela fait un total de 12 entrées auxquelles il faut trouver un partenaire. Tous les agents sauf l'AgentOut pouvant fournir des valeurs à autant de partenaires que nécessaire, nous avons donc 9 possibilités pour chaque entrée (je ne tiens pas compte des contraintes des agents pour ce calcul car la résolution de ces contraintes fait partie du parcours de l'espace de recherche qui va éliminer ou ne pas parcourir les organisations qui ne satisfont pas les contraintes, comme les contraintes de type). Il y a une dixième possibilité qui est le cas où une entrée n'a pas de partenaire. Là aussi, ces organisations, dites "partielles", font partie de l'espace de recherche bien qu'elles ne soient pas souhaitées.
Il y a donc 10 possibilités pour chacune des 12 entrées, ce qui fait 1012 possibilités d'agencements des agents. La taille de l'espace de recherche que les agents d'EPE doivent parcourir pour l'exemple de la factorielle est donc de 1.000 milliards.
Les organisations complètes théoriques
Le premier calcul concerne les organisations complètes théoriques : les organisations dans lesquelles toutes les entrées et sorties sont comblées sans tenir compte des contraintes de type des agents, ni le fait qu'un agent ne peut pas se fournir une valeur à lui-même. Ce dernier cas n'est pas admis par les agents car, pour la plupart des types d'agents, cela constituerait une situation bloquante évidente (l'agent attend sur une entrée une valeur qu'il doit produire lui-même, ce qu'il ne peut pas faire puisqu'il attend une valeur en entrée pour faire ce calcul). Et pour d'autres, comme l'AgentFirstTime, cela ne serait pas conforme à leur fonction. Par exemple, l'AgentFirstTime pourrait admettre comme deuxième entrée sa propre sortie et il serait tout de même calculant car il n'a besoin pour lancer son premier "calcul" que de la valeur disponible sur sa première entrée, ce qui mettrait à disposition cette valeur sur sa deuxième entrée pour la suite du calcul. Mais dans ce cas il ne produirait de toute façon toujours que la valeur qu'il avait reçue de sa première entrée. Il perd dans ce cas sa fonction de sélecteur entre deux flux de données et un agent de type "variable" (jouant le rôle d'une variable, pouvant être affectée d'une valeur et fournissant cette valeur à la demande) serait plus adéquat.
Mais encore une fois, comme ces contraintes sont à satisfaire lors du parcours de l'espace de recherche des agents, la taille de cet ensemble des organisations complètes théoriques nous donne une mesure des coupes que les agents auront à effectuer lors de ce parcours.
Pour le calcul, nous partons cette fois-ci des sorties qui doivent toutes être comblées (ce qui n'était pas nécessaire dans le cas précédent) : il y a 9 sorties à satisfaire et chacune a le choix entre 12 entrées. Mais une entrée ne peut satisfaire qu'une seule sortie (un agent n'admet qu'un partenaire pour une entrée donnée pour qu'il n'y ait pas d'ambiguïté dans le calcul). Nous avons donc 12 choix pour la première sortie, 11 pour la seconde, puis 10, puis 9, etc…jusqu'à 4 choix pour la 9ème. Il reste alors 3 entrées non satisfaites qui peuvent prendre n'importe laquelle des sorties : 9 choix possibles pour chacune. Nous avons donc au total : 12*11*10*…*5*4*9*9*9 = 58.198.694.400, soit près de 60 milliards d'organisations complètes théoriques.
Les organisations complètes réelles
Pour prendre en compte les contraintes inhérentes à la nature des agents, comme en particulier le type de donnée traitée, j'ai dû recourir aux agents EPE eux-mêmes afin de générer les organisations complètes satisfaisant ces contraintes. En effet, des cas complexes de contraintes apparaissent lorsque l'on assemble les agents, dus au fait, notamment, des agents génériques qui s'instancient dès le premier partenaire fixé. J'ai donc implémenté un programme qui essaye systématiquement d'assembler les agents dans toutes les configurations de l'espace de recherche des organisations complètes théoriques et qui ne garde que les organisations que les agents acceptent. Par exemple, si le programme essaye une configuration censée relier la sortie de l'AgentEquals avec une entrée de l'AgentAddition, les deux agents refusent et cette configuration n'est pas retenue.
En distribuant cette génération systématique sur plusieurs machines, j'ai obtenu en quelques semaines un ensemble de fichiers contenant les descriptions textuelles des organisations complètes réelles (réelles dans le sens où les agents acceptent ces organisations et qu'elles sont effectivement parcourues dans EPE). Ces descriptions servent ensuite pour effectuer les calculs correspondants dans EPE pour tester les propriétés suivantes : la capacité à calculer et à produire une valeur pour l'environnement. 116.076.866 organisations ont été ainsi produites. Les agents dans EPE gèrent donc efficacement leurs contraintes pour réduire les 60 milliards d'organisations complètes théoriques à près de 120 millions.
Les temps de calculs et le filtrage probabiliste
Parmi toutes ces organisations complètes réelles, nombreuses sont celles qui sont en fait "bloquantes", i.e. dont certains agents ne sont pas capables de produire une valeur à la demande car ils ne reçoivent pas leurs entrées. Ceci se retrouve dans la majorité des cas de cycles sur les liens (les AgentFirstTime permettent, eux, certains cycles). Comme les agents ont la capacité de traiter ces situations (NCSBlockingSituation) lorsqu'ils essayent de calculer, il suffit d'exécuter ces organisations dans EPE et de ne garder que celles qui ne font pas apparaître de SNC. Par la même occasion, on peut alors récupérer les valeurs produites.
Seulement, le test d'une seule organisation (création dans EPE, demande de valeur, détection de SNC) peut prendre plusieurs secondes (entre autre parce que pour détecter une situation bloquante, les agents doivent être sûrs du blocage et de ne pas être simplement en attente de la valeur d'un agent qui a besoin d'un peu de temps pour effectuer son propre calcul à cause de ses propres entrées : plus la chaîne des calculs à effectuer est longue, plus le dernier agent instruction devra attendre). Pour tester les 120 millions d'organisations complètes, une machine de puissance moyenne nécessiterait plusieurs années…
Pour la petite histoire, l'ensemble des fichiers au format "txt" contenant la description minimaliste des organisations (une simple suite de nombres correspondant aux numéros des sorties dans un ordre qui correspond aux entrées positionnées dans un ordre donné) et le numéro de l'organisation, une fois compacté, est un fichier de près de 500 Mo.
J'ai alors procédé à un filtrage probabiliste des organisations décrites dans les fichiers générés précédemment : un simple tirage pour chaque organisation qui lui donne une certaine chance d'être choisie. Avec une probabilité arbitraire de 0.001 (pour obtenir un nombre d'organisations acceptable pour les tests), le filtre a ainsi sélectionné un ensemble de 108.717 organisations. Comme j'effectue un tri avec équiprobabilité et que le nombre d'organisations effectivement testées reste suffisamment grand par rapport au nombre initial, les proportions obtenues avec les tests sur ce sous-ensemble peuvent être statistiquement extrapolées au nombre initial.
Les organisations calculantes
Pour chacune des 108.717 organisations sélectionnées, un calcul sur une valeur quelconque a été exécuté et seules celles qui ne produisaient pas de situations bloquantes ont été gardées. Seules 8.013 organisations sont ainsi calculantes, ce qui correspond à 7.4% des organisations sélectionnées. Si l'on ramène cette proportion aux organisations complètes, nous obtenons 8.589.688 organisations calculantes dans l'espace de recherche.
Les organisations fonctionnelles
Les 8.013 organisations calculantes ont alors effectué un calcul sur 11 valeurs allant de 4 à 14 par incréments de 1, pour avoir un panel suffisamment grand de valeurs, sans pour autant dépasser les bornes des entiers en Java, ce qui est rapidement le cas avec la factorielle. Et le choix de commencer à 4 se justifie par le fait que, d'une part, seulement le "mécanisme de la factorielle" est analysé, c'est-à-dire la factorielle sans les cas 0 et 1 qui ne peuvent pas être calculés avec les 10 agents, et que d'autre part, pour mettre en avant les différences entre les valeurs produites, des nombres plus grands sont mieux adaptés.
2.876 organisations ont été capables de fournir une valeur à l'environnement pour chacune des valeurs fournies en entrée du système. Les autres organisations ont été éliminées car pour au moins une valeur donnée en entrée, l'AgentOut n'a pas été autorisé par son entrée contrôle à fournir la valeur à l'environnement, ce qui empêche de les comparer équitablement avec factorielle. Ces 2.876 organisations correspondent à une proportion de 36% des organisations calculantes, ce qui, ramené à l'espace de recherche total nous donne 3.092.288 organisations fonctionnelles sur les 11 valeurs testées, soit environ 3.106 sur 1012 ou encore environ 1 sur 300.000.
Les valeurs produites ont été stockées pour effectuer les analyses suivantes sur la comparaison avec les valeurs produites par factorielle, ainsi que pour comparer les organisations dans leur structure en fonction du nombre produit.

Proximité fonctionnelle et proximité organisationnelle
Proximité organisationnelle
Le calcul de la proximité organisationnelle est effectué en comptant le nombre de liens identiques entre une organisation et une de celles qui calculent factorielle. Il existe en fait 96 organisations pour factorielle basées sur le modèle de celle donnée dans la  REF _Ref67470213 \h \* MERGEFORMAT Figure 19 par permutation d'agents du même type (l'AgentAddition par exemple nécessite la valeur 1 sur sa première entrée et il existe trois AgentOne différents qui peuvent remplir ce rôle) ou par permutation d'entrées (inversion des entrées pour l'addition par exemple). La proximité est donc le plus grand des nombres obtenus en comptant les liens identiques entre l'organisation testée et chacune des 96 organisations de factorielle. Une proximité de 0 signifie qu'aucun lien n'est identique et 12 que l'organisation est une de celles qui calcule factorielle. La proximité organisationnelle a été calculée pour les 2.876 organisations fonctionnelles et la  REF _Ref68862402 \h Figure 23 présente les proportions des différentes proximités organisationnelles.
Les résultats correspondent à l'intuition : peu d'organisations proches de l'organisation de la factorielle et peu d'organisations très éloignées. Dans les deux cas, le fait de fixer de nombreuses contraintes sur les liens (de nombreux liens identiques ou très peu) laisse peu de possibilités. On peut noter qu'il n'y a que 2 organisations avec 11 liens en commun avec factorielle et aucune qui corresponde exactement à factorielle dans les 2.876 organisations.

Proximité fonctionnelle
Pour calculer la proximité fonctionnelle, il s'agissait de calculer la différence entre les valeurs produites par les 2.876 organisations et la factorielle sur les 11 valeurs. Dans les faits, seule une organisation produisait des valeurs plus grande que factorielle : une organisation quasi-identique à factorielle mais dont le déclenchement de la production de la valeur vers l'environnement était décalé. Ceci paraît assez naturel compte tenu de la nature fortement exponentielle de la factorielle. Toutes les autres organisations produisent pour la plupart des valeurs en entrée des valeurs inférieures à factorielle.
De ce fait, plutôt que de calculer la différence, j'ai simplement gardé les valeurs telles quelles, les valeurs les plus grandes signifiant une plus grande proximité fonctionnelle. Pour chacune des valeurs d'entrée du système, on obtient alors des ensembles de nombres tels que ceux de la  REF _Ref68871341 \h Figure 26. Ce graphe est très peu lisible du fait d'une valeur à 120 qui disproportionne le graphe. Je le présente ici en exemple de la démarche dans la suite de "normaliser" les nombres excessivement grands par rapport à la moyenne des nombres considérés. Dans le cas du calcul sur la valeur 4, seul 1,5% des valeurs produites dépassent 10. D'une part, il s'agit juste de comparer les valeurs entre elles dans un rapport de "plus proche / moins proche" et la distance effective n'important pas, l'aspect "beaucoup plus proche" des grandes valeurs n'a pas d'importance. D'autre part, il s'agira dans la suite de calculer des moyennes par proximité organisationnelle et les valeurs excessivement grandes fausseraient artificiellement ces moyennes. On peut donc normaliser à 10 par exemple les valeurs produites pour la valeur 4 (toutes les valeurs supérieures à 10 sont ramenées à 10) et obtenir le graphe de la  REF _Ref68875535 \h Figure 25 qui représente bien mieux la répartition des valeurs.
Correspondance "fonction/organisation"
Le but final est d'étudier le comportement réciproque de la proximité organisationnelle et de la proximité fonctionnelle. Il s'agit donc de regrouper les organisations appartenant à la même proximité organisationnelle et d'étudier les valeurs produites pour chaque catégorie, pour ensuite établir une relation d'ordre entre ces catégories en fonction de l'ensemble des valeurs produites pour chacune. La  REF _Ref68871341 \h Figure 26 présente les valeurs obtenues pour la valeur 4, après normalisation à 10 et après avoir trié les organisations par proximité organisationnelle croissante. On distingue alors des sections de valeurs allant de la valeur 1 à la valeur 10 qui représentent le panel de valeurs obtenues pour une proximité organisationnelle donnée.
Le processus suivant consiste à établir le même graphe pour l'ensemble des 11 valeurs fournies en entrée. Pour cela j'ai simplement sommé pour chaque organisation les 11 valeurs produites. Puis j'ai effectué une normalisation à 200 qui correspond à nouveau à ramener à 200 les 1.5% de valeurs excessivement grandes. Comme les sections distinguables sur la  REF _Ref68871341 \h Figure 26 sont peu lisibles car comportant trop de valeurs, la moyenne des valeurs produites pour chaque catégorie de proximité organisationnelle a été calculée. On obtient alors le graphe final de la  REF _Ref68876854 \h Figure 27 qui représente, pour chaque catégorie de proximité organisationnelle, la moyenne de la somme normalisée des valeurs produites pour chacune des 11 valeurs. Autrement dit, ceci représente le rapport entre la proximité organisationnelle et la proximité fonctionnelle.

Analyse des résultats
L'analyse du graphique de la  REF _Ref68876854 \h Figure 27 nous permet principalement d'en déduire une tendance particulière dans le rapport entre la proximité organisationnelle et la proximité fonctionnelle : la proximité fonctionnelle croît avec la proximité organisationnelle. Plus précisément, l'analyse de ce graphe nous indique que, à l'exception des proximités organisationnelles de 2, 3 et 4, plus l'organisation est proche de celle de la factorielle, plus la moyenne des valeurs produites est elle aussi proche des valeurs produites par la factorielle.
Ceci est indéniable pour les proximités organisationnelles de 5 à 12 mais pour les proximités 2, 3 et 4, la moyenne reste supérieure à celle de la proximité 5. Cependant, comme les moyennes pour 3 et 4 ne dépassent pas celle de 6 et que celle de 2 (qui semble un cas à part par sa valeur élevée), ne dépasse pas celle de 7, et avec celle de 1 largement inférieure, il semble quand même pertinent d'affirmer la tendance de hausse corrélée pour l'ensemble des organisations.
Ce résultat est cependant à utiliser dans un cadre précis dicté par la réalité de ce que représente le graphe, c'est-à-dire des moyennes. Ainsi, si l'on se réfère à la  REF _Ref68871341 \h Figure 26, on remarque qu'il existe pratiquement le même panel de valeurs pour chaque proximité organisationnelle. Obtenir une valeur élevée pour une organisation donnée ne garantit bien sûr aucunement à l'organisation d'avoir de nombreux liens communs avec la factorielle, mais les moyennes montrent cependant que cette organisation a statistiquement plus de chances de l'être.

Conclusion
Je vais résumer ici la démarche décrite dans la partie  REF _Ref67365679 \r \h 3 qui consistait à analyser les résultats expérimentaux de factorielle et d'effectuer une analyse statistique de l'espace de recherche, et montrer en quoi les résultats statistiques ont orienté mes travaux vers l'étude d'une deuxième stratégie d'auto-organisation coopérative, décrite dans la partie  REF _Ref68336949 \r \h 4.

Stratégie par confiance inapplicable
La première stratégie d'auto-organisation coopérative testée n'a pas permis au système d'atteindre l'adéquation fonctionnelle, bien que le système parvienne à résorber les SNC endémiques et produire des systèmes fonctionnels. L'étude de cet échec montre que la stratégie utilisée, basée sur une évolution des taux de confiance des agents envers leurs accointances en fonction d'un feedback de l'environnement indiquant l'adéquation de la valeur, revenait à un parcours aveugle de l'espace de recherche. Les raisons portent principalement sur la nature trop peu informative de ce type de feedback et sur la nature fortement discontinue du problème de la programmation émergente. Le fait que le système soit composé d'agents de bas niveau très génériques par rapport au problème final creuse encore plus l'écart entre le but local des agents et le but global du système.
Pour développer une stratégie intégrant un attracteur local pour les agents (i.e. une "direction" vers la bonne organisation), j'ai entrepris d'analyser l'espace de recherche pour factorielle dans EPE.

Topologie de l'espace de recherche
Pour analyser l'espace de recherche, j'ai procédé à une exploration systématique des organisations possibles pour les 10 agents nécessaires à factorielle dans EPE. Cet espace, d'une taille totale de 1012, peut-être catégorisé en sous-ensembles d'organisations imbriquées (cf.  REF _Ref68762642 \h Figure 22) avec des proportions spécifiques :
Organisations complètes théoriques : H" 60.109
Organisations complètes réelles : H"120.106
Organisations calculantes : H"9.106
Organisations fonctionnelles : 3.10
Organisations fonctionnelles adéquates (pour la factorielle) : 96
Seule une organisation sur 300.000 environ est une organisation dont les agents ont satisfait leurs propres buts et capable de produire une valeur vers l'environnement. Les agents dans EPE arrivent très efficacement à produire ce genre d'organisation. Mais que faut-il leur rajouter pour qu'ils se dirigent vers l'une des 96 organisations capables de produire la factorielle ?

Correspondance des proximités
Pour trouver le ou les paramètres capables de guider localement les agents au sein du système, de leur donner une "tendance", une "direction", un attracteur, j'ai alors entrepris d'étudier, d'une part, la proximité organisationnelle des différentes organisations fonctionnelles avec l'organisation produisant factorielle, et d'autre part, la proximité fonctionnelle de ces organisations avec la fonction factorielle. Cela signifie, pour une organisation, étudier le nombre de liens communs avec l'organisation souhaitée et la distance de la valeur produite à la valeur souhaitée, ceci afin d'établir l'existence d'une corrélation.
Cette corrélation, visible sur la  REF _Ref68876854 \h Figure 27, qui indique qu'une organisation produisant une valeur proche de factorielle est également proche en nombre de liens communs avec la bonne organisation, est un résultat encourageant pour développer une nouvelle stratégie d'auto-organisation.

Nouvelle stratégie : par accaparement de but "plus grand / plus petit"
La nouvelle stratégie repose sur l'idée de transmettre au système un feedback plus informé indiquant à l'AgentOut si la valeur fournie est trop grande ou trop petite. Ensuite, chaque agent va s'accaparer le but fourni et essayer, coopérativement, en changeant de partenaire, de fournir une nouvelle valeur plus grande ou plus petite. Ce changement doit être coopératif dans le sens où il ne doit pénaliser d'autres agents que si cela est acceptable pour ces agents (ils l'admettent éventuellement pour le gain du collectif).
Cette idée repose cependant sur deux conditions importantes. Tout d'abord, les agents doivent arriver, en essayant localement de satisfaire le nouveau but, à produire collectivement une organisation qui effectivement produira une valeur plus grande ou plus petite. La réponse, conforme à la théorie AMAS, est bien sûr de mettre en place efficacement la coopération lors des réorganisations. Ensuite, si la nouvelle organisation produit une valeur plus grande ou plus petite, en fonction du feedback, et si l'on réitère ce processus autant que nécessaire, ces réorganisations successives doivent tendre vers l'organisation adéquate.
Or l'étude statistique a montré une tendance à la corrélation entre la proximité fonctionnelle et la proximité organisationnelle. Il apparaît donc pertinent d'explorer une telle voie. La partie  REF _Ref68336949 \r \h 4 décrit cette démarche et présente les résultats obtenus.


Comportements d'auto-organisation coopératifs informés dans un système élémentaire
Malgré la résorption très efficace des SNC endogènes avec la première stratégie d'auto-organisation dans l'exemple de la factorielle, l'adéquation fonctionnelle n'est pas atteinte. Cette stratégie basée sur un feedback de type "bon / mauvais" et une gestion de taux de confiance s'est révélée en pratique équivalente à un parcours "aveugle", principalement par manque d'information. Je présente dans cette partie mes travaux autour d'une deuxième stratégie plus informée.
Cette deuxième stratégie repose sur les résultats obtenus lors de l'analyse statistique de l'espace de recherche de factorielle et sur la corrélation entre la proximité fonctionnelle et la proximité organisationnelle. Obtenir l'adéquation fonctionnelle pour un système signifie que l'organisation finale est une organisation capable de produire le bon résultat. La question principale est de savoir comment permettre aux agents d'atteindre cette organisation et pour cela d'avoir une "direction" (sur critère local) pour leur permettre de s'en rapprocher. Ils ont donc besoin d'une information locale qui leur permette de juger de cette proximité. Le jugement de confiance de la première stratégie se voulait être une telle information mais s'est avérée inefficace. L'information utilisée ici sera un feedback de type "plus grand / plus petit" de l'environnement qui sera distribué aux agents par propagation et accaparement de but. L'agent essaye alors de satisfaire ce nouveau but tout en restant le plus coopératif possible avec les autres agents, ce qui doit amener le système dans sa globalité à produire une valeur plus grande ou plus petite. Si le système produit une valeur plus proche il a alors statistiquement plus de chances d'être proche de l'organisation adéquate.
Une des difficultés majeures lors du travail sur la factorielle a été la complexité surprenante des organisations malgré un nombre d'agents réduit. Ceci a entraîné des difficultés pour observer le comportement du système et plus précisément pour comprendre les relations entre les comportements individuels et ceux du collectif. Le travail d'implémentation a été particulièrement ardu par la difficulté à analyser les conséquences sur le collectif du moindre changement au sein de l'agent. C'est pourquoi, pour développer la stratégie informée, nous avons choisi d'expérimenter sur une réduction supplémentaire du problème que nous avons appelé un système élémentaire.

Utilité d'un système élémentaire
Bien que l'exemple de la factorielle ait été choisi dans l'optique d'avoir un système suffisamment simple pour être manipulé aisément, le choix des 10 agents pour traiter la factorielle dans EPE a conduit à un espace de recherche de 1012 organisations possibles. Ceci a eu principalement deux conséquences : d'une part, une difficulté à observer les changements au sein du système, et d'autre part, une difficulté à comprendre les rapports entre comportements individuels et comportements du collectif.

Difficulté d'observation
Il est courant lors du développement de SMA de se doter d'outils d'observation afin d'évaluer le comportement des systèmes en devenir. De même pour EPE, dès le départ le besoin de tels outils a été pris en compte. Ainsi, l'interface graphique d'EPE permet de visualiser dans la fenêtre principale les agents et les liens de partenariat au cours de leurs évolutions. Une fenêtre secondaire présente une vue simplifiée dans laquelle les agents se placent dynamiquement en fonction des changements de liens afin de donner à l'observateur une meilleure idée du flux de données échangées. Et pour chaque agent, l'observateur a accès à un "log" (journal de bord) de son comportement : une description formatée en couleur qui décrit explicitement, en fonction de la précision souhaitée, chacune des actions de l'agent, ses observations, ses états et ses accointances.
Cette fenêtre de log a été la source principale d'information pour observer le comportement du système en détail, i.e. agent par agent, et donne des informations très précises et utiles sur les interactions entre les agents. Le problème vient du fait que pour un agent donné, la multitude d'interactions avec les différents autres agents peut produire des logs de plusieurs centaines de milliers de lignes en quelques secondes. Les informations pertinentes à un comportement donné sont donc complètement noyées dans la masse d'informations disponibles et de ce fait, il est extrêmement long d'accéder à la donnée voulue.

Difficulté de compréhension
La trop grande quantité d'informations disponibles induit une compréhension délicate de la dynamique du système. Faire le lien entre les comportements de différents agents, et avec le comportement du collectif, à un moment donné, devient une tâche extrêmement ardue. Or cette compréhension est très importante pour deux aspects de l'expérimentation. D'une part, pour implémenter correctement un comportement spécifié préalablement, il faut pouvoir vérifier que le comportement résultant de l'implémentation corresponde exactement à celui décrit dans la spécification, et apporter les corrections certainement nécessaires. D'autre part, la spécification théorique elle-même nécessite un retour du fonctionnement réel pour pouvoir s'ajuster, clarifier les omissions et corriger les erreurs ou effets de bords.
Mais la raison principale de la difficulté à comprendre en détail le fonctionnement du système se trouve dans la nature émergente du comportement global. Le comportement observé est en effet le résultat d'un grand nombre d'interactions locales s'appuyant sur des critères locaux eux aussi, sans aucun contrôle global dictant explicitement le comportement aux agents. La compréhension ne peut venir que d'une mise en corrélation des interactions locales, analysées en détail, avec les résultats collectifs. Or déjà sur l'exemple de la factorielle, la complexité de ces interactions est telle que cette analyse détaillée semble hors de portée.

Le traçage "pas à pas"
Pour pouvoir analyser finement les interactions et ce qu'elles produisent, il faut pouvoir suivre pas à pas les évolutions du système, et ainsi mettre en relation chaque action et influence avec la dynamique observée. Ce traçage est techniquement possible avec l'exemple de la factorielle mais la taille, en nombre d'actions élémentaires, d'une simulation quelconque le rend irréaliste en pratique. Le choix d'un exemple plus simple que factorielle permettrait alors, par un nombre limité d'interactions, de considérer pleinement un ensemble complet d'interactions données pour en analyser les mécanismes et les résultats.
EPE a donc été modifié pour permettre d'envoyer les feedbacks de l'environnement un à un, à la discrétion de l'utilisateur, et de mettre les agents en pause le temps d'analyser les évolutions notables.

Description du système élémentaire choisi
Nous avons essayé de trouver un système de programmation émergente le plus simple possible (i.e. avec le moins d'agents possible et avec des agents simples dans leur fonction), nécessitant cependant des réorganisations afin de produire la fonction souhaitée. Par exemple, un système ne contenant que deux AgentOne et un AgentAddition ne produit qu'une seule fonction possible : 1 + 1. De même, comme les agents auront à comparer les nombres produits et reçus, pour simplifier la tâche à l'observateur et aux agents, les nombres traités doivent être suffisamment différents pour ne pas créer des ambiguïtés (comme par exemple traiter les nombres 1, 1 et 2 : 2 est la somme de 1 et 1 et le choix entre les deux valeurs 1 est indifférent).

Les agents
Le système élémentaire choisi est constitué de 6 agents : trois agents "constante", un agent addition, un agent multiplication et une version simplifiée de l'agent de sortie. Les agents "constante" sont une version généralisée de l'AgentOne pouvant fournir n'importe quelle valeur fixée à leur création. Le système en contient trois avec des valeurs suffisamment différentes pour éviter une quelconque ambiguïté : AgentConstantA (valeur 2), AgentContantB (valeur 10) et AgentConstantC (valeur 100). Combinés avec l'AgentAddition et l'AgentMultiplication, les valeurs produites sont des résultats d'organisations du genre (A + B) * C ou toute autre combinaison possible.
L'agent de sortie qui sera chargé de fournir la valeur produite à l'environnement est une version simplifiée de l'AgentOut car il ne nécessite pas d'entrée de contrôle : dès que les agents ont effectué leurs calculs, la valeur est immédiatement fournie à l'environnement. Cet agent, appelé de façon originale AgentOutWithoutControl dans EPE, transmet simplement la valeur qu'on lui fournit à l'environnement. Mais il sert aussi à récupérer le feedback de l'environnement. Pour simplifier dans la suite, je l'appellerai AgentOut.

Les organisations possibles
L'espace de recherche total (cf. partie  REF _Ref69028896 \r \h 3.2.2.1 pour les détails de calculs pour les organisations dans EPE) est ici de 65 soit 7.776 organisations possibles théoriquement, en comptant toutes les organisations incomplètes. Le nombre est donc très réduit comparé à factorielle. Le nombre d'organisations complètes est de 120 et parmi celles là, seules 24 sont fonctionnelles, si l'on compte toutes les permutations possibles sur les entrées qui ne changent pas les résultats. Au final, nous avons 6 types d'organisations différents (cf.  REF _Ref69029606 \h Figure 28) produisant les 6 valeurs suivantes : 120, 210, 220, 1002, 1020 et 1200. A l'image de factorielle, nous allons par exemple demander au système de produire la valeur 1200.

Description de la stratégie d'auto-organisation informée
Maintenant que le contexte de l'expérimentation de la deuxième stratégie d'auto-organisation a été posé, les mécanismes coopératifs, constituant le comportement des agents, vont être détaillés. Comme pour la factorielle, les SNC et leurs traitements en constituent la majeure partie et les autres mécanismes découlent directement de ces SNC. Je vais donc procéder en expliquant comment les agents détectent les nouvelles SNC, les traitements associés, et les mécanismes et messages supplémentaires nécessaires à ce traitement.
Les nouvelles SNC liées au feedback
Le premier changement fondamental porte sur le feedback de l'environnement et donc sur la SNC détectée par l'environnement ainsi que sur le message envoyé à l'AgentOut. En conséquence directe, l'AgentOut aura également une nouvelle SNC qui sera la traduction de celle reçue par l'environnement et qui représente la propagation du conflit avec l'environnement au sein du système. L'ancienne NCSInadequateData et sa forme transmise NCSInadequateDataMessage sont remplacées. Les nouvelles SNC sont les suivantes :
NCSInformedInadequateData : l'environnement reçoit une valeur de l'AgentOut qui ne correspond pas à la valeur attendue. L'environnement porte alors un jugement sur cette valeur et indique par une NCSInformedInadequateDataMessage s'il attendait une valeur plus grande ou plus petite. Cette information est intégrée au message.
NCSInformedInadequateDataMessage : la version propagée à l'AgentOut de la SNC précédente. L'AgentOut reçoit cette SNC de l'environnement et en extirpe l'information qui lui indique s'il doit produire une valeur plus grande ou plus petite.
NCSInformedNeedIn : lorsqu'un agent reçoit la SNC précédente qui lui indique en substance qu'il doit arriver à produire une valeur différente, comme sa fonction elle-même ne peut pas changer, ce sont ses entrées qui doivent fournir des valeurs différentes (plus grandes ou plus petites). Il génère donc une NCSInformedNeedIn qui indique que ses anciennes entrées ne lui conviennent plus et qu'il a besoin de recevoir des valeurs plus grandes ou plus petites.
NCSInformedNeedInMessage : la SNC effectivement propagée aux accointances lorsqu'un agent détecte une NCSInformedNeedIn.

Les traitements coopératifs associés
L'environnement envoie simplement sa SNC à l'AgentOut qui est donc le premier agent à avoir réellement à traiter la nouvelle SNC :
NCSInformedInadequateDataMessage : pour que cette SNC se résorbe, deux évolutions de l'organisation sont possibles du point de vue de l'AgentOut. Soit son partenaire actuel arrive à produire une meilleure valeur, soit l'AgentOut trouve un nouveau partenaire lui proposant une meilleure valeur. Comme les deux solutions lui conviennent, l'agent va émettre une NCSInformedNeedInMessage vers son partenaire pour lui signifier qu'il doit essayer, pour être coopératif, de produire une meilleure valeur, et choisir un certain nombre d'accointances (cf. stratégies pour la factorielle) vers lesquelles lancer un appel similaire pour essayer de trouver un meilleur partenaire dans l'éventualité où son propre partenaire n'arriverait pas à le satisfaire. Ce message sera également propagé pour permettre d'atteindre des agents plus éloignés.
L'agent possède alors un nouveau but à atteindre : produire une meilleure valeur que l'ancienne valeur qu'il a produite. Pour cela il se fixe cette ancienne valeur comme étant le seuil qu'il doit dépasser (dans un sens ou dans l'autre en fonction du message reçu) pour atteindre ce but.
Un cas important à envisager est celui où ni son partenaire, ni aucun des agents recevant son appel ne peuvent fournir de meilleure valeur. Soit le système n'a pas le potentiel pour produire de meilleures valeurs et dans ce cas, l'adéquation fonctionnelle est de toute façon impossible, soit les agents pourraient fournir des valeurs plus élevées mais dans une configuration radicalement différente. Pour traiter ce cas, l'agent utilise le choix du BestOfWorse (cf.  REF _Ref69045483 \r \h 4.3.3.10).

Les autres agents du système sont confrontés au feedback indirectement par les NCSInformedNeedInMessage :
NCSInformedNeedInMessage : quand un agent reçoit cette SNC, il y a deux possibilités. Premier cas : l'agent reçoit ce message de son partenaire de sortie. Il se trouve alors exactement dans le même cas que l'AgentOut dans la SNC précédente et son traitement est identique. Son partenaire de sortie joue en quelque sorte pour lui le rôle de l'environnement pour l'AgentOut. Il déduit en fait de ce message que son partenaire nécessite une meilleure valeur et donc qu'il doit, pour être coopératif, essayer de produire une meilleure valeur. Et comme pour l'AgentOut, soit ses partenaires arrivent à lui fournir une meilleure valeur, soit il trouve de meilleurs partenaires. Le feedback de l'environnement est ainsi propagé le long de l'organisation qui a produit la valeur précédemment fournie à l'environnement.
Deuxième cas : l'agent reçoit ce message d'un agent quelconque. Si la valeur que l'agent est capable de produire dans sa configuration actuelle satisfait les critères, il peut alors permettre à l'émetteur de résorber sa SNC. Sinon, même s'il ne la résorbe pas directement, il peut être un partenaire utile pour le cas nécessitant le choix d'un BestOfWorse. Dans tous les cas, l'agent répond donc en indiquant la valeur qu'il est capable de produire (cf. Valeur potentielle,  REF _Ref69037841 \r \h 4.3.3.1).
Finalement, l'agent propage de toute façon l'appel reçu pour permettre d'atteindre des agents plus éloignés que l'émetteur ne connaît peut-être pas.

Je vais détailler ces comportements dans la suite et préciser les mécanismes supplémentaires nécessaires, mais l'on peut d'ores et déjà interpréter ces comportements comme une propagation de but où chaque agent, de par sa nature coopérative, s'accapare ce but. On peut noter que les agents peuvent transformer ce but si nécessaire. Par exemple, un agent "soustraction" (calculant IN1 – IN2), pour produire une valeur plus grande, a le choix entre augmenter sa première entrée ou diminuer sa seconde. Il propage donc deux buts différents à ses accointances. Ensuite, on peut considérer que l'agent fait un appel à partenaires pour trouver des partenaires pertinents lui permettant de résorber sa SNC. Cette pertinence est un point clé de la stratégie.

Détails et mécanismes coopératifs supplémentaires
La propagation du but le long de l'organisation a un cas d'arrêt notable : les AgentConstantX. Dans le cas général, l'AgentIn est dans le même cas. Pour ces agents, il n'y a pas de possibilité de résorption de la SNC car ils ne peuvent pas changer la valeur qu'ils produisent. C'est donc à leurs partenaires de sortie de trouver d'autres partenaires plus pertinents. Eux-mêmes tâcheront d'être utiles à d'autres agents du système nécessitant une valeur différente.
La valeur potentielle de sortie
Pour pouvoir répondre aux appels des autres agents, chaque agent possède un paramètre appelé potentialOutputValue qui est la valeur de sortie qu'il est potentiellement capable de fournir. Dans le cas des AgentConstantX, cette valeur est simplement la constante qu'ils peuvent produire à la demande. Mais pour les autres agents, la valeur qu'ils peuvent produire dépend de leurs partenaires d'entrée. Cette valeur est donc conditionnée par la configuration actuelle de l'agent et par tout l'"arbre" de calcul relié à ses entrées (toute l'organisation qui conduit à produire les valeurs que l'agent reçoit, ou "organisation d'entrée").
Quand un agent vient d'effectuer un calcul, sa valeur potentielle est la valeur réelle qu'il est capable de produire, mais lors d'une phase de réorganisation, l'agent n'est pas sûr de pouvoir produire cette valeur car l'organisation connectée en entrée est peut-être en train de changer. Pour refléter ces changements, les agents vont mettre à jour leurs valeurs potentielles au travers d'un message d'information :
PotentialOutputMessage : lorsqu'un agent change de partenaire, la valeur potentielle qu'il produisait précédemment change elle aussi. Comme son nouveau partenaire lui indique sa propre valeur potentielle, l'agent est capable de calculer sa nouvelle valeur potentielle et il la transmet à ses partenaires de sorties au travers d'un PotentialOutputMessage. On peut noter que cette transmission d'une nouvelle information est dictée par son attitude coopérative : ne pas transmettre cette information conduirait ses partenaires de sortie à croire qu'ils recevront l'ancienne valeur potentielle et donc à se tromper lorsqu'ils répondent à des appels de type NeedIn. Ceci serait bien sûr une SNC.

Un cas extrême apparaît si un agent dans l'organisation d'entrée perd un de ses partenaires : dans ce cas, cette partie de l'organisation n'est plus fonctionnelle, i.e. elle n'est plus capable de fournir une valeur. Ce cas est une SNC à part entière :
NCSNoPotentialOutputValue : lorsqu'un agent perd un de ses partenaires d'entrée, il n'est plus capable de fournir une valeur à ses partenaires de sortie, jusqu'à ce qu'il retrouve un partenaire et que ce partenaire soit capable de fournir une valeur. Lorsque cette situation apparaît, l'agent prévient ses partenaires de sortie avec un NCSNoPotentialOutputValueMessage afin que ceux-ci ne répondent pas de façon erronée à des appels à partenaires. L'agent change également son état pour noter qu'il ne possède plus de valeur potentielle et qu'il ne peut donc pas répondre à des appels.
NCSNoPotentialOutputValueMessage : un agent reçoit ce message lorsqu'un des agents de son organisation d'entrée ne peut fournir de valeur, ce qui signifie que lui-même ne peut recevoir de valeur et donc produire de valeur. L'agent change son état pour noter qu'il ne possède plus de valeur potentielle et transmet cette SNC à ses sorties.

Il va sans dire que la priorité absolue pour un agent sans entrée est de trouver un nouveau partenaire pour pouvoir être à nouveau utile à l'organisation. Mais son choix reste éventuellement conditionné par le seuil qu'il s'est fixé s'il a reçu une NCSInformedNeedIn d'un de ses partenaires de sortie.
GoalReachedMessage
Si un quelconque agent au sein de l'organisation atteint son but sans pour autant pénaliser d'autres agents ou détruire une autre partie de l'organisation, cela signifie qu'il est arrivé à produire une valeur meilleure que celle qu'il produisait précédemment. Le fait de produire une meilleure valeur se propage alors le long de l'organisation jusqu'à l'AgentOut qui lui aussi arrivera à produire une meilleure valeur et se rapprochera alors de la valeur attendue par l'environnement. Ceci ce fait au travers du message suivant :
GoalReachedMessage : l'agent indique à ses partenaires de sortie qu'il est capable de produire une meilleure valeur et donc de les satisfaire (ce qui résorbe sa propre SNC et celle de ses partenaires de sortie). Si un agent possède plusieurs entrées, il leur a envoyé précédemment une NCSInformedNeedIn. Or s'il a réussi à satisfaire son but en trouvant un nouveau partenaire produisant une meilleure valeur, il n'est plus nécessaire à ses autres entrées de produire de meilleures valeurs. L'agent envoie donc aussi cette information à ses entrées encore en SNC pour éviter une réorganisation inutile pouvant par ailleurs venir perturber sa propre situation.
Lorsqu'un agent reçoit ce message en entrée, il considère alors son but atteint et il effectue exactement le même traitement que précédemment. Si l'agent reçoit ce message d'une de ses sorties, il considère alors sa situation comme étant à nouveau coopérative (il n'est plus en SNC car la valeur qu'il fournit est à nouveau suffisante). Et comme pour le cas précédent, il propage ce message à ses propres entrées pour leurs éviter de se réorganiser.
Réponses à une NCSInformedNeedIn
Lorsqu'un agent émet une NCSInformedNeedIn, il peut recevoir différentes réponses :
Proposition positive : l'agent reçoit une proposition de partenariat d'un agent ayant reçu sa SNC et lui indiquant qu'il est pertinent, i.e. qu'il est capable de fournir une valeur potentielle répondant aux critères de l'agent. Dans ce cas, l'agent peut immédiatement engager des négociations pour créer ce partenariat car il aura alors atteint son but.
Proposition négative : l'agent reçoit une proposition qui ne satisfait pas son but mais qui peut être une alternative si aucune autre proposition ne lui est transmise et qu'il n'arrive pas à atteindre son but. Ce choix qui est celui du BestOfWorse décrit plus bas. En vu de l'éventualité de ce choix, l'agent stocke ces propositions.
GoalReachedMessage : l'agent reçoit un message lui indiquant que l'organisation d'entrée a réussi à produire une meilleure valeur et l'agent lui-même est alors capable de produire une meilleure valeur. Dans ce cas, l'agent a résorbé sa SNC.
Le cas de la NCSNeedOut
Dans les faits, les agents trouvent la plupart du temps très facilement un agent capable de produire une meilleure valeur. Par exemple, pour obtenir une valeur plus grande, l'AgentConstantC qui fournit la valeur 100 est pertinent la plupart du temps. De même pour l'AgentConstantA qui produit 2 quand il s'agit de trouver un partenaire plus petit. Comme les agents sont capables de fournir leurs valeurs à plusieurs partenaires à la fois, on observe une situation où la plupart des entrées se lient à un seul agent, laissant les autres en situation de NCSNeedOut. C'est dans cette situation qu'intervient la deuxième partie du traitement coopératif qui permet au système de fournir effectivement de meilleures valeurs sans léser des agents.
NCSNeedOut : l'agent ne possède plus de partenaire de sortie. Il envoie alors un NCSNeedOutMessage à un certain nombre de ses accointances pour essayer de retrouver un partenaire. Ceci est identique au traitement effectué pour factorielle, mais à la réception de propositions, l'agent doit appliquer un traitement particulier pour choisir coopérativement un agent comme partenaire. En effet, contrairement à la situation dans la première stratégie où les agents affaiblissaient leurs liens et finissaient par rompre et donc se proposer librement comme partenaires, ici, les agents se proposent avec des informations sur leurs états et l'agent choisit alors quel partenariat rompre. Pour pouvoir répondre, les agents nécessitent une information sur la valeur que l'agent émetteur se propose de fournir et l'agent intègre donc lors d'un envoi de NCSNeedOutMessage, sa valeur potentielle.
Ce choix est très important car à ce moment de la réorganisation, les autres agents auront probablement déjà un partenaire qui éventuellement leur permet de satisfaire leur but. L'agent doit procéder avec prudence lorsqu'il va avoir éventuellement à détruire un partenariat coopératif déjà établi pour que l'ensemble de l'organisation en profite néanmoins autant que possible pour espérer produire une meilleure valeur. Ce comportement de l'agent est décrit en  REF _Ref69046157 \r \h 4.3.3.9.
NCSNeedOutMessage : l'agent reçoit un appel d'un autre agent qui lui indique qu'il n'a plus de partenaire en sortie. Si l'agent ne possède pas lui-même de partenaire d'entrée, il répond favorablement. Si l'agent a déjà un partenaire, pour être coopératif, il se doit de répondre car il est peut-être le seul ou le meilleur choix possible pour l'émetteur. Il répond donc en fournissant des détails sur sa situation : le préjudice de valeur, le préjudice indirect de situation, le fait d'avoir atteint son but ou pas, le fait de risquer de retomber dans la situation initiale ou pas.

Ces informations sont détaillées dans les points suivants. Le point  REF _Ref69046157 \r \h 4.3.3.9, en particulier, détaille l'algorithme de choix du partenaire en considération des informations fournies par les agents dans leurs propositions de partenariat.
Le calcul du préjudice de valeur
Lorsqu'un agent reçoit une NCSInformedNeedIn d'un de ses partenaires de sortie, il s'accapare une partie de cette SNC en prenant pour but de produire une meilleure valeur que l'ancienne valeur qu'il produisait. Il fixe alors ses anciennes valeurs d'entrée comme étant les seuils qu'il devra essayer de dépasser en cherchant de nouveaux partenaires ou en recevant de meilleures valeurs de ses entrées. S'il arrive à trouver une meilleure valeur pour une de ses entrées, il est alors à nouveau coopératif avec ses sorties. Par contre, s'il se retrouve avec un partenaire lui fournissant une valeur moins bonne que son seuil, il est considéré comme étant en préjudice de valeur : il est encore moins coopératif que dans la situation précédente.
De plus, et c'est un paramètre très important, il va propager ce préjudice aux agents auxquels il fournit sa nouvelle valeur et cette valeur dépend de sa propre fonction. Le préjudice de l'agent n'est donc pas seulement lié à la nouvelle valeur d'entrée, mais aussi à la fonction que calcule l'agent. Par exemple, un changement de 1 pour une AgentAddition produit un changement de 1 en sortie, mais pour l'AgentMultiplication, ce changement produit une différence de 1 fois la valeur de sa deuxième entrée. Si cette valeur est élevée, le préjudice subi par ses partenaires de sortie sera d'autant plus grave. Le préjudice chiffre est en fait ce qu'une partie de l'organisation va subir comme changements négatifs.
Lorsqu'un agent reçoit un appel de type NCSNeedOut, il indique dans sa réponse si une de ses entrées est libre, si la valeur proposée par l'agent émetteur ne le pénalise pas (identique au seuil ou satisfait aussi son propre but : noté 0-prejudice), ou si la valeur proposée le place en préjudice. Dans ce dernier cas, il chiffre le préjudice d'après un calcul basé sur la valeur proposée, son seuil et sa fonction.
Le préjudice indirect de situation
Le second paramètre qu'un agent indique dans sa proposition renseigne sur ses relations de partenariat avec les autres agents. En effet, si l'agent est choisi par l'émetteur comme partenaire, et comme il ne peut avoir qu'un seul partenaire par entrée, l'agent rompt le lien qui l'unissait avec son ancien partenaire. Or si l'agent était le seul partenaire de sortie de l'agent avec qui il rompt, cet agent sera en NCSNeedOut. Ceci conduira alors cet agent à chercher un nouveau partenaire et ainsi continuer à perturber l'organisation.
Par contre si son partenaire possédait d'autres partenaires de sorties, la rupture du lien ne le conduira pas en SNC. Le choix de l'agent émetteur sera donc moins pénalisant pour l'organisation. La prise en compte de la distinction entre ces deux cas est une modification de la gestion des "sorties multiples" de la stratégie testée avec factorielle. L'agent indique donc dans sa proposition si le lien qui sera éventuellement rompu est un lien dit multiple ou unique.
On peut noter qu'il peut être nécessaire dans certains cas de rompre un lien même s'il est le seul lien pour le partenaire, à partir du moment où l'agent émetteur de la NCSNeedOut a pu juger des conséquences de ses actions pour l'organisation afin d'être coopératif. En général, un agent est amené à rompre un lien unique s'il n'a pas pu trouver d'autres partenaires imposant un moindre préjudice à l'organisation. Dans ce cas l'agent justifie son action par le fait que l'autre agent à se retrouver en SNC aura, de son point de vue local et autant qu'il puisse en juger, plus de chances de trouver un partenaire acceptable que lui.
La gestion de la multiplicité des liens
Pour pouvoir répondre à une NCSNeedOut, un agent doit pouvoir indiquer, dans le cas où il possède déjà des partenaires d'entrée, si les liens vers ses partenaires qui pourraient être rompus sont de nature multiple ou unique (cf.  REF _Ref69112991 \h Figure 29). Comme cette nature dépend de la situation de ses partenaires (s'ils ont ou non plusieurs partenaires de sortie), c'est à eux d'indiquer à l'agent la nature de ses liens d'entrée. Chaque agent a ainsi un indicateur de la nature multiple ou unique de ses liens d'entrée mis à jour par ses partenaires. Lui-même indique à ses partenaires de sortie les évolutions éventuelles de la nature de ses liens de sortie. Ceci est effectué par le message suivant :
LinkMultiplicityChangedMessage : ce message indique à l'agent récepteur que l'agent émetteur (qui est un de ses partenaires d'entrée) a changé de situation quant à ses sorties (unique ou multiple). Il met alors à jour l'état du lien d'entrée correspondant. De la même façon, s'il acquiert un partenaire en sortie alors qu'il en possédait déjà un, il indique à ses sorties par ce message qu'elles deviennent multiples, et s'il perd un partenaire en sortie et qu'il n'en possède plus qu'un, il lui indique qu'il devient unique.

Assurer la nouveauté autant que possible
L'information sur le préjudice de valeur ne suffit pas pour un cas spécifique : le retour à la configuration initiale. Lorsqu'un agent reçoit une réponse à une NCSNeedOut lui indiquant un cas de 0-prejudice, cela signifie que l'établissement de ce lien ne produira pas une valeur pire que ce que le lien initial (lors de la réception d'une NCSInformedNeedIn) permettait de produire. L'agent en NCSNeedOut n'imposera donc pas de préjudice à l'agent répondant à l'appel. Mais si ces deux agents étaient initialement connectés (i.e. lors de l'établissement des seuils et des buts), leurs positions relatives n'auront pas changé. Si tous les agents adoptent le même comportement, ils risquent de reproduire rapidement exactement la même configuration que lorsque le feedback s'est propagé. Or cette configuration a déjà été jugée inadéquate.
Par contre, si d'autres agents sont dans des positions différentes, le retour dans une configuration initiale pour deux agents ne présente aucun problème, à partir du moment où ailleurs dans l'organisation le but a été atteint. L'agent en NCSNeedOut doit donc intégrer cette information lors du choix d'un partenaire. Lorsqu'un agent fixe ses seuils d'entrée, il mémorise également quels agents ont été à l'origine de ces seuils. En cas de réception de NCSNeedOut, l'agent prévient si l'émetteur est un des agents de seuil.
L'algorithme de traitement coopératif du préjudice imposé
Avec les paramètres fournis par les agents répondant à la NCSNeedOut, l'agent à l'origine de l'appel est alors en mesure, après réception d'un certain nombre de propositions, de choisir celui qui entraînera le moindre préjudice pour l'organisation. L'algorithme se base simplement sur un ordre de priorité de cas en fonction des propositions en sa possession (priorité-0 étant le cas le plus prioritaire car le plus coopératif pour l'organisation) :
Priorité-0 : NCSNeedIn. Une des propositions est également en SNC et nécessite un agent pour une de ses entrées. Le choix de cet agent résorbe les SNC des deux agents et constitue le choix le plus intéressant pour l'organisation.
Priorité-1 : lien multiple et 0-prejudice. Le choix d'une des propositions ne ferait pas subir à l'agent proposant de préjudice de valeur (car la valeur fournie est égale ou supérieure au seuil) et le lien rompu ne plonge pas le partenaire actuel du proposant dans une SNC (car il possède au moins un autre partenaire de sortie).
Exception priorité-1 : agent de seuil et GoalReached. Il y a une exception pour le cas précédent quand l'agent en question est le partenaire initial et que celui-ci a atteint son but. Revenir à l'état initial et donc détruire l'atteinte de but du proposant est non coopératif s'il y a une autre solution. L'agent va donc chercher s'il existe une proposition en priorité-2.
Priorité-2 : lien multiple et plus petit préjudice. Une des propositions est en situation de lien multiple et bien qu'elle doive subir un préjudice car il n'y a pas d'autre possibilité plus prioritaire, elle subira le préjudice le moins important.
Exception priorité-2 : GoalReached. Si l'agent subissant le moindre préjudice est en situation où il a réussi à atteindre son but, lui faire subir un préjudice entraîne également pour la partie de l'organisation qui lui est connectée de reconsidérer leurs états d'atteinte de but, ce qui est fortement préjudiciable pour l'organisation. S'il existe une proposition qui, bien qu'elle ait un préjudice supérieur, n'a pas atteint son but, ce choix est préférable.
Priorité-3 : lien unique et 0-prejudice. Bien que l'agent se proposant ne subisse pas de préjudice, son choix induirait une SNC pour son partenaire actuel qui risquerait alors de perturber ensuite l'organisation établie.
Priorité-4 : lien unique et plus petit préjudice. Les seuls agents ayant répondu ont des liens uniques et subiraient des préjudices, mais comme l'agent ne peut tolérer de rester en SNC, il va s'imposer à celui auquel il fait subir le moindre préjudice en espérant que son partenaire actuel dont le lien sera rompu ait plus de possibilités afin de trouver un nouveau partenaire que lui. De plus, l'agent adoptera le but alors insatisfait de l'agent choisi afin d'essayer de résorber le préjudice imposé.

L'algorithme se base entièrement sur la notion de coopération bien que dans plusieurs cas l'agent va faire subir à un autre agent une situation qui ne lui est pas profitable. Il faut remarquer que la notion de coopération est très différente de celle d'altruisme. L'agent en NCSNeedOut ne va pas se sacrifier pour permettre aux autres agents de rester dans des situations égoïstement confortables. L'agent considère en fait que, de son point de vue local, son choix est nécessaire. D'ailleurs, les autres agents sont bien coopératifs en se proposant malgré le préjudice et, en acceptant le partenariat le cas échéant, ils considèrent qu'il est nécessaire pour l'organisation dans son ensemble.
Ainsi, la coopération ne passe pas seulement par la recherche d'un meilleur partenaire pour satisfaire son but, mais aussi par un traitement coopératif des contraintes liées au fait que tous les agents ne peuvent améliorer leur situation en même temps. Pour que le collectif soit plus coopératif avec son environnement, certains agents doivent subir des préjudices. Toute la coopération tient dans le fait de minimiser ce préjudice.
BestOfWorse
Il reste un cas supplémentaire important lorsqu'un agent a lancé une NCSInformedNeedIn : le cas où aucun agent ne peut fournir de valeur supérieure au seuil de l'agent émetteur. Ceci est par exemple le cas de la configuration 3 de la  REF _Ref69029606 \h Figure 28 pour un feedback demandant une valeur plus grande : l'AgentOut ne peut trouver de partenaires fournissant de valeur supérieure à son seuil actuel et les autres agents finissent pas revenir dans leur position initiale par manque de possibilités. Ceci constitue en fait un classique cas de maximum/minimum local.
Cette situation est détectée lorsque l'agent, au bout d'un certain temps, n'a toujours pas reçu de meilleures propositions et ses propres fournisseurs n'ont pas, eux non plus, réussi à produire une meilleure valeur. Dans ce cas, l'agent va chercher dans la liste des propositions qu'il a reçues, celle qui propose la meilleure valeur (bien que cette valeur soit inférieure aux seuils de l'agent). Ce choix du BestOfWorse correspond alors à miser sur un partenaire qui bien que ne répondant pas aux critères dans sa situation actuelle, semble posséder le meilleur potentiel, la meilleure capacité à produire de meilleurs nombres. En le choisissant et en lui propageant son but, l'agent espère ensuite arriver à obtenir une meilleure valeur. Pour l'exemple minimaliste, dans la situation 3, cela correspond au choix de l'AgentOut d'un partenariat avec l'AgentMultiplication, ce qui permet au système d'atteindre une des configurations 4, 5 ou 6.
Notons d'ailleurs que le choix de l'AgentMultiplication pour produire une valeur plus élevée à partir de la situation 3 est effectivement judicieux car il permet d'atteindre des valeurs plus élevées. Ceci est dû à la nature relative du multiplié et de l'addition : la multiplication en bout de chaîne de calcul permet de produire des valeurs encore plus grandes car multiplier de grandes valeurs produit plus rapidement ces valeurs encore plus grandes que de les additionner, même s'il y avait une multiplication avant (mais donc sur des valeurs plus petites).

Résultats expérimentaux
Le comportement d'auto-organisation coopérative des agents dans EPE a été modifié pour prendre en compte la nouvelle stratégie et des simulations ont été réalisées. A l'image de factorielle pour laquelle les agents n'arrivaient pas à produire une organisation capable de fournir des nombres suffisamment élevés, j'ai demandé au système élémentaire de produire la valeur la plus élevée (configuration 6 , cf.  REF _Ref69029606 \h Figure 28).

Adéquation fonctionnelle
Sur plusieurs centaines de simulations, l'adéquation fonctionnelle a été atteinte en un nombre limité de changements d'organisations. Pour rappel, l'espace de recherche est de 7.776 organisations et un parcours aveugle nécessiterait en moyenne 3.888 organisations pour atteindre une organisation donnée. Comme une organisation fonctionnelle possède 4 instances identiques pour une valeur produite, par permutation des entrées, il faudrait en moyenne 972 essais pour obtenir la valeur souhaitée.
Tout d'abord, comme pour la factorielle, une organisation fonctionnelle (une des 6 configurations listées) est atteinte très rapidement, en moins d'une dizaine de changements de liens. On peut alors distinguer deux cas en fonction de l'organisation initiale produite par le système (l'organisation à recevoir le premier feedback) : le cas "facile" qui correspond aux configurations 4, 5 et 6, et le cas "difficile" des configurations 1, 2 et 3.
Dans le cas "facile", la configuration 6 est à nouveau atteinte en moins d'une dizaine de changements de liens. Dans le cas "difficile" qui possède une sorte de maximum local, le système doit arriver à détecter l'impossibilité de produire une meilleure valeur sans changement radical (BestOfWorse). Actuellement, cela repose simplement sur un temps d'attente relativement long pour ne pas perturber le système lorsqu'il est en train de se réorganiser efficacement et des stratégies plus efficaces sont sûrement envisageables. Dans ce cas, le système nécessite entre une dizaine et moins d'une centaine de changements de liens pour atteindre l'organisation souhaitée. Une bonne part de ces changements s'effectue alors que le système est dans la situation 3 et détecte un cas nécessitant un changement de type BestOfWorse. Une optimisation de cette détection réduirait grandement le nombre de changements nécessaires.
Le cas symétrique a également été testé en demandant au système de produire la valeur la plus petite qui correspond à la configuration 1. Là aussi le système trouve la bonne organisation en moins d'une centaine de changements de liens. On peut noter que le parcours est cependant très différent et semble plus chaotique car lorsque l'environnement demande à l'AgentOut de fournir une valeur plus petite, celui-ci choisit souvent une des constantes, ce qui ne permet pas aux autres agents de participer au calcul. Mais le traitement coopératif de la NCSNeedOut replace coopérativement les agents dans le processus de calcul.
Au final, nous pouvons donc affirmer que le système dans un état initial quelconque (sans aucun lien par exemple, ou toute autre configuration), nécessite le parcours de moins d'une centaine d'organisations sur les 7.776 pour atteindre une des quatre organisations produisant la valeur la plus élevée. On peut considérer que cette stratégie permet un parcours pertinent de l'espace de recherche. Mais le plus intéressant est que quelle que soit la configuration recevant un feedback demandant de fournir une meilleure valeur, la prochaine valeur fournie à l'environnement sera effectivement meilleure car le système aura atteint une configuration produisant une meilleure valeur (si cette configuration existe).

Limite et amélioration nécessaire
Mais un système doit être capable de trouver une valeur quelconque. En l'état actuel, le système est capable de trouver n'importe quelle valeur mais une part de hasard entre alors en jeu, et le fait de trouver cette valeur tient en partie au fait du nombre limité d'organisations. En effet, quand un agent cherche à produire une meilleure valeur il accepte comme partenaire le premier qui puisse lui fournir une valeur au-delà de ses seuils d'entrée sans se soucier de l'écart avec l'ancienne valeur ainsi engendré. Et ce phénomène se généralise à toute l'organisation. Ainsi, quand on demande par exemple au système de fournir une valeur plus grande qu'une valeur moyenne, le système va souvent dépasser cette valeur.
On peut imaginer deux types de changements répondant à ce problème. La première possibilité est d'amener les agents à procéder par incrément minimal : lors d'un NCSInformedNeedIn, l'agent va attendre d'avoir reçu un certain nombre de réponses afin de choisir le partenaire lui permettant de produire une meilleure valeur mais avec un changement minimal. Dans ce cas, le système ne dépassera pas la valeur souhaitée à cause d'un incrément trop brutal. La deuxième possibilité demande aux agents d'apprendre à diminuer le saut de valeur en valeur si un changement venait à modifier le but. Tant que le feedback reste le même l'agent essaye de faire le plus grand incrément lors du choix d'un nouveau partenaire. Si le feedback change, l'agent doit faire des incréments plus petits (et dans l'autre sens en l'occurrence) : une forme de recherche dichotomique en quelque sorte. Par manque de temps, cette solution n'a pas pu encore être explorée.

Un premier pas de "Scaling up"
Comme l'exemple élémentaire représente un espace de recherche minimaliste avec des possibilités somme toute très limitées, nous avons voulu effectuer des tests avec des exemples plus complexes. Par exemple, simplement en ajoutant un AgentAddition supplémentaire dans le système, l'espace de recherche passe à 823.543 organisations possibles dont 30.240 organisations complètes. Dans ce cas aussi, le système produit successivement des valeurs plus grandes si on lui demande de trouver la valeur la plus grande que le système soit capable de produire avec le pool d'agents donné, et finit par trouver cette organisation maximale. Le nombre d'organisations parcourues pour cela se situe entre 100 et 200 mais des statistiques plus conséquentes n'ont pas été effectuées par manque de temps là aussi. Malgré la montée en complexité, les agents parcourent également l'espace de recherche avec efficacité et en suivant le but fixé par l'environnement.
D'autres essais avec plus d'agents ont été effectués mais il devient alors difficile de trouver à la main quelle est l'organisation produisant la valeur maximale. Cependant, pour un feedback demandant continuellement "plus grand", les valeurs produites sont effectivement croissantes, même si les agents nécessitent naturellement un plus grand nombre de changements de liens pour y parvenir. Il serait alors intéressant de tester le rapport entre la croissance du nombre de changements nécessaires et la croissance de l'espace de recherche. Le test avec l'AgentAddition semble indiquer une croissance nettement plus faible pour le nombre d'organisations parcourues que pour la taille de l'espace de recherche. Bien qu'il faille procéder à des expérimentations statistiques complètes pour pouvoir affirmer cette propriété, cela correspond bien au principe de traitement local inhérent aux SMA basés sur la notion d'émergence : du point de vue local de l'agent, l'explosion en taille de l'espace de recherche n'est pas directement apparent.

Conclusion
Face à l'incapacité de la première stratégie d'auto-organisation coopérative, basée sur une gestion de taux de confiance et un feedback de type booléen, à permettre au système d'atteindre l'adéquation fonctionnelle, une deuxième stratégie a été développée et testée dans cette partie. Elle repose sur un feedback plus informé de type "plus grand / plus petit" et sur la distribution par propagation de ce but au sein de l'organisation, ainsi que sur l'accaparement du but par les agents qui vont alors localement chercher à l'atteindre. Des mécanismes coopératifs élaborés ont été mis en place pour permettre aux agents de résoudre les conflits et d'atteindre, en tant que collectif, le but imposé au système par l'environnement.

Convergence vers l'adéquation fonctionnelle
L'implémentation de cette stratégie dans EPE pour l'exemple élémentaire décrit dans cette partie a permis au système d'atteindre l'adéquation fonctionnelle demandée par l'environnement dans tous les cas et avec efficacité. De plus, et cela est primordial compte tenu des espaces de recherche gigantesques que veut traiter la programmation émergente, l'organisation souhaitée est atteinte en un parcours efficace de l'espace des organisations possibles.
Le point clé a été la capacité démontrée par la stratégie à traduire et transposer une contrainte de l'environnement au sein du système et dans chaque agent. Il faut noter qu'aucune supervision globale ne vient dicter aux agents leurs comportements, et qu'aucune information disponible aux agents ne leur explicite l'organisation à atteindre et de quelle manière. En substance, cette stratégie permet à chaque agent d'avoir une indication quant à la direction à essayer de prendre et une mesure du succès du collectif dans cette entreprise. De ce fait, les organisations successives produisent effectivement des valeurs de plus en plus proches de la valeur demandée.

Vers factorielle et au delà
L'exemple élémentaire a démontré la faisabilité d'un système de programmation émergente, réalisé avec un système multi-agent adaptatif basé sur l'auto-organisation coopérative, dans certaines contraintes permettant de réduire la complexité. Le travail futur est alors tout tracé : remonter le long des simplifications pour y appliquer les enseignements acquis et les adapter aux nouvelles contraintes. Ainsi, il faudra en premier permettre au système de trouver n'importe quelle valeur, même une valeur située dans la moyenne, ainsi que de s'assurer de la capacité du système à supporter la croissance en complexité.
Ensuite, il s'agira de réintroduire les agents nécessaires pour le calcul de la factorielle : AgentEquals, AgentIn, AgentFirstTime et la version avec contrôle de l'AgentOut. Il faudra alors instancier les comportements coopératifs de la stratégie d'auto-organisation informée aux spécificités de ces agents. L'AgentOut avec contrôle, notamment, devra traduire un but de type "plus grand" par une propagation d'une demande de valeur plus grande sur sa première entrée ou par un modification de son contrôle pour qu'il déclenche plus tôt ou plus tard en fonction de la suite de valeurs reçues par l'AgentOut. Cela se répercute alors sur L'AgentEquals qui devra trouver des partenaires lui permettant de fournir le booléen souhaité au bon moment. L'AgentIn se comporte simplement comme une constante mais l'AgentFirstTime doit prendre en compte sa fonction très spécifique ainsi que le fait qu'il est capable de produire une boucle de calcul.
Nos réflexions nous permettent de penser que les techniques développées pour les agents de l'exemple élémentaire, bien qu'elles ne soient pas applicables directement à des agents plus complexes, nous fournissent un cas concret pertinent à partir duquel les principes fondamentaux et primordiaux qui ont permis l'adéquation fonctionnelle peuvent être trouvés. Ces principes peuvent alors certainement être appliqués aux agents de factorielle qui seront alors capables de converger vers l'organisation produisant la factorielle.


PE : implémentation
Le  REF _Ref70656545 \r \h  \* MERGEFORMAT Chapitre I et le  REF _Ref74387850 \w \h  \* MERGEFORMAT Chapitre II présentent le cadre théorique de mon travail de thèse avec la description des concepts d'émergence et d'auto-organisation, et de la théorie AMAS qui en découle. Dans ce cadre et en s'appuyant sur les définitions associées, le  REF _Ref70659355 \r \h Chapitre III contient la description du concept de programmation émergente, la description détaillée des mécanismes d'auto-organisation mis en place et les résultats expérimentaux obtenus. Mais pour réaliser ces expérimentations, un travail conséquent de programmation a dû être effectué et ce présent chapitre présente principalement l'architecture mise en place pour implémenter EPE et supporter les mécanismes d'auto-organisation explorés tout au long de ma thèse. J'introduis également certains choix d'implémentation ainsi que des considérations quant aux implémentations de SMA en général, et je finis par une présentation générale de l'état actuel de EPE.

Introduction
Le travail réalisé au cours de ma thèse s'inscrit dans l'approche privilégiée par l'équipe, depuis ses débuts, de l'expérimentation comme moyen principal d'exploration et de validation d'idées théoriques. La conséquence directe de ce choix est la place importante accordée et demandée par l'implémentation. En effet, elle est le support de cette expérimentation et plus les outils produits sont puissants de façon générale, plus l'expérimentation sera efficace et enrichissante pour les théories associées. Mais la puissance et la richesse demandent un travail conséquent, et EPE n'a pas dérogé à la règle.

Quelques informations générales
Le choix du langage de programmation s'est bien sûr porté sur un langage de haut niveau comme support à la richesse et la modularité demandées par EPE (interface graphique évoluée, outils d'observation, environnement pour un SMA, le SMA en lui-même, interaction avec ce SMA, …) mais également pour l'analogie évidente entre SMA et langage "objet". Le langage Java a été choisi pour sa facilité d'utilisation due notamment à l'importante API (Application Programming Interface : l'ensemble des outils, briques de bases et fonctionnalités disponibles au programmeur pour construire ses applications) et à la documentation exemplaire disponible (sources commentées, documentation détaillée de l'API avec explications d'utilisation, riches tutoriaux et guides).
La programmation s'est effectuée sous les environnements de programmation successifs de Forte, Netbeans puis Eclipse. Forte est l'environnement proposé par Sun (créateurs de Java) et offrait donc directement un contexte étroitement adapté à Java avec en particulier un des premiers outils visuels de créations d'interfaces graphiques pour Java (élaboration en grande partie "à la souris" dans un plan de travail représentant directement l'interface en chantier). Netbeans est le pendant "open source" de Forte et a, pendant un certain temps, évolué plus vite que Forte, grâce aux efforts de programmeurs de par le monde utilisant effectivement cet environnement dans leur travail quotidien et voulant inclure des outils ou fonctionnalités spécifiques. Mais entre-temps, Eclipse est arrivé à maturité et propose une richesse et une ergonomie inégalées à mon sens, d'où la migration finale vers cet environnement. Issu d'un effort initial conséquent de la part d'IBM, Eclipse est passé, il y a un peu de deux ans, en "open source" mais restant sous la tutelle d'IBM, avec le support de plusieurs grandes entreprises (Borland, Oracle, Rational, Red Hat, SuSe, …). Tous les efforts réunis ont produit avec rigueur un environnement extrêmement complet, incluant de nombreuses innovations ergonomiques et continuellement en développement grâce à une communauté très dynamique. Eclipse est bien sûr gratuit et je ne peux que le conseiller (www.eclipse.org).
Dans ces conditions, l'implémentation s'est alors déroulée tout au long de ma thèse, au fur et à mesure de nouvelles idées et voies d'exploration, conduisant à des expérimentations (et donc de la programmation) produisant à nouveau des idées, et ainsi de suite. Au final, la partie implémentation a constitué une part conséquente de mon travail et EPE est en l'état actuel un programme relativement gros avec plus de 200 classes et près de 16.000 lignes de codes effectives (calcul effectué avec le programme "Java NCSS" qui compte les "Non Commenting Source Statements").

Le manque de plates-formes SMA réellement génériques
Le but principal étant l'expérimentation de comportements d'auto-organisation, le premier réflexe a été de rechercher une "plate-forme Agent", c'est-à-dire un environnement permettant de créer des SMA en spécifiant uniquement le comportement des agents. Malheureusement, il n'existe pas à mon sens (ou n'existait pas au début de ma thèse en tout cas) de plate-forme réellement générique pour permettre d'implémenter n'importe quel type de SMA facilement. En fait, les plates-formes actuelles (MadKit, Magique, Zeus pour en citer quelques unes), bien que développées avec un soucis réel de généricité, incorporent de façon inhérente une manière ou des contraintes bien précises dans la façon d'aborder un SMA. Il existe de nombreuses façons de définir et concevoir des SMA, autant dans l'architecture, que dans les mécanismes d'interaction des agents, ainsi que, et c'est le point le plus important, dans la façon dont le SMA se modifie en fonction des contraintes de l'environnement. D'une façon ou d'une autre, ces plates-formes ont tendance à contraindre le développeur dans une vision particulière (par exemple, le modèle Agent-Groupe-Rôle pour MadKit). Ce ne sont pas forcément des contraintes immuables, mais il est difficile d'utiliser une plate-forme donnée en dehors du contexte proposé, ceci d'autant plus que la plate-forme est riche et complète. A l'autre extrême, les plates-formes offrant le plus de liberté ne sont généralement guère plus que des conseils méthodologiques généraux.
J'ai donc commencé la programmation pour EPE seulement avec à ma disposition l'API Java et dans le souci de maximiser le fonctionnement générique et l'autonomie des agents. Il n'était absolument pas question de faire une plate-forme générique, mais d'implémenter une version très modulaire proche des définitions généralement admises pour les agents et les SMA, en évitant toute forme de structure de fonctionnement imposée. A partir de cette base, j'ai pu alors explorer des fonctionnements divers d'auto-organisation. Au final, l'utilisation de l'architecture d'EPE pour un SMA quelconque est sûrement contrainte par les choix d'implémentation, d'architecture ou de raccourcis au sein d'EPE. Mais à mon sens, une large classe de SMA (ceux basés sur les principes d'auto-organisation tels que décrits dans le  REF _Ref46116486 \r \h -ð) peuvent être implémentés avec l'architecture d'EPE, en décrivant alors seulement, et librement, les comportements précis des agents.

La question de l'autonomie et de la simulation
Quand on considère le concept d'émergence, la notion d'autonomie semble y avoir une place prépondérante (en effet, si le comportement des parties n'est pas au moins en partie autonome alors il est dicté par une entité externe et le résultat produit est alors simplement la conséquence des ordres de cette entité). Mais cette autonomie peut prendre bien des formes dans une simulation informatique. De plus, l'implémentation de l'autonomie va de pair avec celle des mécanismes d'interaction : il faut définir comment sont représentées et gérées les activités autonomes des agents.
Une approche classique est l'exécution d'une boucle, tant que dure la simulation, qui va à chaque itération exécuter le comportement des agents dans un ordre aléatoire. Il suffit alors de donner à chaque agent un comportement autonome, dans le sens où il décide de ses actions uniquement en fonction de ses perceptions, de ses buts et de son comportement social. On peut distinguer ici principalement deux types de fonctionnement suivant que les perceptions des agents dépendent uniquement de l'état du monde à la fin de l'itération précédente ou si les conséquences des actions des agents lors de l'itération présente sont éventuellement perceptibles par les agents agissant en suivant (mais dans la même itération). Dans les deux cas, le fonctionnement du monde est discrétisé agent par agent, mais dans le premier cas, une certaine forme de simultanéité est simulée : les agents se comportent comme s'ils agissaient tous en même temps. Les comportements individuels et collectifs ne sont pas les mêmes dans ces deux cas et ils ne présentent que les extrêmes : on pourrait vouloir donner des temps d'action différents pour les agents, et la simultanéité possible d'actions aurait alors à être implémentée différemment.
Cette approche de la simulation demande en fait de programmer explicitement les comportements issus du fonctionnement "temps réel" du monde réel au sein de la boucle d'exécution des agents et ceci peut s'avérer délicat. Par exemple, il semble difficile d'obtenir le comportement d'évitement de deux personnes dans la rue de manière réaliste avec cette situation curieuse qui arrive de temps en temps d'hésitation et de choix simultanés de la même direction qui oblige à nouveau à changer de direction. Cela peut d'ailleurs se répéter plusieurs fois avant d'arriver à une synchronisation qui permet effectivement l'évitement.
Comme les exemples d'auto-organisation sont généralement issus de phénomènes du monde réel, et comme nous voulons nous servir d'une forme d'auto-organisation la plus proche du concept (i.e. sans biais introduits artificiellement), rester le plus proche possible d'entités évoluant de façon autonome dans le monde réel semble minimiser le risque d'introduire ces biais. J'ai alors choisi d'implémenter chaque agent sous la forme d'un "thread" Java (une sorte de processus du point de vue de la machine virtuelle) communiquant par envoi de messages basé sur le modèle événementiel (modèle conceptuel permettant l'échange d'événements entre objet par appel de méthodes : définition d'interfaces de types Sender et Listener qui obligent un objet Listener à implémenter certaines méthodes qu'un objet Sender se doit d'appeler quand un événement précis se produit, ce qui va "réveiller" le thread exécutant l'objet Listener qui peut alors prendre en compte cet événement). Nous obtenons alors un fonctionnement très réaliste et autonome des agents qui exécutent leur comportement indépendamment des autres jusqu'à réception d'un événement (perception, message) qu'ils peuvent alors prendre en compte au moment voulu dans leur raisonnement.
Ce fonctionnement par threads et événements est bien sûr lui aussi une forme de discrétisation du fonctionnement puisqu'il s'agit, sur une machine monoprocesseur, de temps partagé. Mais ceci est absolument transparent pour les agents et pour le programmeur qui doit alors implémenter des agents réellement autonomes qui peuvent avoir à faire face à des types de situations très variés en fonction du comportement des autres agents. On peut donc affirmer qu'EPE intègre une gestion de l'exécution des agents proche des phénomènes du monde réel et ceci a imposé des choix comportementaux complexes pour les agents afin qu'ils puissent interagir efficacement. On obtient ainsi une grande robustesse qui permet aisément d'introduire ces comportements dans des robots réels par exemple. Mais le contrecoup a été justement cette complexité qui obligeait à traiter un grand nombre de situations, de possibilités, d'erreurs, et surtout à prendre en compte le temps. En effet, un agent doit prendre en compte le fait qu'il faille un certain temps aux autres agents pour réagir à un stimulus de sa part. Certaines SNC dépendent également dès lors d'un certain temps d'attente et, pour pouvoir choisir entre différentes propositions, un temps d'attente peut être nécessaire à défaut d'autres critères.
Pour finir sur ce point, les choix initiaux ont conduit à concevoir des agents aux comportements riches tout en restant robustes, mais l'effort de conception et surtout de programmation nécessaire me font penser que ces choix étaient peut-être maladroits et qu'une approche plus classique de la simulation abordée avec précaution aurait peut-être été tout aussi viable, tout en demandant un effort moindre.

Des agents "simples" mais des comportements complexes
Un autre élément nous a également surpris : la complexité au final des comportements de réorganisation des agents. Initialement, comme les agents représentent des instructions, il nous semblait que nous aurions à faire à de "petits" agents très simples dans leur fonctionnement, mais produisant la complexité par leur interaction. En effet, les agents-instructions ont des compétences simples (addition, test d'égalité, …), des interactions simples en découlant (transmission de données) et une vision locale qui gère très peu d'éléments simples (les autres agents-instructions). Si effectivement la capacité des agents à simuler l'exécution d'un programme est relativement simple, les mécanismes de réorganisation sont eux particulièrement riches. C'est en quelque sorte comme si les agents avaient à pallier le manque d'éléments de réflexion pour la réorganisation par des comportements complexes afin de récupérer autrement des indices supplémentaires.
A posteriori, cela semble avoir du sens : un agent de plus haut niveau, avec des compétences évoluées et ayant accès à de nombreuses données peut finalement avoir une certaine facilité à trouver les éléments déterminants pour guider ses choix. Pour la programmation émergente, le moindre détail, la moindre interaction peut être significative et indispensable à l'agent.
Dans la même idée, un autre point intéressant à aborder sur le sujet de l'implémentation est la distance entre la description d'un comportement en langage naturel ou même formel, et l'implémentation concrète. A partir d'une description d'une idée de comportement pour un agent en fonction de certains paramètres et de certaines situations, nous avions généralement à produire une spécification détaillée conséquente qui présentait des gestions complexes de situations attenantes ou de sous-cas de l'idée initiale, comme par exemple la description de la stratégie dans l'exemple élémentaire (point  REF _Ref70682536 \r \h 4.3 du  REF _Ref70659355 \r \h Chapitre III). Mais l'implémentation au sein des agents de cette description détaillée présentait elle aussi un challenge inattendu. Non seulement la mise en place concrète des idées posait de véritables casses-têtes avec pour résultat des algorithmes compliqués prenant en compte de nombreux paramètres, mais elle résultait souvent dans la détection de cas non prévus ou d'effet de bord indésirables qui imposaient alors de repenser les mécanismes précédents. Tout ceci a contribué à produire un programme bien plus conséquent que prévu initialement pour les fonctionnalités atteintes actuellement.

Architecture
Je présente ici à l'aide de diagrammes UML et d'explications associées une vue schématique de EPE qui ne constitue pas une représentation détaillée de l'architecture mais une version simplifiée focalisant sur l'aspect modulaire. J'insiste plus particulièrement sur les modules liés aux comportements et fonctionnements des agents, ceux-ci étant le support aux comportements d'auto-organisation expérimentés. On peut noter également que rien ne représente le SMA en lui-même : celui-ci n'est que le résultat de la collaboration des agents. Je ferai dans la suite référence à ce SMA par "système" car il est le système étudié qui s'adapte à l'environnement grâce aux mécanismes d'auto-organisation implémentés.

Architecture générale
La  REF _Ref70686640 \h Figure 30 représente une vue d'ensemble de l'architecture d'EPE avec comme point central la classe Agent. En effet, la plus grande partie d'EPE est constituée par cette classe, les classes filles qui en héritent et qui contiennent les spécificités des différents agents-instructions, et surtout par les modules associés aux agents, chacun constituant un ensemble de modules en lui-même. Ces modules sont les suivants :
AcquaintancesManager : gère les accointances et les croyances associées.
MessageManager : gère l'envoi et la réception de messages.
SynchronisationManager : permet à l'agent de se coordonner avec les autres agents pour effectuer les calculs afin que ceux-ci correspondent à leur équivalent en programmation classique.
ReorganisationManager : contient tous les mécanismes et données nécessaires pour permettre à l'agent de se réorganiser coopérativement avec les autres agents.
GUI : l'agent a également accès à un module GUI qui regroupe l'ensemble des modules de l'interface graphique auxquels l'agent a accès.
Le reste de EPE (l'interface graphique, les outils d'observation, l'environnement des agents) est regroupé dans le module ProgrammingEnvironment.

Les types d'agents
La  REF _Ref70687660 \h Figure 31 contient l'ensemble des types d'agents disponibles dans EPE actuellement. Chaque type d'agent hérite des fonctionnements génériques de la classe Agent et y rajoute les caractéristiques et fonctionnements propres à sa nature qui dépend de l'instruction qu'il représente ou du rôle particulier qu'il joue pour le système. Les agents nécessaires aux calculs y sont représentés :
AgentConstant qui est l'agent représentant une constante avec une valeur définie à la création.
AgentOne et AgentZero sont juste des agents pratiques créés en premier pour faciliter la visualisation et l'utilisation, et peuvent être remplacés par l'AgentConstant (on peut cependant noter que ces agents pourraient posséder des connaissances liées à la valeur particulière qu'ils contiennent : l'AgentZero par exemple pourrait savoir qu'il rend nulles les opérations effectuées par l'AgentMultiplication et l'AgentOne qu'il est l'élément neutre pour cet agent).
AgentAddition et AgentMultiplication qui représentent respectivement les instructions d'addition et de multiplication.
AgentEquals qui est l'agent de test d'égalité,
AgentFirstTime qui est l'instance particulière du branchement utilisé dans EPE pour les exemples traités.
Les cinq agents restant sont un peu particuliers. Les agents AgentIn, AgentOut et AgentOutWithoutControl sont les agents d'interfaçage du système avec l'environnement. L'AgentIn récupère sa valeur de l'environnement et la transmet aux agents avec lesquels il est connecté en sortie, l'AgentOut transmet la valeur reçue en entrée (et donc produite par le système) à l'environnement si son entrée de contrôle le lui permet (contrôle connecté par exemple à l'AgentEquals) et l'AgentOutWithoutControl en est une version sans contrôle qui transmet systématiquement sa valeur à l'environnement. L'environnement est alors représenté par les agents AgentEnvironment et AgentEnvironmentReceiver du point de vue des agents d'interface, l'un étant capable d'envoyer des valeurs à l'agent d'entrée du système et d'en recevoir de l'agent de sortie, l'autre uniquement de recueillir les valeurs. Ce ne sont pas des agents à proprement parler du même niveau que les autres, mais du point de vue local d'un agent, l'environnement peut être simplement vu comme un agent, surtout si les interactions possibles se limitent à l'envoi de messages.

L'environnement du système
L'environnement pour le système est représenté par l'AgentEnvironment (et sa variante). Cet agent est également relié à l'interface graphique au travers de laquelle l'utilisateur peut rentrer les valeurs à fournir au système et récupérer les valeurs produites. L'utilisateur peut également au travers de cette interface et de cet agent décider quand renvoyer certaines SNC s'il ne veut pas le faire au travers d'une stratégie donnée implémentée dans cet agent. Dans l'état actuel, le système ne nécessite pas d'environnement plus complexe puisqu'il ne fait qu'effectuer un traitement sur des valeurs produites en entrée et fournir une valeur en sortie.

La gestion d'accointances
L'agent gère ses accointances et ses croyances sur ses accointances au travers de l'AcquaintancesManager ( REF _Ref70691654 \h Figure 32). Ce module se charge de référencer les autres agents connus par l'agent, les valeurs de confiance associées, les croyances au sujet des compétences de ces agents, l'ajout de nouvelles accointances, les accointances avec lesquelles l'agent est actuellement lié, la mise à jour quand des changements interviennent (changement de croyances, changement d'accointances de travail). Les mécanismes sont décrits dans le gestionnaire lui-même et les accointances listées dans la classe Acquaintances qui contient des instances de la classe Acquaintance. Une Acquaintance regroupe les informations sur un autre agent donné : nom (qui est également son adresse et permet de le contacter), type de rapport (connaissance d'entrée, numéro, connaissance de sortie, connaissance neutre), le type de valeur manipulée (utile pour les agents qui manipulent un type de donnée générique), la valeur de confiance, des connaissances éventuelles sur ses compétences, …

La communication
La communication est un élément primordial pour les agents EPE, pour l'échange de données afin d'effectuer les calculs bien sûr, mais surtout parce qu'elle est le support de l'auto-organisation : la stratégie de réorganisation d'un agent ne peut se dérouler sans l'échange d'informations, de requêtes et de SNC aux autres agents.
Module de communication
L'agent gère l'envoi et la réception de messages au sein du module MessageManager. Ce module a accès au module d'accointances de l'agent pour connaître les adresses auxquelles envoyer les messages. La réception des messages se fait classiquement au travers d'une boîte aux lettres que l'agent peut consulter à son gré. Ce module regroupe également l'ensemble des types de messages disponibles regroupés dans les catégories décrites dans les points suivants.

Les messages de contrat
Cette catégorie regroupe les messages servant à l'instauration des relations de travail entre agents (cf.  REF _Ref70697716 \h Figure 34), c'est-à-dire qu'ils permettent à un agent de créer les liens privilégiés avec des agents qui deviennent alors des partenaires (des fournisseurs pour ses agents d'entrée et des clients pour ses agents de sortie). Ces messages interviennent principalement à la suite de l'émission d'une SNC de type needIn ou needOut, et de la réception de propositions associées. Comme les agents sont autonomes et s'exécutent simultanément, des messages peuvent se croiser, d'autres agents peuvent intervenir, ou des changements de situations peuvent survenir, ce qui peut perturber la mise en place d'une relation de travail. Les messages suivant mettent en place un protocole qui permet des désistements et qui conclut par la création d'un lien unique cohérent :
ProposingCooperationMessage permet à un agent de se proposer comme relation de travail suite à la réception d'une SNC lui indiquant le manque pour un agent de relation de travail.
ProposingCooperationInWithPotentialValueMessage est la version plus informée du message précédent pour une NCSNeedIn indiquant également la valeur qu'un agent pense être capable de fournir.
ProposingCooperationOutWithPrejudice est son pendant pour une NCSNeedOut indiquant le préjudice que subirait le proposant en cas de mise en place de la relation.
RequestCooperationMessage demande à un agent qui s'est proposé pour une relation de travail de créer effectivement cette relation.
AknowledgementCooperationMessage accepte et crée effectivement la relation de travail demandée par un RequestCooperationMessage, à l'envoi pour l'émetteur, et à la réception pour le destinataire.
RefusingCooperationMessage permet à un agent de refuser une demande de relation de travail par un RequestCooperationMessage, par exemple en cas d'empêchement dû à une relation avec un autre agent.
CancellingCooperationMessage permet à un agent de rompre un partenariat de travail.

Les messages de données
Cette catégorie regroupe les messages liés au calcul et à l'échange de données (cf.  REF _Ref70699357 \h Figure 35). Dans l'état actuel, les agents ne traitent que deux types de données : les entiers avec NumberMessage et les booléens avec BooleanMessage. Ces messages véhiculent les données le long d'une organisation et représentent ainsi la continuation du calcul de l'algorithme représenté par l'organisation. ReadyToReceiveMessage permet aux agents de se synchroniser afin d'effectuer un calcul cohérent et suivant une chronologie précise : dès qu'un agent a fini son calcul et envoyé sa valeur à ses sorties, il prévient ses entrées qu'il est à nouveau opérationnel. Un agent envoie des données seulement si tous ses agents de sorties sont prêts à les recevoir.
Les messages d'information
Cette catégorie regroupe les messages permettant de faire circuler des informations concernant les changements d'état des agents et donc potentiellement d'autres agents ou de l'organisation (cf.  REF _Ref70699845 \h Figure 36). Ils sont nécessaires aux processus de réorganisation pour récupérer des informations cohérentes sur les autres agents.
DataTypeChangedMessage : prévient que l'agent émetteur, permettant de gérer des types génériques de données à instancier, vient de changer le type de données qu'il est capable de traiter.
LinkMultiplicityChangedMessage : ce message permet de mettre à jour les informations qu'un agent possède sur un lien de travail donné afin de savoir, pour un lien d'entrée, si l'agent connecté possède d'autres partenaires pour la même sortie et donc si la rupture de ce lien entraîne une SNC ou non.
GoalReachedMessage : prévient les autres agents que l'agent a réussi à atteindre son but (de produire une meilleure valeur) et permet alors potentiellement aux autres agents reliés d'atteindre également leur but, ce qui peut conduire toute l'organisation à se considérer en état de GoalReached.
PotentialOutputMessage : ce message dirigé vers les sorties d'un agent les prévient que l'agent pense produire une valeur différente en sortie lors du prochain calcul. Cette mise à jour se propage et permet aux agents de proposer une valeur relativement sûre lors de la réception d'un NCSNeedInMessage.
CyclePingMessage : ce message n'est qu'une amélioration du traitement de situations bloquantes en prévenant à l'avance les cycles au moment du choix d'un nouveau partenaire. L'agent émet une sorte de ping vers le partenaire potentiel et vérifie s'il reçoit ce ping sur une de ses entrées ou sorties, selon le partenariat à établir. S'il reçoit son propre message, la création de ce partenariat produirait un cycle bloquant et est donc à éviter.

Les messages de SNC
Cette catégorie regroupe les messages liés à une facette très importante de la théorie AMAS : les messages signalant les SNC (cf.  REF _Ref70700626 \h Figure 37). Les SNC sont détectées localement par les agents mais peuvent rarement être résolues toutes seules. Ceci est particulièrement vrai pour les agents-instructions qui n'ont comme seule méthode d'adaptation le changement de partenaire. Ils préviennent alors les autres agents de leur SNC et comme ceux-ci sont coopératifs, une résolution collective peut se mettre en place. L'environnement a recours à des messages similaires pour prévenir le système qu'il ne fournit pas les bonnes données et ces messages sont regroupés dans la même catégorie.
NCSNeedInMessage : prévient les autres agents que l'agent émetteur est en manque de relation de travail pour une de ses entrées. Les agents peuvent alors se proposer avec les messages de contrats adéquats.
NCSInformedNeedInMessage : la version "informée" du message précédent. L'agent spécifie en plus s'il nécessite une valeur plus grande ou plus petite qu'un seuil fourni avec le message.
NCSNeedOutMessage : le pendant des messages précédents pour un manque de relation en sortie.
NCSNoPotentialOutputMessage : l'agent prévient ses partenaires de sortie qu'il n'est plus capable de fournir une valeur. Ceci peut être dû à une rupture d'un de ses liens d'entrée, ou de la réception de ce message venant d'une de ses entrées. Cette information est importante pour le processus de réorganisation informé car un agent ne peut se proposer en indiquant une valeur potentielle pour un NCSInformedNeedInMessage s'il ne connaît pas la valeur qu'il est capable de fournir.
NCSInadequateDataMessage : ceci est le message envoyé par l'environnement pour indiquer que la valeur fournie par le système est erronée.
NCSInformedInadequateDataMessage : la version "informée" de la SNC précédente qui indique également au système s'il doit produire une valeur plus grande ou plus petite.
NCSMissingDataMessage : l'environnement envoie ce message quand le système met trop de temps pour fournir une donnée. Ceci peut être le cas si l'AgentOut n'est jamais autorisé par son contrôle à émettre.

La réorganisation
Le module lié à la capacité d'un agent à changer ses partenaires de travail est certainement la partie la plus importante d'EPE. En effet elle regroupe tous les mécanismes nécessaires à la réorganisation mais elle contient également les stratégies employées par l'agent. Ainsi, la plupart des messages reçus par l'agent sont effectivement traités au sein de ce module par des sous-modules spécifiques. Le comportement de l'agent en ce qui concerne tout ce qui touche à l'auto-organisation est géré par le ReorganizationManager (cf.  REF _Ref70702052 \h Figure 38) qui se décline en différentes versions spécifiques suivant le type d'agent concerné et qui délègue ses tâches sur différents autres sous-modules :
ReorganisationEngine : ce module est le moteur même de la réorganisation et regroupe les algorithmes avancés de traitement de SNC de l'agent qui prennent en charge la détection de SNC, l'envoi des messages associés, la gestion des connaissances liées à la réorganisation, …
ReorganisationMessageProcessor : ce module regroupe en fait dans des classes spécifiques tous les mécanismes de traitement des messages liés à la réorganisation. On peut considérer qu'une partie importante de la stratégie de réorganisation est en fait répartie au travers de ces différentes classes. En effet, les choix effectués suivant les messages reçus dictent en partie les comportements de l'agent.
PotentailInOutAcquaintances : ce module maintient une liste des accointances se proposant suite à l'envoi de NCSNeedIn/Out ainsi que les informations associées. Il maintient également au travers du module LastInOutAcquaitnances une mémoire des derniers partenaires afin d'éviter de revenir immédiatement ou systématiquement à un état précédent.
RequestManager : le module gérant les requêtes faites aux partenaires potentiels. Il maintient à jour ceux qui ont répondu, ceux qui ont refusé, et permet éventuellement de modifier les choix de l'agent pour les futures requêtes.
BestOfWorseManager : maintient à jour une liste d'accointances ayant répondu à un NCSInformedNeedInMessage et ne satisfaisant pas le seuil demandé. Le module de réorganisation fera appel à cette liste quand il n'arrivera plus à satisfaire ses buts et il cherchera alors un partenaire ayant un potentiel acceptable dans l'espoir que cet agent, en adoptant le but de l'agent demandeur, arrive à produire une meilleure valeur.
ThresholdAcquaitances : ce module mémorise les agents partenaires de l'agent au moment d'un NCSInformedInadequateDataMessage de l'environnement. Ils définissent ainsi les seuils de l'agent et par conséquent le nouveau but. De plus, un agent va essayer autant que possible de ne pas reprendre les mêmes partenaires à moins qu'il n'ait pas le choix, pour limiter le risque de retomber sans cesse dans la même configuration.


L'interface graphique
La majeure partie de l'interface graphique concerne directement les agents et ce sont effectivement eux qui mettent à jour les informations au travers du module GUI (cf.  REF _Ref70703540 \h Figure 39 et visibles  REF _Ref70705875 \h Figure 41). Tout au long du cycle de vie d'un agent, celui-ci propage ses états, les informations dont il dispose, un compte rendu des actions qu'il entreprend, et ainsi de suite, à ce module qui transmet à différentes parties spécialisées :
AgentTextOutputPanel : certainement la partie la plus importante de la GUI, ce module est le journal de bord de l'agent, fidèle aux moindres actions effectuées et changements d'états subis. Comme l'agent produit au cours de son cycle de vie des quantités énormes d'information (plusieurs centaines de milliers de lignes en moyenne par simulation) et de façon intensive, des modules associés se chargent de recueillir ces informations, de les afficher quand l'activité d'EPE le permet et de supprimer les anciennes entrées pour ne pas saturer la mémoire.
SystemPrinter : permet un affichage rapide directement dans la console pour prévenir d'erreurs graves qui compromettent la simulation ("débugage").
Animator : ce module permet d'afficher dans la fenêtre principale les différents agents constituant l'organisation dans de petites fenêtres déplaçables représentant un agent animé en fonction de son activité.
Background : associé au module précédent, il permet d'afficher les liens reliant les agents. Ces liens sont bien sûr dynamiques et les agents se chargent de prévenir ce module lors de changements. De même, lorsque l'utilisateur déplace les fenêtres représentant les agents pour mieux visualiser l'organisation, ce module met continuellement à jour les positions des liens.
SoundPlayers : ce module regroupe les sous-modules permettant l'émission de messages audio prévenant d'erreurs graves ou simplement d'événements spécifiques sans avoir à parcourir les logs des agents.
CommandPanel : ce module constitue l'interface d'interaction avec l'utilisateur. Le système y inscrit la valeur de sortie et l'utilisateur peut y entrer une nouvelle valeur fournie au système, ainsi que déclencher manuellement l'émission de SNC vers le système. D'autre part, il permet à l'utilisateur de demander aux agents d'arrêter temporairement leur exécution pour consulter leurs logs ou la structure de l'organisation courante.

Les outils d'observation
En plus du module GUI, l'utilisateur a à sa disposition un certain nombre d'outils d'observation le renseignant sur l'état de l'organisation et sur son évolution. En particulier, le GraphLayoutToolInterface permet d'observer la réorganisation dynamiquement : ce module reçoit les mises à jours quant aux créations et suppressions de liens de la part des agents et affiche dans une fenêtre séparée l'organisation au cours de l'évolution. Les icônes représentant les agents sont automatiquement déplacées selon des règles de répulsions entre icônes et d'attractions élastiques sur les liens afin de présenter de façon plus lisible les organisations évoluant au cours du temps. Cet outil a été développé lors d'un stage IUT par Bastien Hofman que j'ai encadré afin de lui permettre de produire un outil générique à intégrer dans EPE [Hofman 02].
Les autres outils permettent de surveiller la création et la suppression de liens (LinkObserver), l'envoi de messages (MessageSendObserver), et l'apparition de SNC (NCSObserver). Dans la version actuelle, leur rôle principal est de compter ces événements afin d'effectuer des statistiques sur les simulations. Ils ont par exemple permis de constater, en comptant la création de liens, le petit nombre d'organisations parcourues relativement à la taille de l'espace de recherche dans la version finale de la réorganisation.

Le logiciel EPE
Un aperçu de l'interface graphique de EPE se trouve à la  REF _Ref70705875 \h Figure 41. On peut notamment y voir la fenêtre principale, dans le fond, affichant les agents de l'organisation courante avec les liens de partenariats actuels. Ces agents sont déplaçables afin de permettre à l'utilisateur d'observer l'organisation sous l'angle voulu. La fenêtre en haut à droite contient le log pour l'AgentEquals et l'on peut afficher une fenêtre identique pour chaque agent de l'organisation. En bas à droite se trouve le CommandPanel, i.e. l'interface d'interaction entre l'utilisateur et le système. Les deux fenêtres en bas à gauche constituent l'outil d'observation GraphLayoutTool qui place dynamiquement les agents en fonction de l'état courant les liens de travail.

 Conclusion : Enseignements et Perspectives
Partant des résultats expérimentaux, je vais décrire les enseignements que nous tirons du travail réalisé quant au concept de programmation émergente, puis appuyer plus spécifiquement sur notre compréhension plus aboutie de l'utilisation de l'émergence et de l'auto-organisation pour la résolution de problèmes. Ensuite, des réflexions sont présentées quant à la programmation émergente au-delà de ce qui a pu être traité ici : l'utilisation d'un langage de programmation complet, les fonctionnalités d'un environnement de programmation plus riche et des problèmes réels à soumettre à la programmation émergente.

De l'Expérience aux Enseignements
Des difficultés imprévues
Lorsque le problème a été abordé dans le contexte de mon DEA, nous pensions qu'il s'agissait de pousser un peu plus loin les techniques utilisées avec succès dans les nombreux autres problèmes étudiés au cours des années précédentes par l'équipe. Nous étions bien conscients que le problème était d'une nature particulière du fait de l'extrême richesse et généricité d'un système composé d'agents. C'est pourquoi nous avons dès le commencement focalisé nos efforts sur une simplification du problème aux agents nécessaires pour résoudre la factorielle. Nous pensions alors pouvoir attribuer sans trop de difficulté aux quelques agents-instructions les comportements coopératifs nécessaires à l'obtention d'une fonction globale adéquate. En effet, par leur simplicité, les agents ne présentaient qu'un nombre réduit d'interactions possibles les uns avec les autres.
Mais nous avions mal évalué les conséquences de cette simplicité. Pour ce qui est des buts propres aux agents, le succès est réel : les agents trouvent de manière très efficace une organisation qui satisfait tout le monde et leur permet de réaliser leurs calculs. Le but d'un agent-instruction se limite effectivement à trouver des partenaires lui convenant pour chacune de ses entrées et sorties, et que ces partenaires soient capables, le cas échéant, de fournir des données. Cette première capacité de réorganisation est intéressante en soi car les contraintes sont nombreuses (types spécifiques, types génériques à instancier, un seul partenaire par entrée, limitation des cycles, …), et les agents les résolvent efficacement de manière distribuée.
Par contre, pour ce qui est de la fonction globale à réaliser, la simplicité des agents s'est avérée redoutable : comment faire en sorte que les agents, dont les buts locaux sont satisfaits, continuent à explorer l'espace de recherche, sans connaissance de l'organisation à atteindre, mais afin d'y converger ? Comme cela avait déjà été fait pour d'autres problèmes, nous avons commencé par travailler sur des valeurs de confiances entre agents : lors d'un conflit avec l'environnement (et donc suite à la production d'une valeur erronée), les confiances des agents responsables baissent. Mais comme dans un programme, chaque instruction, de par sa position dans l'ensemble du programme, participe à la fonction globale, il est probablement impossible de donner une localisation de l'origine d'un calcul erroné. Des problèmes au sein desquels tous les agents sont simultanément responsables ont également été traités (résolution d'équation, prévision de crues, …), mais dans ces systèmes, les changements pouvaient s'effectuer en continu, ce qui permettait de juger des changements progressifs effectués, et donc de progresser vers l'adéquation fonctionnelle. Nous avons alors analysé les caractéristiques particulières du problème de la programmation émergente.

Une classe particulière de problèmes
Au travers de l'exploration des mécanismes d'auto-organisation, des expérimentations successives et de l'étude d'autres applications réalisées par l'équipe, nous avons progressivement cerné les caractéristiques qui font du problème de la programmation émergente un représentant d'une classe particulière. Tout d'abord, il est à noter, et c'est à mon sens la caractéristique la plus importante, que les changements effectués par le système pour parcourir l'espace de recherche sont discontinus : la seule réponse d'un agent-instruction à l'apparition d'un problème est le changement de partenaire, ce qui entraîne un changement souvent radical des valeurs produites par l'agent, et par conséquent, un changement souvent radical de la fonction globale. Le système est donc dans l'impossibilité d'effectuer des changements progressifs afin de s'adapter aux contraintes de l'environnement. Ceci rend le parcours extrêmement plus difficile.
Ensuite, la nature des fonctions produites est également la plupart du temps discontinue. Ceci est inhérent à la programmation qui permet des comportements distincts pour un même programme (conséquence du principe même du If-Then-Else), ou simplement dû au comportement computationnel d'un programme (exécution d'un algorithme pas à pas, et non simplement une sommation de comportements par exemple ; cette distinction est déjà visible sur la factorielle qui est une succession différente de calculs suivant les valeurs fournies en entrée).
Ensuite, la distance entre les fonctions produites par les agents-instructions et la fonction globale impose des mécanismes complexes de prise en compte au niveau des agents du but de la fonction globale. L'étude de la factorielle avec les valeurs de confiance, puis de l'exemple élémentaire avec la recherche informée de partenaires, nous ont clairement montré l'aspect non trivial de cette prise en compte. Ceci distingue ce problème des catégories pour lesquelles les entités du système produisent des fonctions et possèdent des buts beaucoup plus proches de ce que l'utilisateur attend.
Les connaissances sur la nature et les spécificités du problème de la programmation émergente sont certainement un des résultats importants issus de ce travail. Non seulement parce que ces connaissances permettront de poursuivre les recherches sur la programmation émergente avec, justement, une stratégie plus informée, mais également parce qu'elles nous donnent une vision plus juste des différences entre les problèmes traités et traitables par auto-organisation. Et quand on aborde un nouveau problème, toute connaissance préalable est un avantage certain.

La difficulté d'implémentation
Plus que jamais je militerai en faveur du développement de plates-formes multi-agents génériques, d'API (Application Programming Interface) "agents" génériques, de méthodologies, ou simplement de guides. L'implémentation a représenté une part réellement conséquente de mon travail de thèse et certains aspects étaient très éloignés des considérations touchant à l'auto-organisation. Si je devais me permettre une comparaison, je rapprocherais ce travail avec la lourde tâche qui incomberait à quelqu'un voulant écrire un programme modulaire avec un langage non-objet et devant alors implémenter tous les mécanismes de la programmation objet. En effet, l'approche SMA représente à mon sens une technique de haut niveau avec laquelle aborder des problèmes spécifiques, et en l'état actuel, nous somme obligés de réimplémenter cette technique à chaque nouveau problème.
Des considérations techniques de bas niveau (choix d'utiliser des threads par exemple) ont ainsi dû être traitées avec des conséquences importantes à tous les niveaux d'implémentation, ainsi que sur les stratégies d'auto-organisation. Il a fallu alors traiter tous les problèmes inhérents à la simultanéité et au temps réel, et par conséquence les erreurs en découlant, la gestion des temps d'attente et tout simplement l'exigence en temps processeur de l'ensemble du système. A cette lourde tâche se rajoute la difficulté importante de traduction des comportements décrits avec la métaphore sociale inhérente aux SMA, en des implémentations, au final, techniquement très éloignées. En conséquence, il a fallu faire face sans cesse à des effets de bord non souhaités, à des mises à jour complexes au sein des agents et entre les agents, à la prise en compte, au sein des différents modules composant un agent, de la moindre modification, autant initiée par l'agent lui-même que provenant de l'autre bout de l'organisation, et ainsi de suite.
Tout ceci nous a montré que le problème aurait certainement dû être abordé dans un cadre plus restrictif, simplifié et schématique, nous permettant alors de nous focaliser sur les mécanismes d'auto-organisation, qui représentent l'aspect le plus important pour aborder la programmation émergente et les nouveaux types de problèmes qui nous intéressent. Mais nous n'avions pas encore les connaissances nécessaires sur le problème pour nous permettre des simplifications et nous avons donc envisagé un système proche des systèmes naturels fonctionnant par auto-organisation.

Les mécanismes d'auto-organisation, la coopération et les SNC
La théorie AMAS et la technique associée basée sur des SMA fonctionnant par auto-organisation coopérative insistent plus particulièrement sur trois points permettant au système d'atteindre l'adéquation fonctionnelle : la détection des situations non coopératives, leur résorption, et l'attitude continuellement coopérative (au mieux possible) des agents. Le problème de la programmation émergente, par ses caractéristiques particulières et parce que la théorie AMAS n'avait jamais été confrontée à ce type de problèmes, nous a également permis de poursuivre nos réflexions sur les fondements de la théorie et ses applications.
Tout d'abord, la théorie pose comme prérequis indispensables à l'auto-organisation, l'identification et la détection exhaustive des SNC pouvant apparaître dans un système, ceci bien sûr localement au niveau des agents. Par expérience, nous convenions que cette détection et cette identification constituaient une part importante du travail de conception et apportaient déjà de nombreuses informations pour leur résorption. Dans EPE, les SNC ont également une place importante dans les mécanismes d'auto-organisation, mais les informations disponibles sur ces SNC ne donnent que très peu d'informations sur les possibilités de résorption. Considérons par exemple la SNC indiquant qu'un agent est dans une situation bloquante dans laquelle il ne reçoit pas de donnée de ses entrées. L'agent ne possède aucune information supplémentaire. Il est donc réduit à spéculer sur les causes, attendre une éventuelle résorption par ses partenaires, et finalement changer de partenaires, sans pour autant savoir lequel était responsable et si son acte ne produit pas plus de problème qu'il n'en résout. Ce manque d'information est encore plus flagrant avec la SNC principale, celle de l'environnement : elle indique que la valeur produite n'est pas la bonne, ou bien, dans la version plus informée, que cette valeur est trop grande ou trop petite. Mais cela constitue là aussi la seule information disponible. Quid de la localisation du problème, des causes, des agents responsables, d'autres agents plus pertinents, de changements collectifs indiqués ? Nous pouvons donc considérer que dans certains problèmes, la détection de SNC peut être très simple et n'aider que très peu à la convergence vers la solution.
Comme tout le système est responsable de la valeur produite, cette difficulté se transmet alors sur la résorption. Et les explorations difficiles des mécanismes d'auto-organisation ont montré que le manque d'information, ainsi que l'extrême généricité des agents-instructions et la distance importante, comme la différence de niveaux, entre les buts locaux et le but global, rendent cette résorption extrêmement difficile. Ce à quoi vient se rajouter la nature discontinue du parcours de l'espace de recherche. Nous avons contré cela en introduisant des mécanismes permettant aux agents de s'approprier localement une traduction du but global et d'essayer collectivement de satisfaire au mieux leurs nouveaux buts.
Cette satisfaction collective est habituellement résolue par la notion de coopération qui pousse un agent, non pas à ce sacrifier de façon altruiste, mais d'essayer de satisfaire son propre but, tout en satisfaisant au mieux les buts des autres, ou d'empiéter le moins possible sur les leurs. Ici, cela a pris la forme d'une mesure de préjudice et de réflexions relativement complexes, comparés à la granularité des agents, quant aux préjudices infligés supposés en fonction des choix de l'agent pour la réorganisation. La notion de préjudice avait déjà été utilisée sous des formes légèrement différentes dans d'autres applications, mais pas de façon aussi généralisée et importante, en réduisant le rôle de la coopération (vu de façon positive) pratiquement à la propagation des informations. Mais ce traitement du préjudice nous apparaît en fait comme une forme indirecte de la coopération : imposer le moins de préjudice est plus coopératif.

Auto-organisation et émergence
Sur un plan plus théorique, nous avons également récolté de ce travail une connaissance plus précise des notions d'auto-organisation et d'émergence, ainsi que comment et dans quel cadre les utiliser. Dans l’exemple des termites (cf.  REF _Ref71960367 \w \h  \* MERGEFORMAT Chapitre I – partie  REF _Ref69907343 \r \h  \* MERGEFORMAT 2.2), j’expliquais qu’une partie des mécanismes était fondée sur la notion d’émergence (et produisaient la majeure partie de la termitière comme les arches, les piliers, les murs, les salles…), alors qu’une autre était guidée presque explicitement par le but (la forme en cercles concentriques de la structure finale). En effet, dans ce deuxième cas, la reine (considérée externe au système constitué des termites ouvriers) indique par des phéromones où les termites ouvriers doivent déposer en priorité les matériaux. Ceci constitue donc une information explicite pour le système, quant à l’obtention des structures circulaires.
Si nous ramenons ceci en généralisant aux systèmes artificiels, nous pouvons distinguer des mécanismes internes au système fonctionnant sur les bases de l’émergence (i.e. produisant un résultat émergent) et d’autres qui sont explicitement guidés (i.e. disposant d’une information de type "comment"). Lorsqu'une telle information est disponible de façon réaliste (et pas seulement dans un contexte restrictif), cette utilisation sera infiniment plus efficace qu'une approche basée sur l'émergence. Mais la particularité des problèmes qui nous intéressent est justement de ne fournir que très difficilement des informations de ce type. Le problème de la programmation émergente le montre très clairement : à aucun moment nous ne pouvons disposer d'information sur comment les agents-instructions doivent s'agencer. Si nous le pouvions, nous pourrions écrire le programme directement. Si nous faisions un parallèle avec l'exemple des termites, cette information équivaudrait à la phéromone émise par la reine et l'organisation finale, aux formes circulaires.
Mais la notion d'émergence et d'auto-organisation n'exclut aucunement des facteurs externes au système comme déclencheur, influence, ou guide des phénomènes produits. Il existe certes des phénomènes émergents obtenus par une sorte d'auto-organisation "pure", aucunement contrainte par l'extérieur du système (comme les accumulations dans l'exemple des termites résultant uniquement des dépôts de phéromones de termites mêmes). Mais comme nous nous intéresserons à des systèmes artificiels interagissant avec leurs environnements et dont l'environnement (par exemple l'utilisateur) contraint le fonctionnement, nous ne pouvons nous restreindre à ce type de mécanismes. Si nous reprenons l'exemple des cellules de Bénard (cf.  REF _Ref71960367 \w \h  \* MERGEFORMAT Chapitre I – partie  REF _Ref71368444 \r \h 1.5.1), qui décrit l'apparition de sens de circulation localisés des fluides, visible alors de dessus comme des cellules hexagonales. Ces mouvements de convection sont bien sûr initiés par l'augmentation de température et tout le long de la durée de vie du phénomène observé, il est entretenu par cette température élevée au fond du récipient qui "oblige" les masses chaudes à se frayer un "chemin" vers le haut. La température et les lois générales de la physique sont donc bien un guide pour le système. Mais elles n'indiquent aucunement au système comment effectuer ces mouvements. Or, justement, c'est ce comment qui produit le phénomène observé et qui est alors dit émergent.
Revenons alors à EPE et aux mécanismes d'auto-organisation tels qu'ils sont décrits pour l'exemple élémentaire. L'environnement "impose", en quelque sorte, au système, par les mécanismes d'accaparement de but, de produire une valeur plus grande ou plus petite. Mais à aucun moment cela n'indique aux agents-instructions comment y parvenir. Seuls les mécanismes internes aux agents, utilisant des informations locales, permettent de répondre aux contraintes de façon à effectivement produire le but souhaité par l'environnement. Ce sont donc bien réellement des mécanismes basés sur le concept d'émergence.

Perspectives
Les simplifications du problème de la programmation émergente (réduction à un sous-groupe d'agents pour des calculs sur les entiers), nécessaires pour pouvoir aborder un projet aussi ambitieux, et les nombreuses difficultés rencontrées, n'ont pas permis de pousser plus loin le concept (du moins expérimentalement). Notamment en termes d'exploration de types différents d'instructions (plus typiques de la programmation par exemple), de fonctionnalités plus poussées pour le système et donc par conséquent pour l'environnement de programmation, ou de problèmes à traiter (problèmes réels par exemple).

Vers une généralisation à un langage complet
Au vu de la difficulté de l'objectif général, le temps a manqué pour explorer méthodiquement d'autres instructions et leurs fonctionnements (surtout les mécanismes d'auto-organisation). Des réflexions ont cependant eu lieu pour, au moins, vérifier la faisabilité. Je vais en présenter un extrait ici en décrivant quelques agents supplémentaires (tout du moins une version possible) ainsi que la factorielle avec un "vrai" algorithme itératif, ce qui donnera une idée, je l'espère, de la richesse et de la viabilité du concept de programmation émergente à base de SMA.
Tout d'abord, puisque nous nous plaçons dans le cadre des programmes impératifs, nous avons besoin de manipuler la notion de séquentialité, et ceci est effectué au travers d'un agent qui va d'abord demander une valeur à sa première entrée, puis à sa seconde entrée mais seulement quand il a reçu une valeur de la première. Puisque dans un langage impératif, l'exécution d'une instruction ou d'un sous-programme ne renvoie pas forcément une donnée, nous rajoutons un type de valeur abstrait (que nous appellerons "Done") signifiant simplement la terminaison de l'exécution de l'instruction ou du sous-programme (à l'image du type "Unit()" dans le langage CAML par exemple). La demande de valeur déjà présente dans EPE peut alors symboliser une demande d'exécution de l'instruction. Avec ces quelques rajouts, nous pouvons alors spécifier les agents suivants :
AgentProg (noté "Prog"): l'agent symbolisant l'exécution du programme. Il représente en quelque sorte le premier "tic" d'horloge.
AgentSequence (noté ";"): l'agent représente la séquentialité ou la continuation. Il fournit le type Done en sortie (un autre agent peut donc lui demander de s'exécuter, notamment l'AgentProg) et possède deux entrées auxquelles il va successivement demander une valeur de type Done. Il ne demande la valeur à la seconde seulement après réception de Done de la part de la première.
AgentIfThenElse (noté "IfThenElse"): l'agent représentant l'instruction "If-Then-Else", i.e. le branchement en fonction d'un test. L'agent produit le type Done en sortie, possède une entrée contrôle de type Boolean qui représente le test au sein de l'instruction, et deux entrées de type Done. Il en choisira une à laquelle demander une valeur en fonction du résultat du test.
AgentWhile (noté "While"): l'instruction "While", i.e. la boucle ou répétition. Une sortie Done, une entrée contrôle qui représente la condition d'arrêt, et une entrée Done à laquelle il demande une valeur tant que son test est vrai.
AgentVariable (noté "x", où x est le nom de la variable): l'agent représentant une variable. Il possède une entrée sur laquelle il peut recevoir une valeur et une sortie pouvant fournir une valeur, toutes deux d'un type dépendant du type de la variable. Cet agent a un fonctionnement un peu particulier comparé aux autres agents EPE déjà spécifiés : il met à jour continuellement la valeur qu'il représente en fonction des valeurs reçues sur son entrée (il ne demande pas explicitement de valeurs à son entrée). Cette valeur d'entrée est en fait fournie par un agent d'affectation décrit à la puce suivante. De plus, comme une variable donnée est représentée par un agent unique, il peut recevoir des données de plusieurs agents d'affectation sur la même entrée. Ensuite, il peut bien sûr posséder plusieurs sorties auxquelles il fournit de façon désynchronisée la valeur qu'il représente (dès qu'un agent lui demande une valeur, il la lui fournit).
AgentAssignment (noté ":="): l'agent d'affectation. Cet agent récupère une valeur d'un autre agent ou de l'environnement, et la fournit à un AgentVariable. Cet agent possède également une sortie Done pour savoir quand effectuer cette affectation. (Note 1 : comme cela représente une sorte de contrôle, je le symboliserai par une "entrée contrôle" sur les figures, bien que ce soit une sortie, pour clarifier les schémas. Note 2 : à cause de la représentation par flux de données, la variable affectée se trouve à droite de l'instruction, i.e. à l'envers par rapport à la programmation classique).
AgentReturn (noté "return"): l'agent de renvoi de valeurs pour une fonction. A la fin de l'exécution d'un ensemble d'instructions, cet agent renvoie une valeur, généralement issue d'une variable, vers l'environnement ou une autre partie du programme (ayant par exemple appelé ce sous-ensemble d'instructions). Comme pour l'AgentAssignment, la sortie Done représente une sorte de contrôle pour autoriser l'exécution (représentée là aussi par une "entrée contrôle").
AgentMinus (noté "-"): le pendant de l'agent d'addition qui réalise la soustraction de deux valeurs, la seconde entrée soustraite à la première.
Avec ces agents supplémentaires et leurs fonctionnements spécifiques, nous pouvons réécrire la factorielle itérative complète sous une forme réellement calquée sur la programmation impérative classique. Prenons l'algorithme suivant :
factorielle (x) {
if (x = 0)
r := 1;
else {
r := x;
x := x-1;
while (x > 0) {
r := r*x;
x := x-1;
}
}
return r;
}

La  REF _Ref71532353 \h Figure 42 représente cette organisation. Bien sûr, la visualisation sous forme de graphe est peu lisible, mais pour les agents, cela correspond simplement à la gestion d'un petit nombre d'accointances par agent. Il semble donc tout à fait possible de décrire n'importe quel programme informatique avec ces agents-instructions. Leur attribuer des comportements d'auto-organisation afin qu'ils atteignent par eux-mêmes cette organisation me paraît cependant d'un autre ordre de difficulté. Il faudra alors transposer les comportements des agents étudiés dans EPE aux particularités des nouveaux agents afin d'y introduire également les notions de coopération nécessaires.

Vers un environnement complet
EPE ne réunit que les fonctionnalités et outils indispensables aux expérimentations dans le contexte réducteur de ce travail. Pour explorer plus avant la programmation émergente, EPE, qui représente l'environnement de néo-programmation au travers duquel le néo-programmeur observe et influence le système en devenir, devra également évoluer. Tout d'abord, les outils d'observation devront évoluer pour représenter efficacement un nombre plus important d'agents et donc des organisations nettement plus complexes. La simple représentation dans un plan ne suffira donc plus. On peut imaginer des outils graphiques plus évolués permettant des "vues" spécifiques, des filtres en fonction de ce que l'utilisateur veut observer, etc… Des informations sur l'état des agents, la dynamique, les réorganisations, les SNC, les changements, et ainsi de suite, devront être consultables par des onglets, des tables et des graphiques plus ergonomiques que ne l'est l'actuel "log" textuel (journal de bord) des agents.
Ensuite, comme les programmes seront plus évolués, la fonction réalisée le sera certainement aussi. Ainsi, les interactions avec l'environnement devront s'enrichir. Cela commencera par plus d'échanges de données (plusieurs agents d'entrée et de sortie), puis par des échanges dynamiques (demandes à l'utilisateur en cours d'exécution), puis par des interactions multimodales (jugement du résultat graphique produit, du son émis, d'un ensemble complexe de comportements, notamment pour un robot par exemple).
Mais comme le grand problème reste le manque d'informations disponibles pour les agents pour évoluer vers un but spécifique souhaité par le néo-programmeur, il paraît probable que son rôle ne se limitera pas à celui d'un critique, mais qu'il devra participer plus activement à la création du système. On peut ainsi imaginer qu'il "sculpte" le programme en même temps que celui-ci s'auto-organise, un peu à l'image de la phéromone émise par la reine dans l'exemple des termites. Il pourrait alors indiquer certaines parties d'organisation qui lui semblent plus suspectes, ou plus responsables des résultats erronés du problème, voire isoler une partie de l'organisation pour lui faire apprendre un sous-problème spécifique avant de la réintroduire au sein du système (par exemple produire une structure itérative incomplète avant de la réintroduire dans le système). Il s'agit alors de permettre à des sous-ensembles d'agents de se considérer plus liés et de former un groupe avec un rôle spécifique, mais ce seront des notions porteuses de sens pour les agents eux-mêmes, relativement abstraites et évoluant au cours du temps, et non un cadre strict imposé par le néo-programmeur indiquant quelques changements pré-établis possibles.
Finalement, l'obstacle le plus dur à l'élaboration d'un environnement de programmation émergent réaliste sera le problème de l'apparition et de la suppression d'agents dans le système. En effet, le programmeur classique n'a aucune idée précise des types d'instructions et des quantités nécessaires au départ. De même, le système en devenir devra, en fonction de ses besoins, pouvoir se rajouter des agents, ou supprimer ceux étant inutiles. On peut imaginer des mécanismes permettant aux agents, après avoir cherché des possibilités au sein du système en l'état, de demander à l'environnement de programmation d'introduire un nouvel agent. De nombreuses stratégies sont ici aussi à explorer.

Des exemples réels
Les quelques problèmes auxquels nous avons confronté la programmation émergente dans ce travail ne lui rendent certainement pas justice : la fonction factorielle et les fonctions de l'exemple élémentaire. Ce sont surtout des problèmes dont nous connaissons déjà les solutions, qui sont d'ailleurs évidentes pour un humain. Mais cette simplification était nécessaire pour notre compréhension et la mise en place des mécanismes d'auto-organisation. Voilà quelques exemples qui montreraient réellement le potentiel du concept, autant directement au travers de la programmation émergente, que de façon dérivée par ce que nous avons appelé la résolution de problèmes par émergence :
Le problème du deadlock comme décrit dans le  REF _Ref70659355 \r \h  \* MERGEFORMAT Chapitre III – partie  REF _Ref71393247 \r \h  \* MERGEFORMAT 1.3.6.3. Bien que là aussi, nous avons fini par trouver une solution efficace, il serait intéressant de comparer les performances ou simplement le programme final trouvé par une version évoluée de EPE. N'oublions pas que des scientifiques de renom ont mis près de vingt ans à découvrir cette solution.
Fonctions mathématiques complexes. A l'image de la résolution d'équation et du système de prévision de crues développés dans l'équipe, nous pourrions imaginer laisser EPE trouver des fonctions mathématiques nettement plus complexes, issues d'un calcul plus riche car disposant de toutes les instructions d'un langage de programmation.
Découverte de modèles. En fait, l'exemple précédent peut se généraliser à la découverte de modèles artificiels représentant les fonctionnements de la réalité. Par exemple, il y a certainement un lien très précis entre les quantités gigantesques de données météorologiques et les conditions météorologiques sur un endroit donné à un moment donné. Nous pourrions laisser un système tel qu'EPE rechercher ce lien.
Algorithmes de compression et d'encodage. Les algorithmes d'encodage d'images par exemple, comme le format JPEG, ne sont généralement pas de très gros programmes, mais présentent des fonctionnements mathématiquement très complexes. On pourrait imaginer laisser EPE chercher parmi les combinaisons d'instructions, celles qui résultent en une meilleure qualité d'image, ou dont l'image est la plus proche de l'originale pour une taille donnée.
Algorithme de décryptage. Pendant en quelque sorte du problème précédent, il s'agit ici de redonner du sens à un ensemble de données cryptées. Comme ce cryptage est généralement algorithmique, il suffit de trouver parmi toutes les possibilités, l'algorithme inverse (ceci est bien entendu une vision simplifiée du problème du décryptage). Cela pourrait par exemple servir à la compréhension de langues anciennes, des bouts de connaissances pouvant d'ailleurs être introduits dans le système si l'équivalent d'une pierre de Rosette est disponible.
De façon générale, tous les problèmes dont nous connaissons le résultat à obtenir, mais pas les moyens d'y arriver; notamment les problèmes de néo-computation (Ubiquitous Computing, Autonomous Computing, …).
Les problèmes NP-complets ? Nous pouvons nous poser cette question puisque la complexité exponentielle vient de la nature systématique du parcours de l'espace de recherche des algorithmes dits de cet ordre de complexité et dépendant explicitement de la fonction globale. Mais la résolution par émergence n'est-elle pas un moyen de court-circuiter le parcours et d'atteindre donc plus rapidement la solution ? Un travail théorique intéressant serait à réaliser dans ce sens là.

Ma conclusion
Je voudrais présenter, dans ces derniers paragraphes, une vue critique personnelle du travail réalisé sur la durée de ma thèse. Tout d'abord, je suis conscient de la portée restreinte pour la science des résultats présentés dans ce document : réalisation d'un environnement de programmation émergente pour un système élémentaire de quelques instructions mathématiques simples, mécanismes d'auto-organisation limités à ces quelques instructions, nombre d'instructions fixé par le programmeur, et autres restrictions pour répondre aux difficultés rencontrées. Bien sûr, j'espère avoir produit dans ce document une quantité non négligeable de données et d'informations quant au problème de la programmation émergente en particulier, et de la résolution de problèmes par émergence en général. Je me suis efforcé de clarifier le cadre d'utilisation des notions d'auto-organisation et d'émergence, de préciser les caractéristiques très différentes suivant la nature des problèmes que nous voulions traiter, et d'expliciter du mieux possible le concept de la programmation émergente, et plus précisément dans l'optique de l'utilisation d'un système multi-agent basé sur des mécanismes d'auto-organisation avec comme clé de voûte, la coopération. En particulier, j'ai voulu insister sur une description détaillée de ces mécanismes afin qu'elle serve de terreau pour les réflexions futures.
Mais au final, le résultat le plus probant concerne, égoïstement, mon enrichissement scientifique personnel. Le travail de réflexion et d'expérimentation, les échecs et les explorations successives, m'ont apporté une appréhension du problème de la programmation émergente incomparablement plus fine que lors de mes premières approches intuitives. Et au-delà du problème concret, l'exploration des mécanismes nécessaires m'a conduit à considérer en profondeur le concept d'auto-organisation, ses fonctionnements particuliers, ses dynamiques incontrôlables, et son cadre restrictif. Mais aussi sa puissance pour répondre à des problèmes dont la réelle difficulté m'échappait alors. J'ai alors acquis une vision plus globale des problèmes difficiles/complexes et de la démarche de résolution, ou plutôt des démarches, car les approches sont multiples. Et c'est le fil rouge de l'émergence, que j'ai suivi au cours de mes pérégrinations, que j'ai vu se consolider entre mes mains.
Au final, je suis plus que jamais convaincu de la nécessité de continuer à explorer la voie de l'émergence.

Glossaire
AMAS : La théorie AMAS (Adaptive Multi-Agent System) constitue le fondement théorique de cette thèse et présente une approche de la conception de systèmes complexes adaptatifs par émergence. Sa technique associée se fonde sur des systèmes multi-agents basés sur des mécanismes d'auto-organisation coopératifs.
Computation / système computationnel : (de l'anglais compute) Ce néologisme fait référence au processus mis en œuvre pour exécuter un algorithme.
Environnement, Environnement et Environnement : Le terme "environnement" fait référence dans ce travail à trois concepts différents :
L'environnement de programmation pour la programmation classique : l'outil au travers duquel le programmeur conçoit ses programmes.
L'environnement de programmation émergente ou néo-programmation : l'outil au travers duquel le néo-programmeur observe et influence le système de programmation émergente en devenir.
L'environnement du système : l'environnement immédiat du système en devenir (le SMA), avec lequel il est effectivement en interaction.
Feedback : Tout type d'information renvoyée par l'environnement du système au système suite à une activité de celui-ci. Le système modifie alors son comportement pour prendre en compte ce "jugement".
Néo-programmeur / Néo-programmation : Contrairement au programmeur classique, le programmeur utilisant le concept de programmation émergente n'explicite pas le système produit mais influence son auto-organisation. Pour lever l'ambiguïté, nous l'appelons néo-programmeur et son activité, la néo-programmation.
SNC (ou NCS) : Une Situation Non Coopérative (ou Non Cooperative Situation) est détectée par une entité lorsque l'état de cette entité va à l'encontre de la définition de coopération posée par la théorie AMAS. Il s'agit en fait d'une sorte de détection d'erreurs ou de conflits.
Template : (plan, modèle, schéma) Terme utilisé pour préciser que les mécanismes de réorganisation au sein d'un groupe d'entités se fondent sur une information explicite leur indiquant leur comportement et permettant la production d'un comportement collectif spécifique (qui n'est alors pas émergent).
Bibliographie
Note sur la bibliographie : pour une meilleure lisibilité, j'ai partagé les références en fonction du thème ou du chapitre dans lequel elles sont utilisées. Comme quelques références font partie de plusieurs thèmes ou sont utilisées dans différents chapitres, elles peuvent être listées plusieurs fois.

Problématique
[Bonabeau 97] Bonabeau E, Theraulaz G.,
"Auto-organisation et comportements collectifs : la modélisation des sociétés d’insectes",
Auto-organisation et comportement, Editions Hermès, 1997.

[Bourjot 99] Bourjot, C., Chevrier, V., Bernard, A., Krafft, B.,
"Coordination par le biais de l’environnement : une approche biologique",
Journées Francophones Intelligence Artificielle Distribuée et Systèmes Multi-Agents JFIADSMA ’99, Editions Hermès 1999.

[Camazine 02] Camazine, S., Deneubourg, J.-L., Franks, N., Sneyd, J., Theraulaz, G., Bonabeau, E.,
"Self-organization in biological systems",
Princeton University Press, 2002.

[Drogoul 01] Drogoul, A., Servat, D,
"Informatique diffuse: vers un monde fait d'agents?",
Actes des JFIADSMA'01 (Fondements des systèmes multi-agents : modèles, spécifications formelles et vérification), Hermés, Paris, France, 2001.

[Horn 01] Horn, P.,
"Autonomic computing: IBM’s Perspective on the State of Information Technology",
http://www.ibm.com/research/autonomic, 2001.

[Searle 95] Searle, J. R.,
"La redécouverte de l'esprit",
Editions Gallimard, 1995.

[Theraulaz 97] Theraulaz, G., Spitz, F.,
"Auto-organisation et comportement",
Hermès, Paris, 1997.

[Weiser 96] Weiser, M.,Brown, J. S.,
"Designing Calm Technology",
PowerGrid Journal, Vol1. N°1, http://powergrid.electriciti.com/1.01, 1996.


Emergence
[Ali 97] Ali, S. M., Zimmer, R.M.,
"The question concerning emergence",
CASYS'97, Abstract Book, First International Conference on Computing Anticipatory Systems, CHAOS, 1997.

[Atlan 00] Atlan, H.,
"La finalité",
Hors série Science&Avenir, 2000.

[Atlan 79] Atlan, H.,
"Entre le cristal et la fumée",
Seuil 1979.

[Bonabeau 97] Bonabeau E, Theraulaz G.,
"Auto-organisation et comportements collectifs : la modélisation des sociétés d’insectes",
Auto-organisation et comportement, Editions Hermès, 1997.

[Brunner 02] Brunner, K.A.,
"What's Emergent in Emergent Computing",
Proceedings of the,EMCSR, R. Trappl (ed.), 2002.

[Capera 03] Capera, D., Georgé, J-P., Gleizes, M-P., Glize, P.,
"The AMAS theory for complex problem solving based on self-organizing cooperative agents",
TAPOCS, Linz, Autriche, 2003.

[Forrest 90] Forrest, S.,
"Emergent computation: self-organizing, collective, and cooperative phenomena in natural and artificial computing networks",
Proceedings of the ninth annual CLNS conference, 1990.

[Forrest 91] Forrest S.,
"Emergent computation : Self-organizing, Collective, and cooperative phenomena in Natural and Artificial Computing networks",
Special issue of Physica D ,MIT Press / North-Holland, 1991.

[Georgé 03b] Georgé, J-P., Gleizes, M-P., Glize, P.,
"Conception de systèmes adaptatifs à fonctionnalité émergente : la théorie Amas",
Revue RIA n°4/2003, 2003.

[Gleick 87] Gleick, J.,
"La Théorie du Chaos, vers une nouvelle science",
Champs Flammarion, 1987.

[Goldstein 99] Goldstein, J.,
"Emergence as a Construct : History and issues",
Emergence Volume 1, Issue 1, pp 49-71, 1999.

[Grumbach 97] Grumbach, A.,
"A propos d'émergence. Emergence…ou…explication",
Intellectica Emergence and explanation 1997/2 n°25, ISSN n°0984-0028 185-194, 1997.

[Holland 97] Holland, J. H.,
"Emergence – from Order to Chaos",
Addison-Wesley, 1997.

[Kim 00] Kim J.,
" HYPERLINK "http://www.erudit.org/erudit/philoso/v27n01/kim/kim.pdf" L'émergence, les modèles de réduction et le mental",
Philosophiques, vol.27, n° 1, 2000

[Langton 90] Langton C.,
"Computation at the edge of chaos, Phase transition and emergent computation",
Physica D Vol.4, 1990

[Lewes 75] Lewes, G.H.,
"Problems of life and mind",
London : Kegan Paul, trench, Turbner, &Co, 1875.

[McLaughlin 80] McLaughlin, B. P., Varela F.,
"Autopoiesis and Cognition: The Realization of the Living".
London. D. Reidel Publishing Company Holland, 1980.

[Odell 00] Odell, J.,
"Agents (Part 2): Complex Systems",
Executive Report, Volume 3, Number 6, Cutter Consortium, Arlington, MA, 2000.

[Searle 95] Searle, J. R.,
"La redécouverte de l'esprit",
Editions Gallimard, 1995.

[Van de Vijver 97] Van De Vijver, G.,
"Emergence et explication",
Intellectica : Emergence and explanation, 1997/2 n°25, ISSN n°0984-0028 185-194, 1997.


Auto-organisation et systèmes multi-agents
Auto-organisation

[Autopoietica www] Encyclopaedia Autopoietica, The primary Internet nexus on the subjects of autopoiesis and enaction (the theories of Humberto Maturana and Francisco Varela -- the Biology of Cognition and Enactive Cognitive Science). www.informatik.umu.se/~rwhit/AT.html

[Ball 99] Ball, P.,
"The Self-Made Tapestry",
Oxford Press, 1999.

[Bonabeau 97] Bonabeau, E., Theraulaz, G., Deneubourg, J.-L., Aron, S., Camazine, S.,
"Self-organization in social insects",
Trends in Ecology and Evolution 12: p. 188-193, 1997.

[Heylighen 99] Heylighen F.,
"The Science of Self-organization and Adaptivity",
The Encyclopedia of Life Support Systems, 1999.

[Prigogine 77] Prigogine, I., Nicolis, G.,
"Self Organization in Non-Equilibrium Systems",
(Chaps. III and IV), J. Wiley and Sons, New York, 1977.

[Thompson 17] Thompson, D'A. W.,
"On Growth and Form",
Cambridge University Press, 1942, first published in 1917.

[Turing 52] Turing, A.,
"On the chemical basis of morphogenesis",
Phil. Trans. Roy. Soc.London B 237, p. 37-72, 1952.


Systèmes multi-agents

[Beurier 03] Beurier, G., Simonin, O., Ferber, J.,
"Un modèle de système multi-agent pour l'émergence multi-niveau",
Actes des JFSMA03, pp. 235-247, nov. 2003.

[Carabelea 03] Carabelea, C., Boissier, O., Florea, A.,
"Autonomie dans les systèmes multi-agents. Essai de classification",
Actes des JFSMA03, pp. 191-205, nov. 2003.

[Cardon 00] Cardon, A., Guessoum, Z.,
"Système multi-agents adaptatifs",
Actes des JFIADSMA00, pp. 100-116, oct. 2000.

[Chevrier 02] Chevrier, V.,
"Contributions au domaine des systèmes multi-agents",
Mémoire d'habilitation à diriger des recherches, soutenue le 3 janvier 2002 à l'Université Henri Poincaré, Nancy 1, 2002.

[Drogoul 01] Drogoul, A., Servat, D,
"Informatique diffuse: vers un monde fait d'agents?",
Actes des JFIADSMA'01 (Fondements des systèmes multi-agents : modèles, spécifications formelles et vérification), Hermés, Paris, France, 2001.

[Drogoul 00] Drogoul, A.,
"Systèmes multi-agents situés",
Mémoire d'habilitation à diriger des recherches, soutenue le 17 mars 2000 à Université Paris 6, 2000.

[Ferber 95] Ferber, J.,
"Les systèmes Multi-Agents – Vers une intelligence collective",
InterEditions, 1995.

[Georgé 04] Georgé, J.-P., Edmonds, B., Glize, P.,
"Making Self-Organizing Adaptive Multi-Agent Systems Work - Towards the engineering of emergent multi-agent systems",
Methodologies and Software Engineering for Agent Systems, F. Bergenti, M-P. Gleizes, and F. Zambonelli, editors, Kluwer Publishing, 2004.

[Georgé 03b] Georgé, J-P., Gleizes, M-P., Glize, P.,
"Conception de systèmes adaptatifs à fonctionnalité émergente : la théorie Amas",
Revue RIA n°4/2003, 2003.

[Georgé 03c] Georgé, J.-P.,
"The AMAS Theory for Complex Problem Solving based on Self-Organizing Cooperative Agents",
First European Workshop on Multi-Agent Systems (EUMAS), 2003.

[Guessoum 03] Guessoum, Z.,
"Modèles et architectures d'agents et de systèmes multi-agents adaptatifs",
Mémoire d'habilitation à diriger des recherches, soutenue le 6 décembre 2003 à l'Université Pierre et Marie Curie, 2003.

[Hassas 03] Hassas, S.,
"Systèmes complexes à base de Multi-Agents situés",
Mémoire d'habilitation à diriger des recherches, soutenue le 16 décembre 2003 à l'Université Claude Bernard - Lyon 1, 2003.

[Mataric 96] Mataric, M. J.,
"Learning in Multi-Robot Systems",
Adaptation and Learning in Multi-Agent Systems, Gerhard Weiss and Sandip Sen, eds., Lecture Notes In Artificial Intelligence (LNAI), 1042, Springer-Verlag, p. 152-163, 1996.

[Mathieu 02] Mathieu, P., Routier, J.-C., Secq, Y.,
"Dynamic organization of multi-agent systems",
Proceedings of AAMAS 2002, p. 451-452, 2002.

[MIT www] Site web de l'Artificial Intelligence Laboratory du Massachusetts Institute of Technology, www.ai.mit.edu.

[Müller 02] Müller, J.-P.,
"Des systèmes autonomes aux systèmes multi-agents : Interaction, émergence et systèmes complexes",
Mémoire d'habilitation à diriger des recherches, soutenue le 8 novembre 2002 à l'Université Université Montpellier II, 2002.

[Odell 02] Odell, J.,
"Agents and Complex Systems",
Journal of Object Technology 1(2), p. 35-45, 2002.

[Parunak 01] Parunak, H. Van D., Brueckner, S.,
"Entropy and self-organization in multi-agent systems",
Proceedings of Autonomous Agents'01, p. 124-130, 2001.

[Servat 99] Servat, D., Leonard, J., Perrier, E., Treuil, J.P.,
"The Rivage Project : a new approach for simulating runoff dynamics",
Modelling of transport processes in soils, 24-26 Novembre 1999, Leuven, J.Feyen & K.Wiyo.Eds, Wageningen Pers, The Netherlands, pp.592-601, 1999.

[SFI www] Site web du Santa Fe Instiute, www.santafe.edu.

[Steels 99] Steels, L.,
"The Spontaneous Self-organization of an Adaptive Language",
Koichi Furukawa and Donald Michie and Stephen Muggleton, editors, Machine Intelligence 15, pages 205—224, St. Catherine's College, Oxford: Oxford University Press, 1999.

[Vasirani 03] Vasirani, M., Mamei, M., Zambonelli, F.,
"Morphogenesis of cooperative robots with minimal capabilities: preliminary experiments",
Proceedings of The First European Workshop on Multi-Agent Systems (EUMAS03), Oxford University, 18-19 december 2003.

[Zambonelli 04] Zambonelli, F., Gleizes, M.P., Mamei, M., Tolksdorf, R.,
"Spray Computers: Frontiers of Self-Organization",
1st International Conference on Autonomic Computing, New York (NY), May 2004.


Techniques diverses
Calcul évolutionnaire

[De Jong 75] De jong, K. A.,
"An Analysis of the behaviour of a class of genetic adaptive systems",
Ph. D. dissertation, University of Michigan, Ann Arbor, 1975.

[Fogel 66] Fogel, L. J., Owens, A.J., Walsh, M.J.,
"Artificial Intelligence through Simulated Evolution",
New York: Wiley, 1966.

[Goldberg 89] Goldberg, D. E.,
"Genetic algorithms in search, optimization and machine learning",
Reading, MA : Addison-Wesley, 1989.

[Holland 75] Holland, J. H.,
"Adaptation in natural and artificial systems",
Ann Arbor, University of Michigan Press. (Second edition : Cambridge, MA : MIT Press, 1992), 1975.

[Koza 92] Koza, J.R.,
"Genetic Programming: On the Programming of Computers by Means of Natural Selection",
The MIT Press, 1992.

[Koza 94] Koza, J.R.,
"Genetic Programming II: Automatic Discovery of Reusable Programs",
The MIT Press, 1994.

[Koza 99] Koza, J.R., Bennett, F. H., Andre, D., Keane, M. A.,
"Genetic Programming III: Darwinian Invention and Problem Solving",
Morgan Kaufmann, 1999.

[Koza 03] Koza, J.R., Keane, M. A., Streeter, M. J., Mydlowec, W., Yu, J., Lanza G.,
"Genetic Programming IV: Routine Human-Competitive Machine Intelligence",
Kluwer Academic Publishers, ISBN 1-4020-7446-8, 2003.

[Lutton 03] Lutton, E.,
"Algorithmes génétiques et algorithmes évolutionnaires",
Traité d'Informatique Industrielle, 2003.

[Ratle 03] Ratle, A., Sebag, M.,
"A Novel Approach to Machine Discovery: Genetic Programming and Stochastic Grammars",
Stan Matwin and Claude Sammut, eds, Proceedings of Inductive Logic Programming, p. 207-222, Springer Verlag., 2003.

[Rechenberg 73] Rechenberg, I.,
"Evolutionsstrategie: Optimierung technischer Systeme nach Prinzipien der biologischen Evolution",
Stuttgart: Fromman-Holzboog, 1973.

[Schwefel 77] Schwefel, H.-P.,
"Numerische Optimierung von Computer-Modellen mittels der Evolutions-Strategie",
Birkhaeuser, Basel, 1977.

[Sims 94] Sims, K.,
"Evolving virtual Creatures",
Computer Graphics 28, 15-34, 1994.



Réseaux neuronaux

[Anderson 95] Anderson, J. A.,
"An introduction to neural networks",
Cambridge, MA : MIT Press, 1995.

[Farley 54] Farley, B. G., Clark, W. A.,
"Simulation of self-organizing systems by digital computer",
Trans.IRE, Vol. PGIT-4, pp. 76-84, 1954.

[Fukushima 75] Fukushima, K., Sei, M., Takayuki, I.,
"Neocognitron: an neural network model for a mechanism of visual pattern recognition",
IEEE Transactions on Systems, Man, and Cybernetics SMC-13, p. 826-834, 1975.

[Grossberg 88] Grossberg, S. A.,
"Neural Networks and Natural Intelligence",
MIT Press, Cambridge, MA, 1988.

[Hertz 91] Hertz, J., Krogh, A., Palmer, R.G.,
"Introduction to the theory of neural computation",
Redwood City, CA : Addison-Wesley, 1991.

[Klopf 72] Klopf, A. H.,
"Brain Function and Adaptive Systems - A Heterostatic Theory",
L. G. Hanscom Field, Bedford, Mass: Air Force Cambridge Research Laboratories Special Report No. 133 (AFCRL-72-0164 and DDC Report No. AD 742259), 1972.

[McCulloch 43] McCulloch, W. S., Pitts, W. H.,
"A logical calculus of the ideas immanent in nervous activity",
Bulletin of Mathematical Biophysics, 5, p. 115-133, 1943.

[Minsky 69] Minsky, M., Papert, S.,
"Perceptrons", Introduction, p. 1-20: "Perceptrons cannot learn arbitrary rules",
Cambridge MA: MIT Press, 1969.

[Pfeifer 01] Pfeifer, R., Scheier, C.,
"Understanding Intelligence",
MIT Press, 2001.

[Rochester 56] Rochester, N., Holland, J. H., Haibt, L. H., and Duda, W. L.,
"Tests on a cell assembly theory of the action of the brain, using a large digital computer",
IRE Transactions on Information Theory , 2 , p. 80-93, (reprinted in Anderson and Rosenfeld 1988), 1956.

[Rosenblat 58] Rosenblatt, F.,
"The perceptron: A probabilistic model for information storage and organization in the brain",
Psychological Review, Vol. 65, pp. 386-408, 1958.

[Werbos 74] Werbos, P. J.,
"Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences",
Doctoral Dissertation, Applied Mathematics, Harvard University, Boston, MA, 1974.

[Widrow 60] Widrow, B., Hoff, M. E.,
"Adaptive switching circuits",
IRE WESCON Convention Record: Part 4, Computers: Man-Machine Systems, p. 96-104, Los Angeles, CA, 1960.

[Fiesler 94] Fiesler, E.,
"Comparative bibliography of ontogenic neural networks",
Proceedings of the International Conference on Artificial Neural Networks (ICANN 94), volume 1, pages 793--796, Maria Marinaro and Pietro G. Morasso, editors, London, U.K., Springer-Verlag, 1994.


Autres

[Bonabeau 99] Bonabeau, E., Dorigo, M., Theraulaz, G.,
"Swarm Intelligence, from natural to artificial systems",
Oxford University Press, 1999.

[Clerc 02] Clerc, M.,
"L'optimisation par essaim particulaire : principes, modèles et usage",
RSTI-TSI, tome 21, p. 941-964, 2002.

[Colorni 92] Colorni A., Dorigo, M.,Maniezzo, V.,
"Distributed Optimization by Ant Colonies",
Proceedings of the First European Conference on Artificial Life, Paris, France, F.Varela and P.Bourgine (Eds.), Elsevier Publishing, p. 134-142, 1992.

[Daouas 94] Daouas, T., Ghedira, K., Müller, J.-P.,
"Une approche multi-agents avec recuit simulé pour l'ordonnancement dans un atelier flexible",
Rencontres nationales sur la résolution pratique de problèmes NP-complets, Montpellier, 1994.

[Dréo 03] Dréo, J., Pétrowski, A., Siarry, P., Taillard, E.,
"Métaheuristiques pour l'optimisation difficile",
Editions Eyrolles, 2003.

[Eberhart 01] Eberhart, R., Kennedy, J., Shi, Y.,
"Swarm Intelligence",
Morgan Kaufmann Publishers, 2001.

[Kennedy 95] Kennedy, J., Eberhart, R. C.,
"Particle swarm optimization",
Proceedings of IEEE International Conference on Neural Networks Vol. IV, pp. 1942-1948, IEEE service center, Piscataway, NJ, 1995.


Théorie AMAS – Technologie AMAS
[Bernon 03] Bernon C., Camps V., Gleizes M-P., Picard G.,
"Tools for Self-Organizing Applications Engineering",
First International Workshop on Engineering Self-Organising Applications (ESOA'03) Melbourne, Australia, July 2003.

[Bernon 02a] Bernon C., Gleizes M-P., Picard G., Glize P.,
"The Adelfe Methodology For an Intranet System Design",
Fourth International Bi-Conference Workshop on Agent-Oriented Information Systems AOIS-2002), 27-28 May 2002, Toronto (Ontario, Canada) at CAiSE'02.

[Bernon 02b] Bernon C., Gleizes M-P., Peyruqueou S., Picard G.,
"ADELFE, a Methodology for Adaptive Multi-Agent Systems Engineering",
Third International Workshop on Engineering Societies in the Agents World (ESAW-2002), 16-17 September 2002, Madrid. Petta P., Tolksdorf R., Zambonelli F., Eds., Springer-Verlag, LNAI 2577, p. 156-169.

[Bertalanffy 93] Bertalanffy Von, L.,
"Théorie générale des systèmes",
Editions Dunod, 1993.

[Camps 98] Camps V., Gleizes M.-P., Glize P., "Une théorie des phénomènes globaux fondée sur des interactions locales",
Actes des Sixième journées francophones IAD&SMA Pont-à-Mousson, Editions Hermès, Novembre, 1998.

[Capera 03] Capera, D., Georgé, J-P., Gleizes, M-P., Glize, P.,
"The AMAS theory for complex problem solving based on self-organizing cooperative agents",
TAPOCS, Linz, Autriche, 2003.

[Edmonds in press] Edmonds, B.,
"Simulation and Complexity - how they can relate",
In Feldmann, V. and Mühlfeld, K. (eds.) Virtual Worlds of Precision. Lit Verlag.

[Edmonds 03] Edmonds, B.,
"Against: a priori theory For: descriptively adequate computational modelling",
In The Crisis in Economics: The Post-Autistic Economics Movement: The first 600 days, Routledge, 175-179, 2003.

[Edmonds 99] Edmonds, B.,
"What is Complexity: the philosophy of Complexity per se with application to some examples in evolution",
In F. Heylighen & D. Aerts (eds.): The Evolution of Complexity, Kluwer, Dordrecht, 1-18, 1999.

[Georgé 04] Georgé, J.-P., Edmonds, B., Glize, P.,
"Making Self-Organizing Adaptive Multi-Agent Systems Work - Towards the engineering of emergent multi-agent systems",
Methodologies and Software Engineering for Agent Systems, F. Bergenti, M-P. Gleizes, and F. Zambonelli, editors, Kluwer Publishing, 2004.

[Georgé 03a] Georgé J-P., Picard G., Gleizes M-P., Glize P.,
"Living Design for Open Computational Systems",
1st International Workshop on Theory And Practice of Open Computational Systems (TAPOCS 2003) at IEEE 12th International Workshop on Enabling Technologies: Infrastructure for Collaborative Enterprises (WETICE 2003), Johannes Kepler Universitaet, Linz, Austria, 9-11 June 2003.

[Georgé 03b] Georgé, J-P., Gleizes, M-P., Glize, P.,
"Conception de systèmes adaptatifs à fonctionnalité émergente : la théorie Amas",
Revue RIA n°4/2003, 2003.

[Haken 78] Haken H.,
"Synergetics, an introduction",
Springer, Berlin. 1978.

[Lind 01] Lind, J.,
"Iterative Software Engineering for Multiagent Systems",
Volume 1994 of Lecture Notes in Artificial Intelligence, Springer Verlag, Heidelberg, 2001.

[Maturana 94] Maturana H.R., Varela F.J.,
"The tree of knowledge",
Addison Wesley, 1994.

[Maturana 97] Maturana H.,
"Emergence and supervenience",
Intellectica – Emergence and explanation, 1997.

[Rosnay 75] de Rosnay J.,
"Le macroscope - vers une vision globale",
Editions du seuil, 1975.

[Russell 95] Russel, S., Norvig, P.,
"Artificial Intelligence: a Modern Approach",
Prentice-Hall, 1995.

[Wolpert 97] Wolpert, D. H., Macready, W. G,
"No free lunch theorems for optimization", IEEE Transactions on Evolutionary Computation, 1(1):67-82, 1997.

[Wolpert 95] Wolpert, D. H., Macready, W. G,
"No free lunch theorems for search",
Tech. Rep. SFI­TR­95­02­010, Santa Fe Institute, 1995.

[Woolridge 00] Woolridge, M.,
"On the Sources of Complexity in Agent Design",
Applied Artificial Intelligence. 14(7), p. 623-644, 2000.


EPE et la Programmation Émergente
[ALife www] www.alife.org : site de la "International Society of Artificial Life".

[Dijkstra 65] Dijkstra, JE.W.,
"Solution of a problem in concurrent programming control ",
Communications of the ACM 8, 9, p 569, September 1965.

[Foisel 97] Foisel, R., Chevrier, V., Haton, J.-P.,
"Un modèle pour la réorganisation de système multi-agent",
Actes des 5èmes journées francophones IAD-SMA, pp 261-277, La Colle Sur Loup, Avril, 1997.

[Georgé 02] Georgé, J.-P.,
"Une approche de la programmation émergente : le calcul émergent",
Colloque des Doctorants de l'EDIT (Ecole Doctorales Informatique et Télécommunications), Toulouse, 2002.

[Hofman 02] Hofman, B.,
"Organisation de graphes de systèmes multi-agents coopératifs",
Rapport de stage de deuxième année d'IUT Informatique, Juin 2002.

[Kesteloot www] Kesteloot, L.,
"A Survey of Mutual-Exclusion Algorithms for Multiprocessor Operating Systems ",
www.teamten.com/lawrence/242.paper/242.paper.html, 1995.

[Knuth 66] Knuth, D.E.,
"Addition comments on a problem in concurrent programming control.",
Communications of the ACM 9, 5, p. 321-322, May 1966.

[Koza 91] Koza, J. R.,
"Evolution and co-evolution of computer programs to control independently-acting agents",
From animals to animats : proceedings of the first international conference on Simulation of Adaptative Behavior (SAB), MIT Press, 1991.

[Lamport 74] Lamport, L.,
"A new solution of Dijkstra's concurrent programming problem",
Communications of the ACM 17, 8, p. 453-455, August 1974.

[Occello 97] Occello, M., Demazeau, Y.,
"Vers une approche de conception et de description récursive en univers multi-agents",
Quinqueton, J., Thomas, M.-C., Trousse, B., editors, 5èmes Journées Francophones sur l`Intelligence Artificielle Distribuée et Systèmes Multi-Agents (JFIADSMA`97), pages 143-157, La Colle-sur-Loup, Côte d`Azur (France), April 2-4. Ed. Hermès, 1997.

[Peterson 81] Peterson, G.L.,
"Myths about the mutual exclusion problem",
Information Processing Letters 12, 3, p. 115-116, 13 June 1981.

[Yoshii 98] Yoshii, S., Ohashi, S, Kakazu, Y.,
"Modeling of Emergent Ecology for simulating adaptive behavior of universal computer programs",
From Animals to Animats 5, 1998.












 AMAS : Adaptive Multi-Agent Systems. Cf.  REF _Ref71197221 \r \h Chapitre I
 Il est à noter que le fait que le système prenne en compte le but global est différent du fait d'y introduire une connaissance du comment réaliser ce but. Cette connaissance est bien sûr inaccessible pour les problèmes qui nous intéressent.
 Deadlock = interblocage. Situation dans laquelle deux ou plusieurs processus sont dans l'incapacité de poursuivre leurs calculs car chacun est dans l'attente d'une action d'un autre.

 Livelock = quand des processus changent continuellement d'état en réponse au changement d'état d'autres processus sans pour autant être productifs. Similaire au deadlock quant à l'incapacité de progresser mais différent dans le fait que ces processus ne sont pas bloqués ou en attente de quoi que ce soit. Un exemple humain serait le cas de deux personnes se rencontrant dans un couloir étroit et se déplaçant de coté pour s'éviter mais n'arrivant pas à se synchroniser comme il faut et se gênant toujours l'une l'autre.

 Je qualifie de "meilleure" une valeur plus grande si l'agent nécessite une valeur plus grande et plus petite si l'agent nécessite une valeur plus petite.
 Il est à noter que le fait que le système prenne en compte le but global est différent du fait d'y introduire une connaissance du comment réaliser ce but. Cette connaissance est bien sûr inaccessible pour les problèmes qui nous intéressent.









PAGE 






PAGE 6




Introduction : Problématique et Programmation Émergente



Chapitre I. Le phénomène d'émergence et son utilisation



Chapitre II. Théorie AMAS – Technologie AMAS


 REF _Ref52334276 \r \h 6.  REF _Ref52334279 \h Étude et discussion de quelques applications AMAS


Chapitre III – EPE : Environnement de Programmation Emergente

Chapitre IV. EPE : implémentation



 REF _Ref71194132 \h  \* MERGEFORMAT  Conclusion : Enseignements et Perspectives












Figure  SEQ Figure \* ARABIC 42. Représentation de la factorielle itérative sous une forme calquée sur la programmation impérative classique. (Note : quand un agent possède deux entrées, celles-ci sont visuellement regroupées sur une seule entrée au niveau de l'agent, mais issue d'un branchement en amont (point noir). L'agent sur la première entrée est représenté plus haut dans le schéma que l'agent sur la seconde entrée).

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 41. L'interface graphique d'EPE.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 40. Les outils d'observation dans EPE permettant à l'utilisateur de suivre en temps réel les évolutions du système.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 39. Architecture simplifiée de l'interface graphique dans EPE.


 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 38. Architecture simplifiée du module gérant les processus de réorganisation de l'agent.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 37. Les messages servant à la propagation des SNC dans l'organisation.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 36. Les messages servant à l'échange d'informations nécessaires à la réorganisation entre les agents.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 35. Les messages servant à l'échange de données entre les agents.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 34. Les messages servant à l'établissement d'un contrat de travail (entrée/sortie, client/fournisseur) entre les agents.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 33. Architecture simplifiée du module gérant les communications de l'agent.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 32. Architecture simplifiée du module gérant les accointances et les croyances associées de l'agent.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 31. Les différents types d'agents actuellement utilisables dans EPE.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 30. L'architecture générale d'EPE avec les principaux modules associés à un agent.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 29. Multiplicité des liens : en traits gras les liens multiples et en trait fins les liens uniques.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 28. Les 6 organisations différentes possibles pour l'exemple élémentaire avec les valeurs calculées.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 27. Proximité fonctionnelle par rapport à la proximité organisationnelle.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 26. Proximité fonctionnelle des 2.876 organisations testées pour la valeur 4 en entrée (valeurs normalisées à 10) – tri par proximité organisationnelle croissante.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 25. Proximité fonctionnelle des 2.876 organisations testées pour la valeur 4 en entrée (valeurs normalisées à 10).

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 24. Proximité fonctionnelle des 2.876 organisations testées pour la valeur 4 en entrée (valeurs réelles).

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 23. Proportions des proximités organisationnelles parmi les 2.876 organisations testées.

 EMBED Word.Picture.8 

Figure  SEQ Figure \* ARABIC 22. Catégorisation des organisations possibles (espace de recherche).

 EMBED Word.Picture.8 















Figure  SEQ Figure \* ARABIC 21. Le cas de la "sortie multiple" : l'agent A reçoit un NCSNeedOutMessage (générée par l'agent B et symbolisé par l'éclair) et il possède plusieurs partenaires en sortie. Il est peutêtre en train de bloquer l'entrée d'un autre qui pourrait répondre à la SNC de B (par exemple C). A va alors baisser son taux de confiance en C (symbolisé par la petite flèche verticale descendante).




Figure  SEQ Figure \* ARABIC 20. Une organisation possible des agents qui calculent ainsi la fonction factorielle.





Figure  SEQ Figure \* ARABIC 19. Mécanisme itératif de la factorielle. Cette organisation des agents calcule la factorielle pour n > 2.




Figure  SEQ Figure \* ARABIC 18. L'agent "Out" chargé de l'émission vers l'environnement de la valeur calculé par le système.





Figure  SEQ Figure \* ARABIC 17. L'agent "=" qui compare ses 2 entrées et renvoie le résultat booléen en sortie.





Figure  SEQ Figure \* ARABIC 16. L'agent "+" qui additionne ses 2 entrées et renvoie le total aux autres agents.





Figure  SEQ Figure \* ARABIC 15. L'agent "1" chargé de fournir l'entier "1" aux autres agents.






Figure  SEQ Figure \* ARABIC 14. Schéma générique propre aux agents sélectionnés pour le calcul numérique.




Figure  SEQ Figure \* ARABIC 13. Le code LISP des actions élémentaires de la fourmi artificielle représenté sous forme d'arbre de décision. Ceci est la version de la fourmi qui parvient au but.




Figure  SEQ Figure \* ARABIC 12. Le chemin appelé "Santa Fee Trail 
(W]w›©Ñãäçõö O P U e ñáñÔÆ»­¡•»…s»k»YI»>6hƒ9ZOJQJh]á5;OJQJhN_h]á5CJ OJQJ\"hN_h]á5CJ(OJQJ\aJ(h?ÆOJQJ"hž~Âh]á5:CJ$OJQJaJ$hž~Âh]á5CJ$OJQJaJ$hN_h]á5OJQJhN_h]á:OJQJhN_h]á5:OJQJhN_h]áOJQJhN_h]á5@ˆgd]á=gd]áB
ÆÀ!gd]á@
ÆÀ!„Š„Š]„Š^„Šgd]á@
ÆÀ!gd]á@
ÆÀ!„„¤à]„^„gd]áB
ÆÀ!„„¤ð]„^„gd]á y  ýýýýe g q s ‹ Œ Ÿ   ³ µ Ë Ñ Ô Þ ß à ð ò ü ý þ 




,
.
E
H
U
Z
[
\
p
r
†
ˆ
 
¡
®
¯
°
±
Ã
õéõÝõÕõÍõéÄõÍõ·ÍõéõÍÝõÍõ·Íõ«õÍ£õ·ÍõéõÝõÍõ–‹~hN_h]áCJ OJQJhN_h]áOJQJhN_h]á@ˆþÿOJQJhøzœOJQJhR hƒ9Z6OJQJhN_hƒ9Z@ˆþÿOJQJhƒ9Z6OJQJhƒ9ZOJQJhžÊOJQJhAj?hƒ9Z6OJQJhÊ ®hƒ9Z6OJQJhN_hƒ9ZOJQJ,  à
\
°
±
Ä
ê
 3 h s íííÚȳ¡œŽ€l@„‚„‚dð¤h¤x]„‚^„‚gd]á
$
Æ
¤xa$gd]á
=
Æ dð¤hgd]áBgd]áA
ÆÀ!„7„7¤ð]„7^„7gd]á@
ÆÀ!„„dð¤h]„^„gd]áD
Æ°ç„ÿÿ„]„ÿÿ^„gd]áD
Æ
°Þç„ÿÿ„]„ÿÿ^„gdƒ9ZD
Æ°Þ„ÿÿ„]„ÿÿ^„gdƒ9Z Ã
Ä
ê
  3 A a c h s ý
þ
 NO’“˜àáñßÏÄ·®§®„w„w„k®§b§®XP§HhN_h]á:hN_h]á5hN_h]á5CJhN_h]áNHhN_h]á56CJhN_h]áCJNHaJhN_h]áCJaJhN_h]á5CJ OJQJhN_h]á6CJ hN_h]áhN_h]áCJhN_h]á@ˆOJQJhN_h]áOJQJhN_h]á5CJ OJQJ\"hN_h]á5CJ(OJQJ\aJ(hN_h]á:CJ OJQJs ¶
9 ’“âö÷ùghµ¶¿ÀÐѬ÷÷÷ëá×ÒÍÍÈÈÈÈÃȾ¹´¹¹gd_\gd;$Ýgdøzœgd% fgd“Q gd¦8pgdµ ' $¤ða$gd&-Ê $¤ða$gd]á dèþ¤ð¤xgdê1rEdèþgdê1ráâçóõö÷øùû 
 2389EJLb#:Zfghj~‹”™±µ¶·ÃÄÅÈz{´µ¶¸ÈÊÔüøôøôìåÞøÚøÚøÖÏøÏøËÖËøÇÿûÿ·Ú³¬³¥³¥³¥¡¥³¿™•‘•ŠÚ³Ú³¥ hó~Ñh“Q hëhhÔRhÛL£hú^©hPMÉ hó~Ñhó~Ñ h“Q h“Q hó~Ñh]hf6h{OhcZchL`“høzœ hÉ hÉ hÒh“Q 
h¦8p5CJ
h]5CJh¦8ph¦8p5h¦8phÉ h&-Ê6ÔÖ×Ùñóô
e¾¿ÀÂÕë"T¾6=¾ÊÑÓÔbÈ“œ«¬­°çé05ŒŽý˜ š  ¦ Ê üøüñøíñøéåéáÚÖíÖíÒíáÎÊÎÊÆÎÖÂí¾Öº¶²¶ºÖ¾®¾®¾Ò®ªÒ¦®›…h¥wÔhÌ16mHsHh¥wÔh"òmHsHh¥wÔhcq…mHsHh[53hþ@}h"òhëhhS8¶h;$Ýhcq…h_\h&-Êh«Y²héqæhNvh“Q  hó~Ñh% fhFQúhL`“h% fhøzœ hó~Ñhó~ÑhPMÉhó~Ñ4¬­™ š ”!•!š"œ"¶"Ð"I#›#$$õ$n%¼%+&ƒ&ï&X'¬'(„(õ(úúúúúõèãáÛááááÛáááÔááááá4
Æf I"
4
ÆI"
gd¦8p „„^„`„gd¼™gdânªgd“Q Ê Ì “!”!•!—!˜!›!œ!!Ÿ!™"š"›"œ"¶"·"Î"Ï"Ð"Ñ"Ò"í"î"ï"ð"'#(#õêßÔÐÌÈÄÈÌÀ¼¸Ì´¬´¬š‡ypyV‡yKht§mHnHu2jht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu"ht§ht§:CJaJmHnHujhµ 'Uhµ 'h¥wÔh&-Êh¼™h€hh"òhânªh% fhº
eh"òmHsHh¥wÔh“Q mHsHhº
ehº
emHsHh¥wÔh[53mHsH(#)#B#C#D#F#G#H#I#J#K#f#g#h#i#k#l#y#z#{#”#•#–#˜#™#š#›#œ##¸#¹#ðåÔðÉ𶢶”‹”q¶”`”åðåOðÉð¶`¶”‹” jqht§UmHnHu ht§:CJaJmHnHsH u2jöht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu&ht§5;CJ\aJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHu j{ht§UmHnHuht§mHnHujht§UmHnHu¹#º#»#½#¾#ð#ñ#ò# $ $
$$$$$$$/$0$1$2$4$5$n$o$p$‰$Š$‹$æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš j]ht§UmHnHu2jâht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jght§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jìht§ht§>*B*UmHnHphÿu‹$$Ž$$$‘$’$­$®$¯$°$²$³$Ó$Ô$Õ$î$ï$ð$ò$ó$ô$õ$ö$÷$%%%%L%M%N%g%õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ó´†æ†2jÎht§ht§>*B*UmHnHphÿu jSht§UmHnHuht§mHnHu2jØht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu g%h%i%k%l%m%n%o%p%‹%Œ%%Ž%%‘%š%›%œ%µ%¶%·%¹%º%»%¼%½%¾%Ù%Ú%ïàÕà® — } l aàaPàÕàÂl —  j?ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jÄht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu&ht§5;CJ\aJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHujht§UmHnHu jIht§UmHnHuÚ%Û%Ü%Þ%ß% &
& &$&%&&&(&)&*&+&,&-&H&I&J&K&M&N&a&b&c&|&}&~&æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš j+ht§UmHnHu2j°ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j5ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jºht§ht§>*B*UmHnHphÿu~&€&&‚&ƒ&„&…& &¡&¢&£&¼&½&Í&Î&Ï&è&é&ê&ì&í&î&ï&ð&ñ& '
''õæÓÂÓ´«´‘Ó´}´ræraæõæÓ}Ó´«´G2jœ ht§ht§>*B*UmHnHphÿu j! ht§UmHnHuht§mHnHu&ht§5;CJ\aJmHnHsH u2j¦ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu''''6'7'8'Q'R'S'U'V'W'X'Y'Z'u'v'w'x'z'{'Š'‹'Œ'¥'¦'§'©'ª'«'¬'­'®'É'Ê'íßÎßô㴘´íÎíߏßuíßÎßôÃd´˜´íÎíßß j
ht§UmHnHu2j’
ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j
ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu#Ê'Ë'Ì'Î'Ï'â'ã'ä'ý'þ'ÿ'((((((!("(#($(&('(b(c(d(}(~((æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš jù ht§UmHnHu2j~ ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jˆ ht§ht§>*B*UmHnHphÿu((‚(ƒ(„(…(†(¡(¢(£(¤(¦(§(Ó(Ô(Õ(î(ï(ð(ò(ó(ô(õ(ö(÷())))))I)J)K)d)õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ӵ´†æ†2jjht§ht§>*B*UmHnHphÿu jï
ht§UmHnHuht§mHnHu2jt
ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu"d)e)f)h)i)j)k)l)m)ˆ)‰)Š)‹)Ç)È)É)â)ã)ä)ç)è)é)ê)ë)ì)**ïàÕà±£š£€Â£uàudàÕàÂP£š£&ht§5;CJ\aJmHnHsH u jÛht§UmHnHuht§mHnHu2j`ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHujht§UmHnHu jåht§UmHnHuõ(k)ê)r*û*u+
,p,Â,-i-Ö-=..â../~/Ñ/ 00é0N1µ1·1Ñ1ë1d2¶2ý÷ýýýý÷ýýý÷ýýý÷÷ýýýýýýòòí÷ýgdt§gd]á4
ÆI"
* *
* *
*O*P*Q*j*k*l*o*p*q*r*s*t***‘*’*”*•*Ø*Ù*Ú*ó*ô*õ*æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš jÇht§UmHnHu2jLht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jÑht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jVht§ht§>*B*UmHnHphÿuõ*ø*ù*ú*û*ü*ý*++++++R+S+T+m+n+o+r+s+t+u+v+w+’+“+”+•+—+˜+ê+ë+ì+,õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ӵ´†æ†2j8ht§ht§>*B*UmHnHphÿu j½ht§UmHnHuht§mHnHu2jBht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu",,,
, , ,
,,,*,+,,,-,M,N,O,h,i,j,m,n,o,p,q,r,,Ž,ïàÕà±£š£€Â£uàudàÕàÂP£š£&ht§5;CJ\aJmHnHsH u j©ht§UmHnHuht§mHnHu2j.ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHujht§UmHnHu j³ht§UmHnHuŽ,,,’,“,Ÿ, ,¡,º,»,¼,¿,À,Á,Â,Ã,Ä,ß,à,á,â,ä,å,ñ,ò,ó, -
--æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš j•ht§UmHnHu2jht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jŸht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2j$ht§ht§>*B*UmHnHphÿu-------1-2-3-4-6-7-F-G-H-a-b-c-f-g-h-i-j-k-†-‡-ˆ-‰-³-´-µ-Î-õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ó´†æ†2jht§ht§>*B*UmHnHphÿu j‹ht§UmHnHuht§mHnHu2jht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu Î-Ï-Ð-Ó-Ô-Õ-Ö-×-Ø-ó-ô-õ-ö-ø-ù-...5.6.7.:.;..?.Z.[.ïàÕà® — } l aàaPàÕàÂl —  jwht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jüht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu&ht§5;CJ\aJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHujht§UmHnHu jht§UmHnHu[.\.]._.`.l.m.n.‡.ˆ.‰.Œ..Ž...‘.¬.­.®.¯.±.².¿.À.Á.Ú.Û.Ü.æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš jcht§UmHnHu2jèht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jmht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jòht§ht§>*B*UmHnHphÿuÜ.ß.à.á.â.ã.ä.ÿ./// / /
/&/'/(/+/,/-/.///0/K/L/M/N/[/õæÓÂÓ´«´‘Ó´†æ†uæõæÓaÓ´«´GÓ´2jÔht§ht§>*B*UmHnHphÿu&ht§5;CJ\aJmHnHsH u jYht§UmHnHuht§mHnHu2jÞht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu[/\/]/v/w/x/{/|/}/~//€/›/œ//ž/ /¡/®/¯/°/É/Ê/Ë/Î/Ï/Ð/Ñ/Ò/Ó/î/ï/õæõÕæÊæ·£·•Œ•r·•a•õæõPæÊæ·a·•Œ• jEht§UmHnHu ht§:CJaJmHnHsH u2jÊht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu&ht§5;CJ\aJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHu jOht§UmHnHujht§UmHnHuht§mHnHuï/ð/ñ/ó/ô/ý/þ/ÿ/000000 0!0"0=0>0?0@0B0C0m0n0o0ˆ0‰0Š0æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš j1 ht§UmHnHu2j¶ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j;ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uh-6óht§0J&mHnHu$jh-6óht§0J&UmHnHu2jÀht§ht§>*B*UmHnHphÿuŠ00Ž000‘0’0­0®0¯0°0²0³0Æ0Ç0È0á0â0ã0æ0ç0è0é0ê0ë0111 1 1 1+1,1-1F1õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ӵ´†æ†2j¢!ht§ht§>*B*UmHnHphÿu j'!ht§UmHnHuht§mHnHu2j¬ ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHujht§UmHnHuhömHnHu"F1G1H1K1L1M1N1O1P1k1l1m1n1p1q1’1“1”1­1®1¯1²1³1´1µ1¶1·1À1Ð1Ñ1ïàÕà±£š£€Â£±£uàudàÕà±\XQMQh]á hQÖh]áh;$Ýjhµ 'U j#ht§UmHnHuht§mHnHu2j˜"ht§ht§>*B*UmHnHphÿuht§mHnHuh-6óht§0J&mHnHu ht§:CJaJmHnHsH u$jh-6óht§0J&UmHnHuhömHnHujht§UmHnHu j"ht§UmHnHuÑ1Ò1é1ê1ë1ì1í12 2
2 2B2C2D2]2^2_2a2b2c2d2e2f22‚2óëóÚǹ°¹–ǹ‹|‹k|`|ÇLǹ°¹&ht§5;CJ\aJmHnHsH uhömHnHu j $ht§UmHnHujht§UmHnHuht§mHnHu2jŽ#ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu ht§:CJaJmHnHsH uh]ámH sH jh]áUmH sH ‚2ƒ2„2†2‡2”2•2–2¯2°2±2³2´2µ2¶2·2¸2Ó2Ô2Õ2Ö2Ú2Û2ý2þ2ÿ23æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅIÅ©š©#ht§6CJ]aJmHnHsH u2jz%ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jÿ$ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j„$ht§ht§>*B*UmHnHphÿu3333333 3!33?3C3D3]3^3_3x3y3z3|3}3~33€33œ33ïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ jë&ht§UmHnHuht§mHnHu2jp&ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jõ%ht§UmHnHu¶233Î3E4Â4.5‹5þ5|6ò6T7Õ7:8³89o9Ñ9;:ª:;~;ï;týýýûýýýýûýýýûõûýýýýýûýýýûýýý4
ÆI"
3ž3Ÿ3£3¤3¬3­3®3Ç3È3É3Ë3Ì3Í3Î3Ï3Ð3ë3ì3í3î3ð3ñ3#4$4%4>4æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓÅIŨ™¨ ht§:CJaJmHnHsH u2j\(ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu já'ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jf'ht§ht§>*B*UmHnHphÿu>4?4@4B4C4D4E4F4G4b4c4d4e4i4j4 4¡4¢4»4¼4½4¿4À4Á4Â4Ã4Ä4ß4à4ïàÕà±£š£€Â£n£càcRàÕàÂn£š£ jÍ)ht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u2jR)ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu j×(ht§UmHnHuà4á4â4æ4ç4 5
55'5(5)5+5,5-5.5/505K5L5M5N5R5S5i5j5k5„5…5†5æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ j¹+ht§UmHnHu2j>+ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jÃ*ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jH*ht§ht§>*B*UmHnHphÿu†5ˆ5‰5Š5‹5Œ55¨5©5ª5«5¯5°5Ü5Ý5Þ5÷5ø5ù5û5ü5ý5þ5ÿ566666 6õæÓÁÓ³ª³Ó³Á³…æ…tæõæÓÁÓ³ª³ZÓ³2j*-ht§ht§>*B*UmHnHphÿu j¯,ht§UmHnHuht§mHnHu2j4,ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu 6!6Z6[6\6u6v6w6y6z6{6|6}6~6™6š6›6œ6 6¡6Ð6Ñ6Ò6ë6ì6í6ï6ð6ñ6ò6ó6ô67ïáÖÇֶǫǘï˜ááu˜ácáÖÇÖRǫǘc˜á j›.ht§UmHnHu#ht§6CJ]aJmHnHsH u2j .ht§ht§>*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu j¥-ht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u 777777273747M7N7O7Q7R7S7T7U7V7q7r7s7t7x7y7³7´7µ7Î7Ï7ñ×Äñ²ñ§˜§‡˜|˜Ä²ÄñsñYÄñ²ñ§˜§H j‡0ht§UmHnHu2j 0ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j‘/ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHu2j/ht§ht§>*B*UmHnHphÿuhd,¼ht§0J&mHnHuÏ7Ð7Ò7Ó7Ô7Õ7Ö7×7ò7ó7ô7õ7÷7ø7888384858788898:8;8*B*UmHnHphÿu j}1ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2j1ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHuY8Z8‘8’8“8¬8­8®8°8±8²8³8´8µ8Ð8Ñ8Ò8Ó8Õ8Ö8ß8à8á8ú8û8ü8þ8ÿ89999íßÔÅÔ´Å©Åí•íߌßríßaßÔÅÔPÅ©Åíaíß ji3ht§UmHnHu ht§:CJaJmHnHsH u2jî2ht§ht§>*B*UmHnHphÿuht§mHnHu&ht§5;CJ\aJmHnHsH uhömHnHu js2ht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu999 9!9%9&9M9N9O9h9i9j9l9m9n9o9p9q9Œ99Ž99“9”9¯9°9±9Ê9öèλè©èžž~s»©»èöèY»è©èžž2jÚ4ht§ht§>*B*UmHnHphÿuhömHnHu j_4ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHu2jä3ht§ht§>*B*UmHnHphÿuhd,¼ht§0J&mHnHuht§mHnHuÊ9Ë9Ì9Î9Ï9Ð9Ñ9Ò9Ó9î9ï9ð9ñ9õ9ö9:::4:5:6:8:9:::;:*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jU5ht§UmHnHuY:Z:[:_:`:ˆ:‰:Š:£:¤:¥:§:¨:©:ª:«:¬:Ç:È:É:Ê:Î:Ï:í:î:ï:; ;
;æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ j78ht§UmHnHu2j¼7ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jA7ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jÆ6ht§ht§>*B*UmHnHphÿu
; ;
;;;;;,;-;.;/;1;2;\;];^;w;x;y;{;|;};~;;€;›;œ;;ž;õæÓÁÓ³ª³Ó³³tætcæõæÓÓ³ª³IÓ2j¨9ht§ht§>*B*UmHnHphÿu j-9ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2j²8ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHuž;¢;£;Í;Î;Ï;è;é;ê;ì;í;î;ï;ð;ñ; x>y>’>“>”>æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ jç?ht§UmHnHu2jl?ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jñ>ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jv>ht§ht§>*B*UmHnHphÿu”>–>—>˜>™>š>›>¶>·>¸>¹>½>¾>
? ? ?%?&?'?)?*?+?,?-?.?I?J?K?L?P?Q?b?c?d?}?õæÓÁÓ³ª³Ó³Á³…æ…tæõæÓÁÓ³ª³ZÓ³Á³…æ…2jXAht§ht§>*B*UmHnHphÿu jÝ@ht§UmHnHuht§mHnHu2jb@ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu"™>,?„?ð?Y@Â@-AAîAWB¯BCCãCcD±DEqEÅE6F£FG“G H|HñHpIïIýýöôýýôýýôýýýôýýýýôýýýôýýýî4
ÆI"
4
Æf I"
}?~???‚?ƒ?„?…?†?¡?¢?£?¤?½?¾?Î?Ï?Ð?é?ê?ë?í?î?ï?ð?ñ?ò?
@@ïàÕà°¢™¢¢k¢`à`OàÕàÂk¢™¢ jÉBht§UmHnHuht§mHnHu&ht§5;CJ\aJmHnHsH u2jNBht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jÓAht§UmHnHu@@@@@7@8@9@R@S@T@V@W@X@Y@Z@[@v@w@x@y@}@~@ @¡@¢@»@æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅIÅ©š©#ht§6CJ]aJmHnHsH u2j:Dht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j¿Cht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jDCht§ht§>*B*UmHnHphÿu»@¼@½@¿@À@Á@Â@Ã@Ä@ß@à@á@â@æ@ç@ A A
A&A'A(A*A+A,A-A.A/AJAKAïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ j«Eht§UmHnHuht§mHnHu2j0Eht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jµDht§UmHnHuKALAMAOAPA_A`AaAzA{A|A~AA€AA‚AƒAžAŸA A¡A¥A¦AÌAÍAÎAçAæÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅIÅ©š©#ht§6CJ]aJmHnHsH u2jGht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j¡Fht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j&Fht§ht§>*B*UmHnHphÿuçAèAéAëAìAíAîAïAðA B B
BBBB5B6B7BPBQBRBTBUBVBWBXBYBtBuBïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ jHht§UmHnHuht§mHnHu2jHht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu j—Ght§UmHnHuuBvBwByBzBBŽBB¨B©BªB¬B­B®B¯B°B±BÌBÍBÎBÏBÓBÔBóBôBõBCæÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅIÅ©š©#ht§6CJ]aJmHnHsH u2jþIht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jƒIht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jIht§ht§>*B*UmHnHphÿuCCCCCCCCC2C3C4C5C9C:C_C`CaCzC{C|C~CC€CC‚CƒCžCŸCïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ joKht§UmHnHuht§mHnHu2jôJht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jyJht§UmHnHuŸC C¡C¥C¦CÁCÂCÃCÜCÝCÞCàCáCâCãCäCåCDDDDDDADBDCD\DæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓÅIŨ™¨ ht§:CJaJmHnHsH u2jàLht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jeLht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jêKht§ht§>*B*UmHnHphÿu\D]D^D`DaDbDcDdDeD€DD‚DƒD‡DˆDDD‘DªD«D¬D®D¯D°D±D²DïàÕà±£š£€Âp^pSàSBàÕàÂ^ jQNht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHtH u2jÖMht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu j[Mht§UmHnHu²D³DÎDÏDÐDÑDÕDÖDïDðDñD
E E EEEEEEE.E/E0E1E5E6EOEPEQEñèñλ«™«ŽŽnc»™»ñèñI»«™«Ž2jÂOht§ht§>*B*UmHnHphÿuhömHnHu jGOht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHtH u$jhd,¼ht§0J&UmHnHu2jÌNht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHuQEjEkElEnEoEpEqErEsEŽEEE‘E•E–E£E¤E¥E¾E¿EÀEÂEÃEÄEÅEÆEÇEâEãEõäÕÊÕ·¥·—Ž—t·d¥dõÕõSÕÊÕ·¥·—Ž— j3Qht§UmHnHuhd,¼ht§0J&mHnHtH u2j¸Pht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu j=Pht§UmHnHuht§mHnHuãEäEåEçEèEFFF/F0F1F3F4F5F6F7F8FSFTFUFVFZF[FæÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓK9#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHtH u2j¤Rht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j)Rht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j®Qht§ht§>*B*UmHnHphÿu[FF‚FƒFœFFžF F¡F¢F£F¤F¥FÀFÁFÂFÃFÇFÈFîFïFðF G
G G
GGGGGG-G.GïäÕäÄÕ¹Õ¦”¦†}†c¦ï”ïäÕäRÕ¹Õ¦”¦†}† jTht§UmHnHu2jšSht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHu jSht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHtH u .G/G0G4G5GqGrGsGŒGGŽGG‘G’G“G”G•G°G±G²G³GµG¶GæÓñ旦†—{—Ó±ÓmdmJÓm9 ht§:CJaJmHnHsH u2j†Uht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHuhömHnHu j Uht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHtH u$jhd,¼ht§0J&UmHnHu2jTht§ht§>*B*UmHnHphÿu¶GçGèGéGHHHHHH H
H H&H'H(H)H-H.HZH[H\HuHvHwHyHñæ×æÆ׻ר—¨ñŽñt¨dRdæ×æA×» j÷Vht§UmHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHtH u2j|Vht§ht§>*B*UmHnHphÿuht§mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHu jVht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHuyHzH{H|H}H~H™HšH›HœH H¡HÏHÐHÑHêHëHìHîHïHðHñHòHóHIIIIIðÝËݽ´½šÝŠËŠðnðcðÝËݽ´½I݊2jhXht§ht§>*B*UmHnHphÿuhömHnHu jíWht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHtH u2jrWht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuIIMINIOIhIiIjImInIoIpIqIrIIŽIIIÌIÍIÎIçIèIéIìIíIîIíÝÒÃҲçÔ픆}†c”†ÒÃÒRçÔ jÙYht§UmHnHu2j^Yht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu jãXht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHtH u#ht§6CJ]aJmHnHsH uîIïIðIñI J
JJJJJTJUJVJoJpJqJtJuJvJwJxJyJ”J•J–J—J›JìÙËÂ˨Ù˗ˌ}Œl}a}ٗÙËÂËGÙË2jJ[ht§ht§>*B*UmHnHphÿuhömHnHu jÏZht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jTZht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu&ht§5;CJ\aJmHnHsH uïIwJàJ8K‘KèKqLÅL'M”MêMdNÒN?O‘O)P‘PQ‚QáQGR™RüRNSµS1T§T$UvUýûûûûýûûûûýûûûýûûûûûûõýûûûûý4
ÆI"
›JœJ½J¾J¿JØJÙJÚJÝJÞJßJàJáJâJýJþJÿJKKKKKK0K1K2K5K6K7K8K9K:KUKVKíßÔÅԴũŖí–ߍßs–ßíßÔÅÔbũŖí–ßß j»\ht§UmHnHu2j@\ht§ht§>*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu jÅ[ht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u!VKWKXK\K]KnKoKpK‰KŠK‹KŽKKK‘K’K“K®K¯K°K±KµK¶KÅKÆKÇKàKáKâKæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ j§^ht§UmHnHu2j,^ht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j±]ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j6]ht§ht§>*B*UmHnHphÿuâKåKæKçKèKéKêKLLLL
L LNLOLPLiLjLkLnLoLpLqLrLsLŽLLL‘LõæÓÁÓ³ª³Ó³³tætcæõæÓÓ³ª³IÓ2j`ht§ht§>*B*UmHnHphÿu j_ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2j"_ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu‘L•L–L¢L£L¤L½L¾L¿LÂLÃLÄLÅLÆLÇLâLãLäLåLéLêLMMMM M!M$M%M&M'M(M)MDMEMñßñÔÅԴũŖߖññs–ñßñÔÅÔbũŖߖññ j‰aht§UmHnHu2jaht§ht§>*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu j“`ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu"EMFMGMKMLMqMrMsMŒMMŽM‘M’M“M”M•M–M±M²M³M´M¸M¹MÇMÈMÉMâMãMäMæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ jucht§UmHnHu2júbht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jbht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jbht§ht§>*B*UmHnHphÿuäMçMèMéMêMëMìMNN N
N N
NANBNCN\N]N^NaNbNcNdNeNfNN‚NƒN„NõæÓÁÓ³ª³Ó³³tætcæõæÓÓ³ª³IÓ2jædht§ht§>*B*UmHnHphÿu jkdht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jðcht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu„NˆN‰N¯N°N±NÊNËNÌNÏNÐNÑNÒNÓNÔNïNðNñNòNöN÷NOOO7O8O9OO?O@OAO\O]OñßñÔÅԴũŖߖññs–ñßñÔÅÔbũŖߖññ jWfht§UmHnHu2jÜeht§ht§>*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu jaeht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu"]O^O_OcOdOnOoOpO‰OŠO‹OŽOOO‘O’O“O®O¯O°O±O³O´OPPP!PæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓÅIŨ™¨ ht§:CJaJmHnHsH u2jÈght§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jMght§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jÒfht§ht§>*B*UmHnHphÿu!P"P#P&P'P(P)P*P+PFPGPHPIPMPNPnPoPpP‰PŠP‹PŽPPP‘P’P“P®P¯PïàÕà±£š£€Â£n£càcRàÕàÂn£š£ j9iht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u2j¾hht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jChht§UmHnHu¯P°P±PµP¶PßPàPáPúPûPüPÿPQQQQQQ Q!Q"Q&Q'Q_Q`QaQzQ{Q|QæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ j%kht§UmHnHu2jªjht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j/jht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j´iht§ht§>*B*UmHnHphÿu|QQ€QQ‚QƒQ„QŸQ Q¡Q¢Q¦Q§Q¾Q¿QÀQÙQÚQÛQÞQßQàQáQâQãQþQÿQRRRR$R%R&R?RõæÓÁÓ³ª³Ó³Á³…æ…tæõæÓÁÓ³ª³ZÓ³Á³…æ…2j–lht§ht§>*B*UmHnHphÿu jlht§UmHnHuht§mHnHu2j kht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu"?R@RARDRERFRGRHRIRdReRfRgRkRlRvRwRxR‘R’R“R–R—R˜R™RšR›R¶R·RïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ jnht§UmHnHuht§mHnHu2jŒmht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jmht§UmHnHu·R¸R¹RÙRÚRÛRôRõRöRùRúRûRüRýRþRSSSSSS+S,S-SFSæÓź«ºš««Ó{ÓÅrÅXÓÅGź«º ht§:CJaJmHnHsH u2jxoht§ht§>*B*UmHnHphÿuht§mHnHu&ht§5;CJ\aJmHnHsH uhömHnHu jýnht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j‚nht§ht§>*B*UmHnHphÿuFSGSHSKSLSMSNSOSPSkSlSmSnSrSsS’S“S”S­S®S¯S²S³S´SµS¶S·SÒSÓSïàÕà±£š£€Â£n£càcRàÕàÂn£š£ jépht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u2jnpht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jóoht§UmHnHuÓSÔSÕSÙSÚSTTT)T*T+T.T/T0T1T2T3TNTOTPTQTUTVT„T…T†TŸT T¡TæÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ jÕrht§UmHnHu2jZrht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jßqht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jdqht§ht§>*B*UmHnHphÿu¡T¤T¥T¦T§T¨T©TÄTÅTÆTÇTËTÌTUUUUUU!U"U#U$U%U&UAUBUCUDUFUõæÓÁÓ³ª³Ó³Á³…æ…tæõæÓÁÓ³ª³ZÓ³2jFtht§ht§>*B*UmHnHphÿu jËsht§UmHnHuht§mHnHu2jPsht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHuFUGUSUTUUUnUoUpUsUtUuUvUwUxU“U”U•U–UšU›U°U±U²UËUÌUÍUÐUÑUÒUÓUÔUÕUðUïáÖÇֶǫǘï˜ááu˜ácáÖÇÖRǫǘc˜á j·uht§UmHnHu#ht§6CJ]aJmHnHsH u2j*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu jÁtht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u vUÓU-VVðVHW¡WþW^X³X Y‡YèYTZºZ?[¥[÷[k\Ð\*]}]É]^l^»^+_„_é_ýýýýýýýýûõûýýýýýûýýýûõõûûûûû4
ÆI"
ðUñUòUóU÷UøU
V V V%V&V'V*V+V,V-V.V/VJVKVLVMVQVRVlVmVnV‡VˆVñ×Äñ²ñ§˜§‡˜|˜Ä²ÄñsñYÄñ²ñ§˜§H j£wht§UmHnHu2j(wht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j­vht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHu2j2vht§ht§>*B*UmHnHphÿuhd,¼ht§0J&mHnHuˆV‰VŒVVŽVVV‘V¬V­V®V¯V³V´VÍVÎVÏVèVéVêVíVîVïVðVñVòV
WWWWWW%W&W'WðåðÒÀÒ²©²Ò²À²„ð„sðåðÒÀÒ²©²YÒ²À²„ð2jyht§ht§>*B*UmHnHphÿu j™xht§UmHnHuht§mHnHu2jxht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu"'W@WAWBWEWFWGWHWIWJWeWfWgWhWlWmW~WW€W™WšW›WžWŸW W¡W¢W£W¾W¿WõäÕÊÕ·¥·—Ž—t·—¥—õÕõcÕÊÕ·¥·—Ž— j…zht§UmHnHu2j
zht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jyht§UmHnHuht§mHnHu¿WÀWÁWÅWÆWÛWÜWÝWöW÷WøWûWüWýWþWÿWXXXXX"X#X;X*B*UmHnHphÿuht§mHnHuhömHnHu j{{ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j{ht§ht§>*B*UmHnHphÿuXX[X\X]X^X_X`X{X|X}X~X€XXX‘X’X«X¬X­X°X±X²X³X´XµXÐXÑXÒXÓXõæÓÁÓ³ª³Ó³³tætcæõæÓÓ³ª³IÓ2jâ}ht§ht§>*B*UmHnHphÿu jg}ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jì|ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHuÓXýXþXÿXYYYYYY Y!Y"Y=Y>Y?Y@YBYCYdYeYfYY€YY„Y…Y†Y‡YˆY‰Yñæ×æÆ׻ר”¨ñ‹ñq¨ñ`ñæ×æO׻ר`¨ñ jSht§UmHnHu ht§:CJaJmHnHsH u2jØ~ht§ht§>*B*UmHnHphÿuht§mHnHu&ht§5;CJ\aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHu j]~ht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu‰Y¤Y¥Y¦Y§Y«Y¬YÅYÆYÇYàYáYâYåYæYçYèYéYêYZZZZ Z
Z1Z2Z3ZLZöèλè©èžž~s»©»èöèY»è©èžž2jĀht§ht§>*B*UmHnHphÿuhömHnHu jI€ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHu2jÎht§ht§>*B*UmHnHphÿuhd,¼ht§0J&mHnHuht§mHnHuLZMZNZQZRZSZTZUZVZqZrZsZtZxZyZ—Z˜Z™Z²Z³Z´Z·Z¸Z¹ZºZ»Z¼Z×ZØZïàÕà°¢™¢¢°¢tàtcàÕà°¢™¢ j5‚ht§UmHnHuht§mHnHu2jºht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu j?ht§UmHnHuØZÙZÚZÞZßZ[[[7[8[9[[?[@[A[\[][^[_[c[d[‚[ƒ[„[[ž[Ÿ[æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓųŨ™¨I™ j!„ht§UmHnHu2j¦ƒht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j+ƒht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j°‚ht§ht§>*B*UmHnHphÿuŸ[¢[£[¤[¥[¦[§[Â[Ã[Ä[Å[Ç[È[Ô[Õ[Ö[ï[ð[ñ[ô[õ[ö[÷[ø[ù[\\\\õæÓÁÓ³ª³Ó³³tætcæõæÓÓ³ª³IÓ2j’…ht§ht§>*B*UmHnHphÿu j…ht§UmHnHuht§mHnHu ht§:CJaJmHnHsH u2jœ„ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu#ht§6CJ]aJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu\\\H\I\J\c\d\e\h\i\j\k\l\m\ˆ\‰\Š\‹\\\­\®\¯\È\É\Ê\Í\Î\Ï\Ð\Ñ\Ò\í\î\ñßñÔÅԴũŖߖññs–ñßñÔÅÔbũŖߖññ j‡ht§UmHnHu2jˆ†ht§ht§>*B*UmHnHphÿuht§mHnHu$jhd,¼ht§0J&UmHnHuhömHnHu j
†ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu"î\ï\ð\ô\õ\]] ]"]#]$]'](])]*]+],]G]H]I]J]L]M]Z][]\]u]æÓųŨ™¨ˆ™}™Ó³ÓÅtÅZÓÅIŨ™¨ ht§:CJaJmHnHsH u2jtˆht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu jù‡ht§UmHnHujht§UmHnHuht§mHnHu#ht§6CJ]aJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j~‡ht§ht§>*B*UmHnHphÿuu]v]w]z]{]|]}]~]]š]›]œ]]¦]§]¨]Á]Â]Ã]Æ]Ç]È]É]Ê]Ë]æ]ç]ïàÕà±£š£€Â£uàudàÕàÂP£š£&ht§5;CJ\aJmHnHsH u jå‰ht§UmHnHuht§mHnHu2jj‰ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jïˆht§UmHnHuç]è]é]ö]÷]ø]^^^^^^^^^6^7^8^9^;^*B*UmHnHphÿuht§mHnHu&ht§5;CJ\aJmHnHsH uhömHnHu jۊht§UmHnHujht§UmHnHuht§mHnHuhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2j`Šht§ht§>*B*UmHnHphÿud^e^f^i^j^k^l^m^n^‰^Š^‹^Œ^Ž^^˜^™^š^³^´^µ^¸^¹^º^»^¼^½^Ø^Ù^ïàÕà±£š£€Â£±£uàudàÕà±£š£ jnjht§UmHnHuht§mHnHu2jLŒht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jыht§UmHnHuÙ^Ú^Û^Ý^Þ^_ _
_#_$_%_(_)_*_+_,_-_H_I_J_K_M_N_a_b_c_|_}_~_æÓÅ´Å©š©‰š~šÓ´ÓÅuÅ[ÓÅ´Å©š©Jš j³Žht§UmHnHu2j8Žht§ht§>*B*UmHnHphÿuht§mHnHuhömHnHu j½ht§UmHnHujht§UmHnHuht§mHnHu ht§:CJaJmHnHsH uhd,¼ht§0J&mHnHu$jhd,¼ht§0J&UmHnHu2jBht§ht§>*B*UmHnHphÿu~__‚_ƒ_„_…_†_¡_¢_£_¤_¦_§_Æ_Ç_È_á_â_ã_æ_ç_è_é_ê_ë_``` ` ` `-`.`/`H`õæÓÂÓ´«´‘Ӵ´†æ†uæõæÓÂÓ´«´[Ӵ´†æ†2j$ht§ht§>*B*UmHnHphÿu j©ht§UmHnHuht§mHnHu2j.ht§ht§>*B*UmHnHphÿuht§mHnHuhd,¼ht§0J&mHnHu ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHujht§UmHnHuhömHnHu"H`I`J`M`N`O`P`Q`R`b`n`Š`—`ÿc"dgIgJgrgvg_iri’i“i”iïàÕà±¥¡–ˆ}u}j\RKRD h2\dh]á h]á6hhGzðh]á6hhGzðh]á6hmH sH h&¹h]ámH sH h]ámH sH hÕ/9h]ámH sH  hâ:$h]á h@êh]á hj#h]áh]áhIyjh]áUmH sH  ht§:CJaJmHnHsH u$jhd,¼ht§0J&UmHnHuhömHnHujht§UmHnHu jŸht§UmHnHué_P`R`Š`˜`cbþcÿc"dgîjnRnŸnën o;oYoZo*q+qFqWt7x…{ýøìçâââÝØØØØÓÓÓÓÓØØØÝØØØgdµ)ûgd]ágd]ágd]ágd]á 
& F„„^„„gd]ágd\¹”iži iãiäi÷iøiùiúiSj]jbjcjžjŸj¨j°jµj¶jºj»jÁjìjîjÿjÝkûkükÿkll`llnnnnnžnÊnênÿno3o:oXoYo•p¥p/q6qúòêâØÑÍÑêúêúêúêúêúêúêúêÍÆÍÑ;ÑÍ´¦ž“žÍÍÍÍÍˆÍÍ h[EÅh]á hSQh]áhœ ‘hV|h]ámH sH h]ámH sH h¬eöh]á6]mH sH hlmAh]á6]hý6Øh]á6 hP$Uh]áh]á hµgh]áhŠ ÿh]á6hh¿Xh]áhh„1Ôh]áhhV|h]áh h]áh26qOrPrës#t¡u®uwžwy|z}z{{u{æ{|@}O}P}g}h}x}y}|}}}‡}V~x~y~ë~í~àI€J€Ð€ß€˜±…ƒ.„/„5„V„_„üõüñüêüãüÛÑÛÑÛüÍüƻƭü»©»ü¤œ¤œ¤ü•Žü‡ü€üypyüyhˆXh]áNH hˆXh]á hEQšh]á h
iøh]á hþ?¥h]á h*p«h]áhË{mh]áh h]áhhöj‘hJ;h]áUjhJ;h]áU hJ;h]áh "ÛhŠOÛh]á6H*hŠOÛh]á6 hxo§h]á h΋h]áhd"  hÎXæh]áh]á,…{†{{CzßJ€K€¡‚‰„Š„½„¾‡_ˆ`ˆ—ˆ¿‹ŽZ“‘”‘º‘”÷–ø–úõúððððçúúúâÝÝÝõúúúúúõúúúgd]ágd]ᄨ^„¨gd]ágdµ)ûgd]ágd]á_„„ˆ„Š„½„8…;…^ˆ_ˆ¦ŠªŠòŠ‹Ö‹á‹\j€Œé ‘'‘G‘¨‘ª‘¹‘Û‘ä‘/’2’‰’Š’‹’˜’õ’ö’÷’“7“E“å“æ“ç“ô“””7”8”9”H”¤•±•Ü•Ý•Þ•ë•ö–ø–û–ü–ý–—™™ð›*œüõüîüéüâüÞüÚüÖüÒüÒüÎüÊüÅéüéüÁüéÅéüéÅéü½üéÅéü¶üéÅéü²üéÅéü¶üªÅªü¦üîhÉlˆhò8Œh]á6hïfì hÔòh]áh„p$hÐ_ h> 6h/U“hn
÷hYwÏh”Khÿ@-hd"  hÇ\h]á h]á6 h‹o_h]á hˆXh]áh]áAø–—a™b™™ï›ð›*œ8žZ [ ‹ u¢v¢’¢ô¤¢§˜«™«Ô«Õ®Ö®÷®¯…¯Ç°Þ±úõõúõõðëëëúõõúõõõõúõõðëææægdµ)ûgd]ágd]ágd]ágd]á*œÿœ» Ð 8¢9¢-¤.¤á§ê§ô§ß­à­Ö®÷®g´r´s´~´ª´¾´C¸D¸¦¸§¸‚»„»…»†»‡»Š¼‹¼V¿`¿ž¿Ÿ¿·¿¸¿È¿É¿Ê¿Ë¿ŠÀ‹À£À¤À´ÀµÀ¸À¹ÀÅÀÆÀÞÀüøüôüðüìüçßüÛüÔüÍüÍüÉüÅüÅüÁº³¯ü«üÔü£ü˜ü£”£ü£ü‰ü£”£ü£üj’h]áUhöj“‘h]áUjh]áUhkk]hØ{3 hYRh\¹ hYRh]áh\¹hèMÜhçBï hÝC‘h]á h‹o_h]áh×Uªh§"Bh]á6 hj8d6h“
‚h+âhqÙhg1h]á5Þ±ª³8µ:¶o¸j¹ºƒ»…»†»‡»³»U¿V¿`¿§Ã¨Ã©ÃÑÃÜÃ#Å^ÆúúúúúúúõðßßÚÚÒÚÚÍÈúµgd]á„È^„Ègd]ágd
>Kgd]ágd]á
& Fgd]ágd]á
Æ„„^„`„gd]ágdYRgdYRgdµ)ûÞÀßÀïÀðÀóÀôÀåÁæÁþÁÿÁÂÂÂÂúÂûÂÃÃ$Ã%Ã(Ã)çèéÃÑÃÛÃ}Ä~ÄÐÅÑÅ(Æ)ƴƵÆÜÆÝÆÇÇ^Ç_ÇÚÇÛÇ.È/ÈuÈvÈÊÈËÈÌÈÖÈ×ÈÙÈÚÈôðèäèðèðÙðèäèðèðÎðèäèðÇÀ¹²Ç©Ç©Ç©Ç¡ÇÇ©Ç©Ç©Ç©Ç•ÇðŽ‡ŽðŽ h]K†h]á hWhh]áhˆXh]áH*h¥lÐhˆXh]áKgd]ágdµ)ûgd]áÚÈÿÈÉɕɖɦɭɱÉ
ÊÊ$Ê%Ê~ÊÊñÊòÊIËJËgËlËpËÌÌÂÌÃÌÍÍhÍiͼͽÍÎ Î]Î^ÎdÎeηθÎ
Ï ÏÿÏÐÐ ÐÐÐ)Ð*Ð:Ð;ÐBÐCÐDÐGÐùñùñùèùäÝùÙùÙùÙùèùèùäÒùèùèùèùèùèùèùèùËùèùèùäùèäÀ¹«¹À¤›À¹hömHnHu hlŠhöjú“h*l±h]áU h*l±h]ájh*l±h]áU hÿ&&h]á hy¶h]áh¥lÐ hWhh]áh]áhˆXh]áNHhˆXh]á5 hˆXh]á8GÐHÐxÐyÐÑÑFÑGђғÒæÒçÒGÓqӝÓÏÓÐÓÑÓÜÓAÔqԐÔÇÔÛÔÜÔ8ÕhÕwÕՀÕÉÕÊÕæÕèÕñÕòÕúÕûÕÖ Ö×××Kgd]ágd]ágd]ágd]áZkd–$$If–FÖ0í$ (#7 Ö•Ö
ÿÿÿÿ%öööÖÿÿÖÿÿÖÿÿÖÿÿ4Ö
Faö3pÖ
ÿÿÿÿ%ñŽñžñŸñ¦ñ§ñ¨ñôôrõsõéö÷ö÷…÷÷‘÷\ú_ú(ü)üdüeüyüÜü
ý
ýýlý›ýÓý&þYþlþ…þ¤þb½žŸª«¬¶ôðèáØèðÑðÁðºð¶ð¶ð¯ðªð£›£ð£ð£›£ð£”£”£ð…}upu h]á6h¿rh]á6hj§h]á6h±bwh]á6 h’{âh]á hth]áh¯jCh]á6 h¯jCh]á h]á5 h¦bh]áh
LV h>qh]ájh]áUmHnHtH u hwöh]áhömHnHu hæ ¢höjh]áUh]áj”–h]áU+'þŽÿ¾–îr

 - ² `aŒÍÎ"ŸÎeâã”úúúúúúõðúúõëúúëúúæææÚúúúõ 
& F„õ^„õgdµ)ûgdµ)ûgd
>Kgd]ágd]ágd]ᶸÂÃÒåæè "#-é 
- € ž ' ( . ² µ ¶ Á  P
Q
›»ÆÇ_wŒ²½¾ÝÞŸùõñõìõùõìäÜìäÕõÕõÕõÍõÅõ¾õ¾µõ¾®õ®õ®õ®õ§õ®õ õñ‰õ…õhj „ hL1hµ)ûjhµ)ûUmHnHtH u hÞ
Øh]á hL h]á hWhh]áhˆXh]áNH hˆXh]áh§ih]á5h§ih]á6 hÛ*Jh]áh¿rh]á6hj§h]á6 h]á6hµ)ûh]á hB3h]á1Ÿ±²·¸ÍÎÏÖ×Ø"NOJW-2HOcjy¿Àáⱸ¿ÀÕÖ×Þßàkl~’ ­Óò…‡¶ÕTÏùôðèðÝèÙÐèðÉðÉðɾ····ðÂðÂð·ðèð¬èÙÐèÂðÂðÂðÂðÂðÂðœ·ð— h]á\jh]áUmHnHtH ujŠ—h]áU h-yh]áh‰>™ hµV2h]á hÞ
Øh]áhömHnHuhöj—h]áUjh]áUh]á h]á5 hth]á:Tž É!Q%'))T)E,F,M,e/'1›2œ2«2Q577(7R9›:µ:·:¸:ã:úõõõõõõúõõúõõõõúõõõúõõõõðëgd]ágd]ágd]ágd
>KÏÜFGß ö È!É!ý"ÿ"Á(Ã())")S)T)²)E,F,M,ä,ö-ý-š2›2œ2«2¸2O5ã6ä67(77 8888¸:ã:l;m;ùôïôçôßôÚôÕôÍÆÂƻ´ƭ¦Ÿ˜Æ­”»ƒÂ|»ÂuÂmjh]áU h‹o_h]á hÝYæh]áhWhh]á6] h5ãh]áhÁdC hÕ/9h]á hïrþh]á hiyh]á h-yh]á hý|>h]á hWhh]áh]á hÞ
Øh]áhsdhh]á\ hUSG\ h†;ë\h½k¼h]á\hÜh]á\ hg1\ h]á\ hL h]á*m;…;†;‡;ˆ;‰;ê=ë=ì=>>>> >!>">”B¢B!C3CŸC©C«C·C±D²DÇHÑH¿IÇIJJJšJºJÕJõJ5KUKK½KLÂ>í>?ÐA²D¿GJJ»JöJVK¾K L=L…LÄLMKMƒM»MÊM!N"N?Núúúõðëëëëëææææææææææææææëðgdµ)ûgd]ágd
>Kgd]ágd]áJMbM‚MšMºM»MÉM
N N"NŽXXTZ_ZÝ\Þ\ ]!]9]:];]@]A]ð`÷`+e,eAeBeCeJeKeLeºjÁjôjõjSmZmkmsmÎo×oúoûo—r§r¨rsžs`tet•t¥t¦tüøüøüøüøñüíüæüÖüÎüÃοÎüºüÎü¯Î¿¦ÎüºüŸü—üºüºüü‰ü‰ü‰ü‰ü‰ h
ah]á h×\h]áhË 8h]á6 h·cÆh]áhömHnHujv™h]áU h]á6höjû˜h]áUjh]áUjh]áUmHnHtH u hbëh]áhÁdC h®O„h]áhYRh]á6?NÓP\T™UBYaZbZ¡ZÝ\ÎaeÈgõjnûoüo-p¾q¿qâqKgd]ágd]á¦t©t¸tºtÍtàtátätuu’uÁuÓuÔuÕuØuâuãuv%vev‡v—vÕvàvžy«yÈ{É{M~u~2‡3‡í’ô’d“e“'œ:œ>œRœV¤x¤¤Š¤%¥3¥4¥=¥?¥@¥P¥W¥Y¥Z¥ˆ¦‘¦“¦”¦¸¨Á¨ʨó¨ô¨õ¨ö¨DªüõüõüõüõüõüõüõüõüõüõüõüõüîüõüçüãüÞüõüÞüÞü×ü×üÐüÐüÐüÐüÐüÉüÉü¾¶ü¯ü¯ü hg#h]áh]ámH sH hœ‚h]ámH sH hšs@h]á h^
¸h]á h^GRh]á h]á6hÁdC h˜D^h]á h¥íh]á h
ah]áh]áBoyÈ{É{ô{,}ü΂ñƒòƒ„œ†`ˆ´ŒµŒæŒ’d“e“–“P•U˜ќŸa¢Œ¤ö¨­­úúõúúúúúõúúúúõúúúúõúúúúúúúúúgd
>Kgd]áDªlªºªáª«8«‰«Š«€¬­¬­­­­ë®ì®¯¯¯¯¯`¶x¶ì¼í¼"Â#ÂñÌþÌLÍWÍYÍb͹ѺѹÒÄÒÇÒÐÒšÓ¥ÓüÓÔgÔnÔxÔ|Ô~Ô‰Ô‹Ô•ÔŸÔ´ÔÇÔÒÔÔÔùõîõîõêõãõîÜÕõÍõÂ;Íõºõ³õ¯õ¨õ¡õ¡õõ˜õõ˜õ˜õ˜õ˜õ˜õ˜õ˜õ˜õh§h]á6 h]á6hŸ@h h_:—h]á h…Éh]áhg1 hú^ h]áhÁdChöjñ™h]áUjh]áU h‹o_h]á hnXÏh]á hS‚h]áhX¥ h"øh]áh]á hêh]á7­­­
±µÆ·Ç·ü·»»&»¿P¿`ÁÀÃÁÃÐÃ#ÄÌÄ(Å„ÅÔÅdÆeÆÂÈnËúõððððëææáææÜÜæáæÜÜÜÜÜææægdµ)ûgd
>Kgd]ágd]ágd]ágd]ágd]ánËèÌéÌÍ£Ï$ÑnÒoÒŠÒÕ±×ÙÚóÛÍÝ#ÞÚމߊߕßââîå è
è=è·êÐî’ñ˜õúúõúúúúðúúúëëëëëúðúúúúðúúúúgdµ)ûgd
>Kgd]ágd]áÔÔÝÔæÔïÔÕÕ ØØ;Ø^Ø8Ú?Ú®Ú¯Ú¿ÚÀÚ ááá"á[ácáeánáç°ç è è
è„é…ééžéŸé¢é£é[êbê?òHò~ò…ò˜õ™õóöôö ÷
÷÷÷÷÷óîóçóßóÛóÓóÏóÏóÈóÈóÈóÈóÁóÁºó²ó§²£²ó›ó“óîóŒó²ó²£²jçšh]áU hs2Ðh]áhs2Ðh]á6h[^h]á6höjlšh]áUjh]áU h:Ph]á h,h]á hY
Õh]áh
lÖh•>«h]á6hGîh=uh]á6 hA%Qh]á h]á6h]áh_¿h]á62˜õ™õâõ÷÷íù÷þøþÿÖ  =Ë s
nÇ ¨iŠ‹–úõúúúúðúúúõúúëëëëëúõúúúúõúgdµ)ûgd]ágd
>Kgd]á÷#÷$÷÷C÷D÷’û”û}ü…üü—ü½hjgjlquv   D s



™©ÇßáîC!Z!6"7"Ž""H$T$b${$$…$†$Œ$Ž$“$”$–$,%5%ñ78F;G;_;üôüéôåôüáüáüáüÝüÙüÕüÕüÕüÑüÉüÄüÄüÄüÄüÄü½ü¶ü²ü²ü«ü«ü«ü«ü«ü«ü«ü§üôühKgd]ágdt)Š_;`;a;k;l;u;v;Ž;;;‘;’;==NEOE[I\IqIrIsIzI{I|I²L¹LºLD]F]žf©fýjþjkk9k:kMkNk{k|kkŽk©kªkÐkÑkìkík²mÒmZo[ozoôìèìäìäÙìèìäÕäÅäìäºìè±ì䪣äŸä˜ä”ä”ä”ä”ä”ä”ä”ä”ä”ääŒˆhm„híYÔh "ÛhC| hß:h]áh@Z hµ 'hžAÒ hµ 'h]áhömHnHujӜh]áUjh]áUmHnHtH uhKgd]á}kk«kÒkîk"l#lZo[o\ozo™sšs¿s6v±w²wÕwš{Å~Æ~ë~àúúúúúõõèèÛÖÖÎÉÉÉÄ¿¿ÉÄ¿gdO9XgdO9XgdO9X
& FgdO9Xgdm„ „Ç„–þ^„Ç`„–þgdm„ „Ç„–þ^„Ç`„–þgdµ 'gd]ágdµ)ûzoâopqq
q q'qøqrs%s™sšs¿s²wÔwÕw›zœzX{Z{[{^{D~F~t~w~Æ~ê~ë~è‚í‚ò‚ƒƒBƒøðøäøäØøÐøÈøÀ¹±­¦±ž±–±–±Ž±Ž±­¦±p`p`h½RhO9X6mH nH sH tH h—^~hO9XmH nH sH tH hÚO-hO9XmH nH sH tH h¡ønH tH huP€nH tH h–vnH tH  hJkPhO9XhO9XhO9XnH tH  h‹o_hO9XhHsdnH tH h¼jênH tH h'nnH tH h,ÿhm„5nH tH h½B²hm„5nH tH h+ânH tH hm„nH tH $BƒCƒDƒEƒ„ „I„J„V„†‚†#‡7‡8‡P‡Q‡a‡b‡l‡m‡ljɉ։剛Š¢Šɋʋ΋ڋTòâòâÖËÃËû󢖂y¢p¢Ã»Ã»ÃeÃ]YR] h‹o_h]áhQ4£h]ánH tH hÚO-hO9XnH tH hö6nH tH h?KB6nH tH &jNh?KBh?KB6UnH tH h?KBh?KB6nH tH  jh?KBh?KB6UnH tH h?KBnH tH h¼`ynH tH hO9XnH tH h$SÞhO9XnH tH hO9XmH nH sH tH h½RhO9X6mH nH sH tH h9:6mH nH sH tH à1…ê†,Šȋʋڋ¼ã›œPˆ’m”}•~•ò•{–s—t—´—?˜@˜ã˜kšlš»šúúúúõðëæáááááááááááááááááágd]ágd]ágd]ágd]ágdO9XgdO9XT»¼ãiŽsŽ•ŽöŽ›œ¦NOPVgˆ’Ž’’¸’:“;“S“T“U“X“Y“\“]“r“õíæíÛíÛíÛÍÁÛíµªžªí•í•í‰íz‰r‰íaUh0}h]á6nH tH  jh0}h]á6UnH tH hönH tH jɝh]áUnH tH jh]áUnH tH h]á5nH tH hì&®h]á5nH tH hì&®h]ánH tH h`Ch]á5nH tH hLˆh]á6nH tH hLˆh]á5\nH tH hLˆh]ánH tH  hJkPh]áh]ánH tH h

}h]ánH tH r“s“ƒ“„“©“ª“m”Ž”””¾”¿”۔ܔú”~•„•…•†•Š•”•³•´•ɕߕð•ò•ù•––z–{–ìãÒÊÒ··¦·Â·ÂšÂ†}qhq†\qSÂSh]á5nH tH ha66h‰Um6nH tH hšWÎ6nH tH ha66h]á6nH tH h]á6nH tH h‰Um6nH tH ha66h]ánH tH ha66h]á5nH tH  hLˆh]áOJQJ^JnH tH hLˆh]ánH tH h]ánH tH höhö6 jh0}h]á6UnH tH h0}6nH tH &jDžh0}h]á6UnH tH {––•–r—t—{—}—²—-˜=˜?˜@˜G˜I˜â˜ã˜™™išlšsšuš¹šºš»šúš›ٛܛã›å›wœxœyœ 5ãõíõåÜåÐŽÅåÜåÐŲª²åÜ垕žŠåŠåÜå~rgõå\hLˆh]ánH tH h‚8Gh]ánH tH h! 2h]á6nH tH híxh]á6nH tH hóWžh]ánH tH h]á6nH tH h¿?üh]á6nH tH hé&BnH tH hH{h]ánH tH hï>ínH tH h2¶h]ánH tH h2¶h]á6nH tH h]á5nH tH h]ánH tH h@5nH tH ho#]h]ánH tH $»šۛܛyœ ž€žŸ©Ÿ£ «¡¬¡ñ¥ó¥ù¥ú¥¿¦úúúúúúõõõõúúúìàà $$Ifa$gd]á $Ifgd]ágdµ)ûgd]áãéêÿžžž ž
ž ž
žž€ž«¡¬¡­¡á¡$¢&¢V¢X¢x¢z¢|¢~¢‚¢„¢†¢øìøÝìÙÐìøÅøžø®Åø‘}tk‘bQ jhé hé 6UnH tH hé 6nH tH hö6nH tH h]á6nH tH &j:Ÿh²h]á6UnH tH h²h]á6nH tH  jh²h]á6UnH tH jhôKgd]ágd]á/gdQ/gd]á»û¾ûGý]ýèýôýEKå¿B˜¢«¶ÏÙÚó + f g i j n o Î

I _ ™ š œ  ¡ ¢ t  B
P



kl‡’àîùûþÅÔ‚-1CúöïöïöëöäöàöØöÓöØöÓöÌöÈöÈöÈöÓöÓöÄöÄöÄöÓöÓöÀö¼ö¸ö°ö«ÓöÓö¤ö ö›ö h]á>*hj h˜pch]á hFuW5h_:uh]á5hg1h‰Qh>2âh`N¶h"L hth]á h]á5hOgþh]á5hŠKM h–(¹h]áh¦$ hÍh]áh]á h]á6=Î
t †‡’„-üý67XC¦?ÍÎ67|wV!!$^%Þ'úúúúúúúúõúúðúúëëëëúúðúúðúúúgdµ)ûgd]ágd
>Kgd]áCFrxyz’“”™šž³´ÄÅùúûü©ª67efgt­®¯¼¹Êàòˆ‰Š™Îßì5noüøñéßÚÊßÅßÚ¸° °¸˜¸ø‘øøøڈÚø€ˆ€øÚøÚøڈÚøyøyøuh ¦ hÊ 6h‰Q h\hh]áhöhö6jö·h¿|h]á6Uh¿|h]á6jh¿|h]á6U hö6j{·h¿|h]á6U h]á6jh]á6Uh\hh]á6 h6h#h]áh]áhj.ožŸ ­!±!¾!¿!Æ#$ž'Ÿ'·'¸'¹'º'»'¿'À'Ø'Ù'Ú'Û'Ü'Î)Ú)(*)*z*{*-Ž-”-•-É3Ê3Ë3ã3ä3ô3õ3ü3ý34µ4üôïôüëüëüäüÜüÑÜÍÜüÜüÂÜÍÜü»ü·ü³ü¯ü¯ü«ž–†ž|ž«ü hö6 hèTÈ6jg¹hèTÈh¥Ê6UhèTÈhèTÈ6jhèTÈhèTÈ6UhèTÈhâïhYsh‰Q hËy4h]ájì¸h]áUhöjq¸h]áUjh]áU hÕvh]áhûx h> 6hëÜh]á6h]á-Þ'ß'þ'Ü)K+-....Ü./é0Ô2E4j4ÿ5R8„8ß9 ý?A8AvA¥AÓAúõúúúúúõúðúúúðúúðúúúúúúççç9„8^„8gd]ágd]ágd
>Kgd]áµ4¶4·4Ä46F6::¤:±:J;K;^;_;de@r@8A;ATB‚BÀBƒC„CœCCžC¡C¢C¦C§C¿CÀCÁCÄCÅC@EBEòEóEÂGÃG÷ò÷îçîàîÙîÏîÏîÈîÁîºî³¨¡šî’ƒ’î’îx’ƒ’îtîšîph> hDNՁj]ºh]áUhöjâ¹h]áUjh]áU hðt\h]á hE|`h]áhÌjÔh]ámH sH  hÚ@Áh]á hÎ%h]á h´7h]á hÙbh]ájh]á0JU h«6h]á hÌjÔh]á h"®h]áh]á h> 6hÁ2çh]á6,ÓABBQBB‚BpDòEóEF†G[I,KôLõLÐMÒMN²OÀO+RˆU|V}VööööñññìçñâââññÕÐËçññññgd]ágd]á „„^„`„gd}»gdt)Šgd]á/gd]ágd]á9„8^„8gd]áÃGIžI
KK·M¿MÒMÖM×MÚMÛMéMêMN±O²OÙOÚOòOóOôO÷OøO^V_VÕYÖYKgd]á¸\Á\`"`eehe¤f¥f:hCh|h}h…l‡lm m‡mˆm m¡m¢m£m¤mÒnénRo[o«o°oupvpttKgd]ágd]áYÐ\ÐuÐxÐRÑSÑÊÒäÒéÒìÒkÓnÓ´Ó½ÓçÔèÔòÔdÕmÕÛÕÜÕêÕ]Ø^ØrØõÙþÙ(Û)Û.Û1Û2Û;Û5>¬?·?þ@ÿ@?CICûCüCDMD^DHGYG?I@IXIYIZIaIbIcIdIuIïKðKL L
LLLïLMcOvO­R·R¾RÝRpSúöúöúöúöúöúöòöúöëöúöúöãöúöòöúöÜöúöÕúöúöúöÍöÂ;Íö·úöÍö¬Í¾Íöúöúöúö¨öh§AqjÞÒh]áU h‰Yuh]áhöjcÒh]áUjh]áU hJxeh]á hVüh]áh3½h]á6 h¨=h]áhÀp¶h]á h]á6B =^=À>@ÿ@AüCrGdIªK«K³LÔL»O…R$TGT`V5X®ZÖZ¥]´_µ_Þ_$c1ekeúõõõðúõëõúúðúúúðúúúðúõúðúúðGgdÈLrgd]ágdµ)ûgd]ápSrS{S#T$TåUïU!X)X-X3XÞXèX­Z®ZòZüZ»[¼[Ñ[Ò[Ó[Ú[Ü[Ý[ñ[ \/\N\¤]¥]¦]§]Ä]~`ˆ`2aCaharasa}addédód0eúòîçîúîßî×îúîÐîúîÈî½È¹°Èî¬î¬î¥•úîúîúî…î~îúîúî hÂF4h]áhÂF4h]á6hth]á6jh]áUmHnHtH u hth]áh§AqhömHnHuhöjYÓh]áUjh]áU hL Eh]áhýFÀh]á6hýV/h]á6 h€fJh]áh]áh†$Eh]á6 h]á6.0e1e¥e¯eÓfÝf.g8g;gDgGgIgÁgÄghh&h.h2h=h^iriuiƒi‡i’i"jMjÇjÑjÓjÝjåjíjüjk#k0kËkßkâkík˜m¢mªm°m´m¿munn‡nnœn¥nkplp€qŠq%u6uÊuËuàuáuâuéuëuìu½xùõíõíõíõåõÞõÚõÕõåõåõÕõÕõÕõÑõÕõÕõÕõÕõÍõÕõÕõÕõÕõÕõÕõÕõÕõùõÕõÕõÅõºÅ¶­ÅõhömHnHuhöjÔÓh]áUjh]áUhÓ@Áh§Aq h]á6hj hÄ×h]áhÄ×h]á6h
þh]á6h]á h
þh]áDke.gh^iÓjËk˜munlpmp#sÔtàt$wÕz}}}Ü~Ý~ö~倣‚8†¨ˆp‹q‹úõõõõõõõúúúðúúúúëúúæúúúúúúgd
>Kgd]ágd]ágdµ)ûgd]á½xÈxþyÿyËzÌz·~¸~Í~Î~Ï~Ö~Ø~Ù~õ~ö~Àƒ˃{…š…ׅ̅7†8†]ˆgˆ§ˆ¨ˆKÚ©Û©ë©ì©ö©÷©þ©ÿ©ªª(ª)ª4ª5ª««1«2«3«?«@«Z¬b¬Ì­Ù­²*²ª·Ì·»!»)»3»Ò¿Ø¿Þ¿ß¿ã¿EÁÞÄðëÞÙÞÕÈÀ°ëÈÙȬ¤¬™¤•¤¬Õ¬Ž¬‡¬€¬y¬y¬rjrje¬ h]á\h™G[h]á\ h™G[h]á heÍh]á h39Öh]á h5Êh]á h‹o_h]áhöjÀÕh]áUjh]áUh]ájEÕh;r"h¶¼6Uh;r"h;r"6jh;r"h;r"6Uh;r" hö6jh;r"h]á6U h;r"6jÊÔh;r"h]á6U'Ë­Ì­Ù­8°9°Y°O³ú¸7»8»m»EÁÆÆCƇÈM;ϐԛÙ2Û3ÛiÛ%ß™à…å‡åúòúúíèèèèíèèèíèèèèèèèíèèèègd]ágd]á
& Fgd]ágd]áÞÄàÄÅÅÅÅÅpÑvÑ{Ò|ҁ҅ҍҤҭÒÚÒàÒ2Ó8ÓKÓSÓ¦Ô­ÔàØãØîâïâãã ã ã
ããã*ã+ã,ã8ã9ã‡å”åYèZèpèqètèuèŠè‹èŒè“è÷óè÷ä÷óÜóÜ×ó×ó×ó×óÏó×ó×óËó÷óÀ÷ä÷ó÷óµ÷ä÷ó®ó§ó—ó÷óŒ÷äj¬×h]áUjh]áUmHnHtH u haIÜh]á h‹o_h]áj1×h]áUj¶Öh]áUhjh€" h]á6 h]á6h (¯h]á6höj;Öh]áUh]ájh]áU3‡å”åYèZèpè1êzêµêoëì–ì)í*í=íÜîìí&í(í)í@íAíVíWíXí_íaíbíôíùíÜîéî–U˜X˜¢›±›¶›¼›¢Ÿ±Ÿ¢¢›¢œ¢}£~£f¥n¥„¥…¥¥ž¥®¥êÝÙÑÙÆѹÑٵ٭٨٤٨ٵٍّٜ٘مÙxp`¨j\ßhC’h]á6UhC’h]á6jhC’h]á6Uh±bwh]á6hÒ, hÕr‘h]áh€7h5£h]á6hj h]á6hï]•h]á6h "ÛhömHnHuhöjáÞh]áUjh]áUh]áhà`
h]áOJQJ^J*jh]áOJQJU^JmHnHsH u%P’T’••.•™›èŸœ¢¢°¢W¥ §o¨
ªÄ«ç­·®”°•°£° ¶Ú¹FºGºîééäéééééäéßßßßßßßéÚéééÕgd]ágd]ágdµ)ûgd]ágd]á$$$$
Ƹp#¤xa$gd]ᮥ¯¥»¥¼¥Æ¥Ç¥ߥà¥ð¥ñ¥ø¥ù¥ð¦ñ¦v®†®‡®±®ίϯ•°£°†³‡³”³•³GºHºIºRºSºXº‰»­»¾»Å»¼¼H¼U½f½†½‡½ˆ½•½–½c¾d¾l¾óîóæóæÖÑóîóÍÉÍÑÍÑÍÅ;ͺͺͳ¯«¤œ˜œ˜“˜Œ„˜“˜|“|“˜Œ„h1]ˆh$C6h1]ˆh$C5 hH'¯h$C h$C6h$ChH'¯h$C5 hG8ihB^ûhB^ûh\¹ h\h]áhy"x h‹o_h]áhØÁhˆ
xh]á h]á6j×ßhC’h]á6UhC’h]á6 hö6jhC’h]á6U0GºHºIºSº‰»¼¢¼&½ݽd¾,¿aÀxÁ¦Â§Â¨Â¶ÂåÃæÃôÃúòòåååàààåååÐ˺µµ­
& Fgd]ágd]á
& Fgd]á„`„gd]ágd$C$$„†„•þ^„†`„•þgd$Cgdµ)û „‰„“þ^„‰`„“þgd$C
& FgdB^ûgd]ál¾+¿,¿O¿*À9ÀNÀ_À`ÀaÀmÀwÁxÁ€Á¦Â§Â¨Â¶ÂÐÂÃÃ0ÃäÃæÃôÃÄÄÄÄuÄxÄyĚěĜIJÄÁÄòÄõÄöÄ÷Ä=Å@ÅüõíüèüèüáíüáÜüÕÑÊ»ѻѻѰ¤°•Ñ†|ÑtmÑm•m hÿTah]áh²vrh]á5hL h]á6] h]á6]h²vrh]á]h²vrh]á6 hL h]áh¥íh]á5mHsHh¥íh]ámHsH h§
£h]áh§
£h]á6 hS{õh]áh]á h$Ch$C h$C5 h
(òh$C h$C6h
(òh$C5 hH'¯h$Ch$C*ôÃÄyijĴÄöÄAŹźÅÆJÆlÆmÆ’ÆÈÆWÇXÇmÇ¿ÇìÇíÇ È)ÈCÈDÈnȔȩȪÈùùùôùùùôùùùôùùùôùùùôùùùôùùùôgdôrd$gd]á@ÅAšŹźÅÆÅÇÅÈÅ
ÆÆÆÆÆÆFÆGÆJÆzƐƒƓÆÅÆÇÆÈÆ0ÇPÇUÇXÇbÇiÇjÇlÇüôíüåÚåÎŹ®åÚ¢Ú嗋—„|„üuüuüj\Pjh×,ph]áhmH sH h/h]á5hmH sH h²vrh]ámH sH  hœ2Oh]áhœ2Oh]á6 h7h]áhÏ[zh]á5mH sH hÏ[zh]ámH sH hh•h]á6mH sH hh•h]ámH sH hh•h]á5mH sH h]á5mH sH ha_Ìh]á5mH sH hl h]ámH sH h]ámH sH  hÿTah]áh²vrh]á]h]álÇmÇnǻǾÇÀÇäÇæÇêÇìÇíÇùÇÈÈÈ È
È%È(È)È;ÈCÈDÈSÈkÈnÈoȐȓȪȶÈøíßíøÔȼíøµ­¨µ¤µœµ¤…zocoµ\µ¤Qh¥íh]ámHsH h]á6]h3Adh]á5mH sH h3Adh]ámH sH hUb=h]ámH sH hmv­h]ámH sH hmv­h]á]mH sH häXh]á6h]á h]á5häXh]á5 hÝYæh]áh×,ph]áhmH sH hƒ'h]áhmH sH hƒ'h]ámH sH h/h]á6hmH sH h²vrh]ámH sH h]ámH sH ¶ÈÌÈÐÈÑÈêÈíÈîÈÿÈÉÉ;ÉEÉNÉeÉiÉjÉ‹É—ÉïÉðÉöÉ÷ÉøÉÊ ÊÊÊÊóèÝÑÝɽ²Ýè« ” ‰}‰rjrj_XPXLXh]áh²vrh]á5 hL h]áháS±h]ámH sH h]ámH sH háS±h]ámH sH héA¤h]á6mH sH héA¤h]ámH sH héA¤h]á5mHsHhéA¤h]ámHsH h§
£h]áhäXh]ámH sH häXh]á]mH sH h]ámH sH häXh]á6mH sH h²vrh]ámH sH h¥íh]ámHsHh¥íh]á5mHsHªÈÐÈîÈ9É:É;ÉEÉiɏÉ÷ÉøÉÊÊ@ÊAÊXÊyÊ…Ê†Ê¯Ê ËEËFËcˍ˾˿ËÌùùùôïêùùùôùùùôùùùôùùùôùùùôùgd]ágd]ágdôrd$gd]áÊÊÊÊ@ÊAÊLÊTÊWÊXÊYÊuÊxÊyʅʆʔʫʮʯʰÊË
Ë Ë,Ë-Ë.ËDËFËSË_ËbËcËdˉˌˍ˥˧˾˿ËËËüËýËÌöïëïëïãïëïöïëïëïãïëïÛïëÓÌöïëÁµÁ­Á¡Á­•‡Á­|p|­hë&h]á5mH sH hl h]ámH sH h²vrh]á6]mH sH ha_Ìh]á]mH sH ha_Ìh]á6mH sH h]ámH sH ha_Ìh]á5mH sH h²vrh]ámH sH  h]á6]h²vrh]á]h²vrh]á6h²vrh]á5h]á hL h]áhL h]á6],ÌÌXÌYÌ[ÌaÌż̖̑̕ÌÍÍÍCÍDÍJÍKÍXÍaÍdÍeÍfÍàÍãÍäÍýÍÎ!Î"Î,Î-Î/ÎTÎXÎõéõáÙÒËÃ˸¬¸á •¸•¸‰¸á¸¬¸á {¸•php\phh•h]á5mHsHh]ámHsHhh•h]ámHsHh²vrh]á6]mH sH hEjh]á5mH sH hEjh]ámH sH hEjh]á]mH sH hEjh]á6mH sH h²vrh]ámH sH hsbh]á5 hsbh]á hh•h]áhh•h]á6h]ámH sH hë&h]á6mH sH hl h]ámH sH "Ì[ÌyÌzÌ•ÌÍJÍKÍeÍäÍ!Î"ÎXΫÎÅÎÆÎßÎÏ+Ï,ÏKÏ}ϪϫÏÈÏûÏOÐPÐnÐùùôùùùôùùùôùùùôùùùôùùùôùùùôùgdôrd$gd]áXÎYΧΫÎÒÎÛÎßÎàÎÏÏ,Ï;ÏGÏKÏLÏyÏ|Ï}φχϢϪϫϹÏÄÏÈÏÉÏ÷ÏúÏûÏPÐ]ÐùñíâÖâùÎíâ֓ ¬˜ŒŒ¬vjvcÎ\크 háS±h]á h,{Ùh]áhh•h]á5mH sH hh•h]ámH sH h/h]ámH sH h/h]á]mH sH h]ámH sH h/h]á6mH sH h²vrh]ámH sH hx-h]á5mHsHhx-h]ámHsHh/h]á6hh•h]á5mHsHhh•h]ámHsHh]áhEjh]á6 hL1h]á]ÐjÐmÐnÐoЎБВСТШЩвзлмнÐÑÑÑ6Ñ7Ñ:ÑVÑXÑ^Ñ_ÑlÑuÑyÑzÑóèàèÔèàÈ¿èà´¨´¡”Œ|”Œ”xpi¡xbZbèhh•h]á5 hh•h]á h/h]áh/h]á]h]ájRàh/h]á6Uh/h]á6jh/h]á6U h,{Ùh]áhsbh]á5mH sH hsbh]ámH sH h]á]mH sH h/h]á]mH sH h/h]á6mH sH h]ámH sH h²vrh]ámH sH h/h]á5mH sH nВШЩлÐ:Ñ^Ñ_ÑyÑÉÑßÑàÑùÑÒIÒJÒyÒ¶ÒêÒëÒÓ'ÓuÓvÓ’Ó²ÓÌÓÍÓôÓùùôùùùôùùùôùùùôùùùôùùùôùùùôùgdôrd$gd]ázÑÅÑÈÑÉÑØÑëÑõÑùÑúÑÒÒÒBÒHÒIÒJÒZÒuÒxÒyÒzÒ²ÒµÒ¶Ò¾ÒâÒëÒöÒþÒÓÓÓ#Ó&Ó'ÓsÓuÓvÓóèàÔɽÉèóèà±è¢àè–èàèóèà‹‹è–èàèqèàeèàhäXh]á\mH sH häXh]á6\mH sH hh•h]á]mH sH hh•h]ámH sH häXh]á5mH sH h²vrh]á6]hmH sH häXh]á]mH sH hh•h]á5mHsHhh•h]ámHsHhh•h]á]mHsHh]ámH sH h²vrh]ámH sH häXh]á6mH sH %vӂӎӏӑӒӓӮӱӲÓÄÓÍÓàÓðÓóÓôÓõÓ
ÔÔiÔjÔ•Ô§Ô¨Ô©ÔµÔ¹Ô»ÔÕÔ¸Õ¹ÕùñìùèùàùèØÑÊñÊèÑÂÑ·¬¥•Štl`Ulhíjh]ámH sH híjh]á6mH sH h]ámH sH h! °h]ámH sH h‰\h]ámH sH h&R¶h]ámH sH h&R¶h]á5CJaJmH sH  h‹o_h]áhmv­h]ámH sH häXh]ámH sH hsbh]á6 h;S?KNwxyz²³´µáâãäåýþÿ÷ó÷ó÷óéãéãßØßéãéÍéãßÆß»³»ßØߨߡߙŽ¡ß†ß{†ß†ß†ßj®áhöUjhöUh\höB*ph€€€höB*ph€€€ há6„höhO9XhöB*ph™™™höB*ph™™™há6„höB*ph™™™ hmPçhöh€h0J%mHnHu hØ{3höhö
hö0J%jhö0J%UhY=µjhY=µU- !*+,-./0;?wxyz²³´µýýñäýäýß×ñäýÒýÊýßýÂý½ý*gdá6„*$a$gdO9X*$a$gdá6„gdmPç$a$gdmPç*gdØ{3 $„h„h]„h`„hgdIy $„ðÿ„&`#$gdíYÔµâãäNOPŽ±²³´Ý 
  
     ÷òðèãðÛðÛðÖðÑÉÖðððÖðððð$a$gd\gdö*gd˜.”$a$gdYgdmPç$a$gdIt³*gdá6„$a$gdá6„LMNOPŽ°±²³´µÊËÛÜ  

     3 4 6 7 9 Â!Ã!Ä!Å!Ü!ôìåìÞ×ÓËÀÓËÀÓÀÓ°¥’¥°‡°¥Ó¥ÓƒÓìÓìzìÓseÓìÓhÚS hö5mHnHu hö56hömHnHuhY=µhöhöB*ph™™™$j¤âh0UhöB*Uph™™™h0UhöB*ph™™™jh0UhöB*Uph™™™h\höB*ph€€€höB*ph€€€hö hmPçhö hIt³hö h‹o_höjhöUj)âhöU'    Ã!Ä!à!á!""#"?"@"Ô"Õ"ñ"ò"Q#R#S#o#p#é#ê#$$n$o$ýýýõýðýëýðýëýðýëýýðýëýðýëægd0@gd]ágd]á$a$gd]áÜ!Ý!Þ!ß!è!é!ÿ!""""!"""#"$";""G"H"^"_"a"b"d"Ó"Ô"Õ"Ö"í"î"ï"ð"ù"ú"#####P#Q#S#T#k#ìäÜØÜØÜÏÜØȺØÜاŸÜØÜØÜÏÜØȺØÜ،„ÜØÜØÜÏÜØȺØÜØj¤7höU%jH³/D
höCJUVaJnH tH jæ=höU%jŠÐ/D
höCJUVaJnH tH hÚS hö5mHnHu hö56hömHnHuhöjhöUjãhöU%j‚CD
höCJUVaJmH sH -k#l#m#n#w#x#Ž##‘#’#”#è#é#ê#ë#$$$$$$%$&$($)$+$m$n$o$p$‡$ˆ$‰$Š$“$”$ª$«$­$®$°$%%%%+%ìäÜØÜØÜÏÜØȺØÜاŸÜØÜØÜÏÜØȺØÜ،„ÜØÜØÜÏÜØȺØÜØj¥höU%j«¯/D
höCJUVaJnH tH j‹qhöU%jç±/D
höCJUVaJnH tH hÚS hö5mHnHu hö56hömHnHuhöjhöUjYJhöU%j_°/D
höCJUVaJnH tH -o$‹$Œ$%%/%0%’%“%¯%°%I&J&f&g&Ó&Ô&ð&ñ&w'x'”'•'ú'û'((‹(Œ(úøóøúøóøúøóøúøóøúøóøúøóøúøóøgd]ágd]á+%,%-%.%7%8%N%O%Q%R%T%‘%’%“%”%«%¬%­%®%·%¸%Î%Ï%Ñ%Ò%Ô%H&I&J&K&b&c&d&e&n&o&…&†&ˆ&‰&‹&Ò&Ó&Ô&Õ&ì&ìäÜØÜØÜÏÜØȺØÜاŸÜØÜØÜÏÜØȺØÜ،„ÜØÜØÜÏÜØȺØÜØj`ÒhöU%jü«/D
höCJUVaJnH tH jÃhöU%jÕ¬/D
höCJUVaJnH tH hÚS hö5mHnHu hö56hömHnHuhöjhöUj©°höU%j@®/D
höCJUVaJnH tH -ì&í&î&ï&ø&ù&'''''v'w'x'y''‘'’'“'œ''³'´'¶'·'¹'ù'ú'û'ü'((((( (6(7(9(:(