Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,13 @@
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La cellule ci-dessus génère un dataset de classification binaire avec deux amas gaussiens 2D fortement chevauchants. Les 120 points répartis en 2 classes présentent environ 45% de chevauchement, ce qui crée un paysage d'accuracy accidenté où une simple séparation linéaire ne peut pas obtenir de bonnes performances. Ce dataset est spécifiquement conçu pour tester la robustesse des méthodes de tuning d'hyperparamètres face à un problème difficile mais pas impossible, où les performances varient significativement selon les paramètres choisis (k, distancePower, weightBlend), et où les interactions non linéaires entre dimensions rendent l'optimum étroit et hors de portée d'une exploration purement analytique — d'où le recours aux stratégies systématiques, aléatoires et adaptatives comparées dans la suite de ce notebook. La graine fixe le tirage (seed 2026) : toutes les méthodes optimisent exactement le même paysage, les comparaisons sont reproductibles."
]
},
{
"cell_type": "markdown",
"id": "8bee9a34",
Expand Down Expand Up @@ -193,6 +200,13 @@
"display(Markdown(f\"**Sanity** : k=5, p=2, wb=0.5 -> accuracy CV = **{acc_sanity:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le test de sanity check confirme que notre implémentation from-scratch du k-NN fonctionne correctement : avec les paramètres par défaut k=5, p=2 (distance euclidienne), et wb=0.5 (mélange à parts égales entre pondération par la distance et vote uniforme), le classifieur atteint exactement 0.700 d'accuracy en validation croisée 3-fold sur ce dataset exigeant. Ce résultat de base sert de référence cruciale pour évaluer l'amélioration apportée par les différentes stratégies de tuning d'hyperparamètres explorées dans la suite du notebook, et valide de manière fiable que notre implémentation est correcte avant de lancer toute comparaison de méthodes."
]
},
{
"cell_type": "markdown",
"id": "b9240b95",
Expand Down Expand Up @@ -252,6 +266,13 @@
"display(Markdown(f\"**Grid Search** ({len(grid_hist)} evals) : best = k={int(grid_best[0])}, p={grid_best[1]:.1f}, wb={grid_best[2]:.2f} -> **{grid_val:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le Grid Search a évalué de manière exhaustive 125 combinaisons différentes des trois hyperparamètres : k parmi {1, 3, 5, 9, 15}, p parmi {1.0, 1.5, 2.0, 3.0, 4.0}, et wb parmi {0, 0.25, 0.5, 0.75, 1.0}. La configuration optimale identifiée est k=15 voisins, p=1.5 (distance de Minkowski d'ordre 1.5), et wb=0.50, atteignant une accuracy de 0.733. Cette amélioration de 0.033 par rapport au sanity check démontre clairement la valeur d'une recherche systématique, même si elle reste coûteuse avec 125 évaluations complètes du pipeline de validation croisée."
]
},
{
"cell_type": "markdown",
"id": "7c3f38c9",
Expand Down Expand Up @@ -309,6 +330,13 @@
"display(Markdown(f\"**Random Search** ({len(rs_hist)} evals) : best = k={int(rs_best[0])}, p={rs_best[1]:.1f}, wb={rs_best[2]:.2f} -> **{rs_val:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le Random Search, en échantillonnant aléatoirement l'espace des hyperparamètres pendant 50 itérations, a identifié la configuration k=13, p=2.7, wb=0.30 avec une accuracy de 0.733, égalant ainsi la performance du Grid Search avec seulement 40% du budget. Ce résultat illustre parfaitement le principe théorique de Bergstra et Bengio (2012) : dans un espace de recherche structuré comme celui-ci, un simple échantillonnage aléatoire peut être aussi efficace qu'une recherche exhaustive, surtout lorsque le nombre de dimensions est élevé et que seules certaines combinaisons sont prometteuses."
]
},
{
"cell_type": "markdown",
"id": "3c7c2214",
Expand Down Expand Up @@ -458,6 +486,13 @@
"display(Markdown(f\"**Bayesian Opt** ({len(bo_hist)} evals) : best = k={int(bo_best[0])}, p={bo_best[1]:.2f}, wb={bo_best[2]:.2f} -> **{bo_val:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'optimisation bayésienne implémente un processus gaussien avec noyau RBF (Squared Exponential) et utilise l'Expected Improvement comme fonction d'acquisition. En seulement 20 évaluations (soit 6 fois moins que Grid Search), elle converge vers la configuration k=11, p=2.29, wb=1.00 avec une accuracy de 0.725. Bien que légèrement inférieure au Grid Search en performance absolue, cette méthode démontre une excellente efficacité par évaluation, exploitant le modèle probabiliste pour guider la recherche vers les zones prometteuses de l'espace des paramètres."
]
},
{
"cell_type": "markdown",
"id": "cell-bo-72d9369e",
Expand Down Expand Up @@ -579,6 +614,13 @@
"display(Markdown(f\"**Genetic Algo** ({len(ga_hist)} evals) : best = k={int(ga_best[0])}, p={ga_best[1]:.2f}, wb={ga_best[2]:.2f} -> **{ga_val:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'algorithme génétique implémenté avec sélection par tournoi, crossover arithmétique et mutation gaussienne a atteint une accuracy de 0.758 en seulement 50 évaluations réparties sur 6 générations avec une population de 8 individus. La configuration optimale trouvée est k=13, p=3.09, wb=0.08. Ce résultat est particulièrement remarquable car il surpasse toutes les méthodes précédentes avec un budget réduit de 60% par rapport au Grid Search, démontrant ainsi l'excellente efficacité des stratégies d'optimisation inspirées de la biologie pour naviguer dans des espaces de recherche complexes et multimodaux."
]
},
{
"cell_type": "markdown",
"id": "24032017",
Expand Down Expand Up @@ -693,6 +735,13 @@
"display(Markdown(f\"**PSO** ({len(pso_hist)} evals) : best = k={int(pso_best[0])}, p={pso_best[1]:.2f}, wb={pso_best[2]:.2f} -> **{pso_val:.3f}**\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le Particle Swarm Optimization, avec 8 particules évoluant sur 8 itérations, a également atteint l'accuracy maximale de 0.758 avec la configuration k=13, p=3.23, wb=0.07. La méthode PSO combine l'inertie, les composantes cognitives et sociales pour guider chaque particule vers les meilleures régions de l'espace de recherche. Le fait qu'elle égalise le Genetic Algorithm avec seulement 31 évaluations montre la robustesse et l'efficacité des méthodes d'optimisation basées sur les essaims pour ce type de problème de tuning d'hyperparamètres."
]
},
{
"cell_type": "markdown",
"id": "fa35d4cf",
Expand Down Expand Up @@ -785,6 +834,13 @@
" display(Markdown(\"**Optuna non installe** : executer `pip install optuna` pour activer le pont SOTA. Comparaison numerique sautee.\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Optuna, en utilisant l'algorithme TPE (Tree-structured Parzen Estimator) avec 60 essais, a trouvé la configuration k=10, p=3.36, wb=0.20 avec une accuracy de 0.733. Ce résultat sert de référence industrielle cruciale pour valider notre implémentation pédagogique from-scratch de l'optimisation bayésienne. L'écart de +1.1% en faveur d'Optuna est positif et attendu, car Optuna utilise des techniques avancées comme le pruning (élagage des branches non prometteuses) et des estimateurs de densité de probabilité plus sophistiqués que notre implémentation GP basique. Cependant, notre implémentation transparente permet une compréhension profonde des mécanismes sous-jacents du processus gaussien et du critère EI, tandis qu'Optuna agit comme une boîte noire."
]
},
{
"cell_type": "markdown",
"id": "b63feb3b",
Expand Down Expand Up @@ -877,6 +933,13 @@
" f\"| Particle Swarm | {len(pso_hist)} | **{pso_val:.3f}** |\\n\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le tableau comparatif révèle des différences significatives entre les méthodes testées : Genetic Algo et PSO atteignent tous deux 0.758 de précision avec seulement 50 et 31 évaluations respectivement, surpassant ainsi Grid Search (125 évaluations, 0.733). Bayesian Opt (20 évaluations, 0.725) démontre une excellente efficacité par évaluation mais est légèrement devancée en performance absolue. Random Search (50 évaluations, 0.733) égale Grid Search avec seulement 40% du budget (50 évaluations contre 125). Ces résultats montrent clairement que les méthodes stochastiques intelligentes surpassent les approches exhaustives dans cet espace de recherche complexe, où la dimension et la structure de l'espace jouent un rôle crucial dans l'efficacité de l'optimisation, et illustrent l'importance du compromis exploration-exploitation."
]
},
{
"cell_type": "markdown",
"id": "6ca9d182",
Expand Down Expand Up @@ -931,6 +994,13 @@
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La grille de heatmap visualise les performances d'accuracy pour toutes les combinaisons de k (de 1 à 21 par pas de 2, comme l'énumère `np.arange(1, 22, 2)`) et p (de 1.0 à 4.0 en 16 valeurs régulières via `np.linspace(1.0, 4.0, 16)`), avec weightBlend figé au meilleur trouvé par la Bayesian Optimization (`bo_best`), la borne `np.clip(bo_best[2], 0.0, 1.0)` garantissant que le wb reste dans le domaine valide. Cette visualisation bidimensionnelle permet d'identifier clairement les régions de haute performance dans l'espace des hyperparamètres, ainsi que les plateaux où les variations de k ou p ont peu d'impact sur l'accuracy finale. Les optima trouvés par GA (k=13, p=3.09) et PSO (k=13, p=3.23) se situent dans la même région p≈3, k=13 : la heatmap offre la vue d'ensemble dont ces deux points sont des témoins ponctuels, et désigne les zones à explorer en priorité lorsque le budget d'évaluation est limité — information précieuse pour cadrer un tuning avant de dépenser le moindre crédit d'évaluation."
]
},
{
"cell_type": "markdown",
"id": "a77c5c96",
Expand Down Expand Up @@ -971,4 +1041,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
78 changes: 65 additions & 13 deletions MyIA.AI.Notebooks/Search/Part2-CSP/CSP-9-Distributed-Csharp.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
" The below script needs to be able to find the current output cell; this is an easy method to get it.\r\n",
" </div>\r\n",
" <script type='text/javascript'>\r\n",

" function timeout(ms, promise) {\r\n",
" return new Promise(function (resolve, reject) {\r\n",
" setTimeout(function () {\r\n",
Expand All @@ -44,10 +43,7 @@
" })\r\n",
" }\r\n",
"\r\n",


"\r\n",

"\r\n",
" if (!rootUrl.endsWith('/')) {\r\n",
" rootUrl = `${rootUrl}/`;\r\n",
Expand All @@ -62,7 +58,6 @@
" headers: {\r\n",
" 'Content-Type': 'text/plain'\r\n",
" },\r\n",

" }));\r\n",
"\r\n",
" if (response.status == 200) {\r\n",
Expand All @@ -74,8 +69,6 @@
" }\r\n",
"}\r\n",
"\r\n",


" .then((root) => {\r\n",
" // use probing to find host url and api resources\r\n",
" // load interactive helpers and language services\r\n",
Expand Down Expand Up @@ -124,13 +117,11 @@
" \r\n",
" \r\n",
" require_script.onload = function() {\r\n",

" };\r\n",
"\r\n",
" document.getElementsByTagName('head')[0].appendChild(require_script);\r\n",
"}\r\n",
"else {\r\n",

"}\r\n",
"\r\n",
" </script>\r\n",
Expand Down Expand Up @@ -865,6 +856,14 @@
"}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'ABT résout la coloration du cycle 0-1-2-3-0 avec 3 couleurs : la solution rendue est {0=R, 1=G, 2=R, 3=B}, obtenue en 10 messages et 0 nogoods. La vérification passe les 4 arêtes : Arete 0-1 (R vs G), 1-2 (G vs R), 2-3 (R vs B) et 3-0 (B vs R), toutes OK — chaque noeud voisine deux couleurs différentes, la contrainte est satisfaite sans aucun apprentissage de nogood."
],
"id": "lecture-g73-10"
},
{
"cell_type": "markdown",
"id": "d6ee1c81",
Expand Down Expand Up @@ -911,9 +910,7 @@
},
{
"data": {
"text/plain": [

]
"text/plain": []
},
"metadata": {},
"output_type": "display_data"
Expand Down Expand Up @@ -1437,6 +1434,14 @@
"Console.WriteLine($\"\\nMessages totaux : {systemHosp.TotalMessages}\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'ordonnancement multi-hôpital privacy-preserving aboutit à trois créneaux distincts : Hopital 0 : Lundi_AM, Hopital 1 : Lundi_PM, Hopital 2 : Mardi_AM — la contrainte AllDifferent sur les 5 créneaux partagés est satisfaite en 4 messages totaux. Chaque agent rapporte privacy=high et constraints privees=0 : les préférences internes ne fuient pas dans la solution, c'est l'objet même du PrivacyPreservingAgent."
],
"id": "lecture-g73-23"
},
{
"cell_type": "markdown",
"id": "786087d8",
Expand Down Expand Up @@ -1693,6 +1698,14 @@
"PrintBenchSummary(\"AWC\", benchmarkResults[\"AWC\"]);\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le benchmark (5 agents, domaine 3, densité 0,5, 3 runs) donne une égalité parfaite : ABT comme AWC résolvent les 3 instances, avec les mêmes compteurs par run (10, 10, 12 messages) et la même moyenne 10,7 messages, 0,0 nogoods, succes 100,0%. À cette taille de problème, le réordonnancement dynamique de l'AWC n'apporte aucun gain — il faut monter en densité (comparaison suivante) pour voir les deux algorithmes se différencier."
],
"id": "lecture-g73-27"
},
{
"cell_type": "markdown",
"id": "c2a79964",
Expand Down Expand Up @@ -1883,6 +1896,14 @@
" Console.WriteLine(\"Aucune solution trouvee pour n=6 (essayer avec max_iter plus eleve).\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les N-reines distribuées (n=6) sont résolues par ABT : Solution {0->1, 1->3, 2->5, 3->0, 4->2, 5->4}, Valide : True — une reine par ligne et par colonne, aucune paire en diagonale. Le plateau imprimé matérialise l'affectation colonne -> ligne, chaque ligne portant exactement un Q : la contrainte binaire NQueensConstraint (lignes différentes, |Δcolonne| ≠ |Δligne|) est vérifiée pairwise par les agents."
],
"id": "lecture-g73-31"
},
{
"cell_type": "markdown",
"id": "61b24cb8",
Expand Down Expand Up @@ -2069,6 +2090,14 @@
"}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La comparaison par densité (6 agents, 5 runs par point) sépare les algorithmes là où le benchmark précédent les confondait : à densité 0,30, ABT et AWC affichent 100 % de succès avec 22,8 messages chacun et 0,0 nogood ; à 0,50, ABT garde 80 % de succès contre 60 % pour AWC mais paie 159,4 messages contre 62,0, avec 35,8 nogoods contre 2,2 ; à 0,70, c'est 80 % contre 60 % avec cette fois 54,4 messages pour ABT contre 65,0 pour AWC. Le réordonnancement dynamique de l'AWC achète des économies de messages à densité moyenne, mais le gain s'inverse quand le graphe se densifie davantage."
],
"id": "lecture-g73-36"
},
{
"cell_type": "markdown",
"id": "9024bb05",
Expand Down Expand Up @@ -2272,6 +2301,14 @@
" Console.WriteLine(\"Echec de la negociation\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La négociation à préférences secrètes converge en 9 messages : Agent 0 -> slot_0 (utilite secrete = 5), Agent 1 -> slot_4 (4), Agent 2 -> slot_2 (4), Agent 3 -> slot_1 (5), pour un bien-être social de 18 / max theorique 20. Les utilités restent privées — aucune n'est révélée dans les messages — et l'allocation atteinte n'est qu'à 2 points de l'optimum théorique : la qualité dépend de l'ordre de négociation, pas d'un oracle central."
],
"id": "lecture-g73-41"
},
{
"cell_type": "markdown",
"id": "f225f1c3",
Expand Down Expand Up @@ -2486,6 +2523,14 @@
"Console.WriteLine($\"Reduction moyenne : {(avgStd > 0 ? 1 - avgMin/avgStd : 0):P0}\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La mesure de fuite compare l'ABT standard au MinimalDisclosureAgent sur 5 runs : les réductions vont de 45 % à 75 % (54 %, 64 %, 75 %, 58 %, 45 %), pour des moyennes de 21,4 revelations côté standard contre 9,0 côté minimal — réduction moyenne 58 %. Les deux variantes résolvent tous les runs (True/True) : limiter la divulgation dans les messages ok? ne coûte rien à la complétude ici, uniquement au volume d'information révélé."
],
"id": "lecture-g73-46"
},
{
"cell_type": "markdown",
"id": "ab71154d",
Expand Down Expand Up @@ -2721,6 +2766,13 @@
"Console.WriteLine(\"- Appliquer aux smart grids et reseaux peer-to-peer\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le résumé final de ce notebook souligne qu'il couvre de manière complète et pratique l'ensemble des concepts des Constraint Satisfaction Problems distribués (DisCSP). Les sept concepts principaux abordés sont : la formalisation DisCSP avec agents et contraintes inter-agent, l'Asynchronous Backtracking (ABT) comme algorithme de base proposé par Yokoo en 1992, le mécanisme de messages (ok?, nogood, addlink, stop), l'apprentissage par nogoods et les vues agent_view, l'Asynchronous Weak-Commitment (AWC) pour le réordonnancement dynamique proposé par Yokoo en 1995, la préservation de la confidentialité avec PrivateConstraint et PrivacyPreservingAgent, et enfin les applications concrètes à l'ordonnancement multi-hôpital et à la négociation de préférences secrètes. L'implémentation est intégralement réalisée en C# from scratch, sans dépendre de solveur externe, car l'algorithme distribué est un protocole de messages pur, sans moteur centralisé."
]
},
{
"cell_type": "markdown",
"id": "3bff6eac",
Expand Down Expand Up @@ -2811,4 +2863,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
Loading