diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb index 321fba8897..991f5dc616 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb @@ -5,10 +5,10 @@ "id": "3752b8ab", "metadata": { "papermill": { - "duration": 0.004, - "end_time": "2026-09-16T09:58:06.248585", + "duration": 0.005005, + "end_time": "2026-10-05T10:32:34.261294+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.244585", + "start_time": "2026-10-05T10:32:34.256289+00:00", "status": "completed" }, "tags": [] @@ -32,10 +32,10 @@ "id": "5308eeac", "metadata": { "papermill": { - "duration": 0.003393, - "end_time": "2026-09-16T09:58:06.256086", + "duration": 0.002263, + "end_time": "2026-10-05T10:32:34.266638+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.252693", + "start_time": "2026-10-05T10:32:34.264375+00:00", "status": "completed" }, "tags": [] @@ -62,16 +62,16 @@ "id": "3cabb4ce", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.263686Z", - "iopub.status.busy": "2026-09-16T09:58:06.263686Z", - "iopub.status.idle": "2026-09-16T09:58:06.272612Z", - "shell.execute_reply": "2026-09-16T09:58:06.271994Z" + "iopub.execute_input": "2026-10-05T10:32:34.272462Z", + "iopub.status.busy": "2026-10-05T10:32:34.272254Z", + "iopub.status.idle": "2026-10-05T10:32:34.279446Z", + "shell.execute_reply": "2026-10-05T10:32:34.278765Z" }, "papermill": { - "duration": 0.015034, - "end_time": "2026-09-16T09:58:06.273131", + "duration": 0.011402, + "end_time": "2026-10-05T10:32:34.280281+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.258097", + "start_time": "2026-10-05T10:32:34.268879+00:00", "status": "completed" }, "tags": [] @@ -99,10 +99,10 @@ "id": "9747f6fd", "metadata": { "papermill": { - "duration": 0.004292, - "end_time": "2026-09-16T09:58:06.282382", + "duration": 0.002127, + "end_time": "2026-10-05T10:32:34.284792+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.278090", + "start_time": "2026-10-05T10:32:34.282665+00:00", "status": "completed" }, "tags": [] @@ -121,16 +121,16 @@ "id": "6c058f3d", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.292099Z", - "iopub.status.busy": "2026-09-16T09:58:06.292099Z", - "iopub.status.idle": "2026-09-16T09:58:06.304369Z", - "shell.execute_reply": "2026-09-16T09:58:06.303362Z" + "iopub.execute_input": "2026-10-05T10:32:34.290274Z", + "iopub.status.busy": "2026-10-05T10:32:34.290107Z", + "iopub.status.idle": "2026-10-05T10:32:34.297419Z", + "shell.execute_reply": "2026-10-05T10:32:34.296862Z" }, "papermill": { - "duration": 0.019029, - "end_time": "2026-09-16T09:58:06.305369", + "duration": 0.011187, + "end_time": "2026-10-05T10:32:34.298099+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.286340", + "start_time": "2026-10-05T10:32:34.286912+00:00", "status": "completed" }, "tags": [] @@ -230,10 +230,10 @@ "id": "53458120", "metadata": { "papermill": { - "duration": 0.005396, - "end_time": "2026-09-16T09:58:06.312767", + "duration": 0.002379, + "end_time": "2026-10-05T10:32:34.302934+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.307371", + "start_time": "2026-10-05T10:32:34.300555+00:00", "status": "completed" }, "tags": [] @@ -252,16 +252,16 @@ "id": "b7c970a1", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.322858Z", - "iopub.status.busy": "2026-09-16T09:58:06.322332Z", - "iopub.status.idle": "2026-09-16T09:58:06.382996Z", - "shell.execute_reply": "2026-09-16T09:58:06.382996Z" + "iopub.execute_input": "2026-10-05T10:32:34.309042Z", + "iopub.status.busy": "2026-10-05T10:32:34.308862Z", + "iopub.status.idle": "2026-10-05T10:32:34.369039Z", + "shell.execute_reply": "2026-10-05T10:32:34.368516Z" }, "papermill": { - "duration": 0.06769, - "end_time": "2026-09-16T09:58:06.384639", + "duration": 0.064376, + "end_time": "2026-10-05T10:32:34.369967+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.316949", + "start_time": "2026-10-05T10:32:34.305591+00:00", "status": "completed" }, "tags": [] @@ -308,10 +308,10 @@ "id": "e18ad0e3", "metadata": { "papermill": { - "duration": 0.00519, - "end_time": "2026-09-16T09:58:06.391835", + "duration": 0.002521, + "end_time": "2026-10-05T10:32:34.375385+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.386645", + "start_time": "2026-10-05T10:32:34.372864+00:00", "status": "completed" }, "tags": [] @@ -322,15 +322,83 @@ "Sur 60 exécutions (3 tailles × 20 graines), **zéro** violation : chaque mouvement accepté décroît strictement Φ, aucun état ne franchit la barrière LP, aucune exécution ne dépasse son plafond d'évaluations. La partie inconditionnelle de la loi de `Descent.lean` — `descent_flips_le_barrier` — se transporte intacte du cadre Lean au paysage combinatoire : **la descente sous budget termine toujours**. Ce n'est pas une propriété de MEALPy ou d'un algorithme particulier : c'est la conséquence arithmétique de « strictement décroissant + confiné »." ] }, + { + "cell_type": "markdown", + "id": "ex11d-m2", + "metadata": { + "papermill": { + "duration": 0.002346, + "end_time": "2026-10-05T10:32:34.380094+00:00", + "exception": false, + "start_time": "2026-10-05T10:32:34.377748+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 2 — la barrière est une hypothèse, pas une constante\n", + "\n", + "`hbarrier` n'est pas une propriété du substrat : c'est une **hypothèse** du théorème de `Descent.lean`, et le majorant `lp` qu'elle utilise est un **choix**. Une barrière plus serrée raccourcit le plafond théorique du nombre de pas acceptés — `descent_flips_le_barrier` majore les flips par l'écart entre le potentiel initial et la barrière. Choisir la borne triviale `0` au lieu de `lp` ne change **pas** la descente observée, mais change **ce que la loi promet** : le plafond devient la valeur initiale elle-même, donc un majorant si lâche qu'il n'interdit plus rien.\n", + "\n", + "**Objectif** : mesurer l'écart entre le plafond théorique et les pas réellement observés, pour les deux barrières — c'est la différence entre *une loi qui contraint* et *une loi qui décore*.\n", + "\n", + "- **Étape 1** : écrire `plafond_theorique(...)` qui rend le majorant de pas selon la barrière retenue (`lp`, ou la borne triviale).\n", + "- **Étape 2** : sur 30 instances, comparer ce majorant au nombre de pas réellement acceptés par `descente_sous_budget`, et rapporter le **taux d'occupation** (pas observés / plafond) pour chaque barrière.\n", + "- **Indice** : avec la borne triviale, le taux d'occupation s'effondre — le plafond n'est plus contraignant. C'est le signe qu'une hypothèse portait tout le contenu du théorème.\n", + "\n", + "**Pourquoi cet exercice est ici** : la barrière est introduite en §2 (`borne_lp` et la clé `lp` du dict de retour) ; l'exercer demande l'instrument, pas la courbe de §4.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ex11d-c2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-05T10:32:34.386257Z", + "iopub.status.busy": "2026-10-05T10:32:34.386071Z", + "iopub.status.idle": "2026-10-05T10:32:34.389114Z", + "shell.execute_reply": "2026-10-05T10:32:34.388635Z" + }, + "papermill": { + "duration": 0.006804, + "end_time": "2026-10-05T10:32:34.389743+00:00", + "exception": false, + "start_time": "2026-10-05T10:32:34.382939+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice 2 a completer (barriere vs borne triviale).\n" + ] + } + ], + "source": [ + "# Exercice 2 — barriere : LP fractionnaire vs borne triviale 0\n", + "# Indice : hbarrier est une HYPOTHESE ; une barriere plus serree raccourcit le plafond theorique.\n", + "# Etape 1 : recalculer le majorant de flips de descent_flips_le_barrier avec lp vs valeur initiale.\n", + "# Etape 2 : comparer au pas reellement observe.\n", + "def plafond_theorique(x0, lp):\n", + " # TODO etudiant : majorant du nombre de pas acceptes selon la barriere choisie\n", + " return None\n", + "\n", + "print(\"Exercice 2 a completer (barriere vs borne triviale).\")\n" + ] + }, { "cell_type": "markdown", "id": "0eb81ee1", "metadata": { "papermill": { - "duration": 0.004428, - "end_time": "2026-09-16T09:58:06.400326", + "duration": 0.002376, + "end_time": "2026-10-05T10:32:34.394492+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.395898", + "start_time": "2026-10-05T10:32:34.392116+00:00", "status": "completed" }, "tags": [] @@ -343,20 +411,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "dcdf7d21", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.410496Z", - "iopub.status.busy": "2026-09-16T09:58:06.409989Z", - "iopub.status.idle": "2026-09-16T09:58:06.562505Z", - "shell.execute_reply": "2026-09-16T09:58:06.562505Z" + "iopub.execute_input": "2026-10-05T10:32:34.402025Z", + "iopub.status.busy": "2026-10-05T10:32:34.401748Z", + "iopub.status.idle": "2026-10-05T10:32:34.528964Z", + "shell.execute_reply": "2026-10-05T10:32:34.528198Z" }, "papermill": { - "duration": 0.15896, - "end_time": "2026-09-16T09:58:06.563514", + "duration": 0.132798, + "end_time": "2026-10-05T10:32:34.529832+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.404554", + "start_time": "2026-10-05T10:32:34.397034+00:00", "status": "completed" }, "tags": [] @@ -438,10 +506,10 @@ "id": "ab973439", "metadata": { "papermill": { - "duration": 0.002989, - "end_time": "2026-09-16T09:58:06.569608", + "duration": 0.002877, + "end_time": "2026-10-05T10:32:34.535882+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.566619", + "start_time": "2026-10-05T10:32:34.533005+00:00", "status": "completed" }, "tags": [] @@ -452,15 +520,83 @@ "Les deux causes d'arrêt existent, **chacune dans son régime de budget** : à budget serré (~2 balayages), l'arrêt est « budget atteint » — *on ne sait pas*, un améliorant pouvait exister au-delà du plafond ; à budget généreux (96 balayages), l'arrêt est « blocage » — *on sait*, aucun voisin n'améliore. Et sur ce régime généreux, **tous** les blocages observés sont **hors cible** : `hnostall` y est littéralement fausse — un état non-cible sans mouvement accepté, gap médian ~10 %. C'est la dette que `Descent.lean` consigne dans son propre fichier (« un échec de décroissance n'est pas un échec d'expérience à écarter, c'est une **dissociation** à exhiber ») : transportée hors du cadre Lean, la garantie de *cible* dégénère en garantie de *minimum local sous budget*. La loi forte (terminaison) tient ; la loi faible (qualité de l'atteint) ne tient que hypothèse par hypothèse." ] }, + { + "cell_type": "markdown", + "id": "ex11d-m1", + "metadata": { + "papermill": { + "duration": 0.002903, + "end_time": "2026-10-05T10:32:34.541817+00:00", + "exception": false, + "start_time": "2026-10-05T10:32:34.538914+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 1 — restarts : acheter de l'exploration avec le même budget\n", + "\n", + "§3 a exhibé le défaut : à budget généreux, **tous** les blocages sont hors cible. Un restart depuis un `x0` tiré au hasard consomme une part du budget pour changer de bassin d'attraction. La question n'est donc pas *« le restart aide-t-il ? »* — il aide parfois — mais **à budget global constant**, ce que coûte la part dépensée à réexplorer.\n", + "\n", + "**Objectif** : à budget global égal, comparer la descente unique et la descente à `k` restarts, en re-comptant `blocage_hors_cible` **et** le gap médian — pas seulement la meilleure valeur finale, qui flatte toujours le restart.\n", + "\n", + "- **Étape 1** : encapsuler `budget_global // k` évaluations par descente dans `descente_restart(...)`, et garder la meilleure valeur finale.\n", + "- **Étape 2** : rejouer le protocole de §3 à budget global constant, pour `k = 1, 2, 4, 8`, et rapporter blocages hors cible **et** gap médian.\n", + "- **Indice** : `x0` doit être reproductible (graine dérivée de `seed` et du numéro de restart), sinon la comparaison mesure le tirage, pas la stratégie.\n", + "\n", + "**Piège à éviter** : comparer `k` restarts à budget `k × B` — c'est comparer deux budgets, pas deux stratégies.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ex11d-c1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-05T10:32:34.549189Z", + "iopub.status.busy": "2026-10-05T10:32:34.548781Z", + "iopub.status.idle": "2026-10-05T10:32:34.553429Z", + "shell.execute_reply": "2026-10-05T10:32:34.552695Z" + }, + "papermill": { + "duration": 0.0093, + "end_time": "2026-10-05T10:32:34.553988+00:00", + "exception": false, + "start_time": "2026-10-05T10:32:34.544688+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice 1 a completer (restarts strategiques).\n" + ] + } + ], + "source": [ + "# Exercice 1 — restarts strategiques : mesurer l'effet sur les blocages hors cible\n", + "# Indice : repartir d'un x0 aleatoire a chaque blocage, budget global constant a repartir.\n", + "# Etape 1 : encapsuler la boucle (descente + tirage) dans budget_restarts().\n", + "# Etape 2 : recompter stats['blocage_hors_cible'] a budget global egal.\n", + "def descente_restart(x0_gen, poids, valeurs, capacite, budget_global, k_restarts):\n", + " # TODO etudiant : k_restarts descentes, budget_global // k_restarts chacune, garder la meilleure\n", + " return None\n", + "\n", + "print(\"Exercice 1 a completer (restarts strategiques).\")\n" + ] + }, { "cell_type": "markdown", "id": "dabd35ed", "metadata": { "papermill": { - "duration": 0.002236, - "end_time": "2026-09-16T09:58:06.573749", + "duration": 0.002425, + "end_time": "2026-10-05T10:32:34.559275+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.571513", + "start_time": "2026-10-05T10:32:34.556850+00:00", "status": "completed" }, "tags": [] @@ -473,20 +609,20 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "9883cb76", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.580748Z", - "iopub.status.busy": "2026-09-16T09:58:06.579748Z", - "iopub.status.idle": "2026-09-16T09:58:06.884531Z", - "shell.execute_reply": "2026-09-16T09:58:06.882775Z" + "iopub.execute_input": "2026-10-05T10:32:34.564982Z", + "iopub.status.busy": "2026-10-05T10:32:34.564792Z", + "iopub.status.idle": "2026-10-05T10:32:34.826230Z", + "shell.execute_reply": "2026-10-05T10:32:34.825612Z" }, "papermill": { - "duration": 0.308825, - "end_time": "2026-09-16T09:58:06.885574", + "duration": 0.265383, + "end_time": "2026-10-05T10:32:34.827049+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.576749", + "start_time": "2026-10-05T10:32:34.561666+00:00", "status": "completed" }, "tags": [] @@ -496,7 +632,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "budget 20 evaluations | gap median 86.3% | IQR [18.4%, 87.1%] | pire 89.0%\n", + "budget 20 evaluations | gap median 86.3% | IQR [18.4%, 87.1%] | pire 89.0%\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "budget 50 evaluations | gap median 63.8% | IQR [12.2%, 66.4%] | pire 72.6%\n", "budget 100 evaluations | gap median 39.3% | IQR [12.2%, 42.8%] | pire 48.0%\n", "budget 200 evaluations | gap median 10.8% | IQR [7.9%, 12.7%] | pire 17.0%\n" @@ -558,10 +700,10 @@ "id": "90efac71", "metadata": { "papermill": { - "duration": 0.002884, - "end_time": "2026-09-16T09:58:06.891591", + "duration": 0.00259, + "end_time": "2026-10-05T10:32:34.832670+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.888707", + "start_time": "2026-10-05T10:32:34.830080+00:00", "status": "completed" }, "tags": [] @@ -569,48 +711,55 @@ "source": [ "### Interprétation\n", "\n", - "Le gap médian s'effondre aux petits budgets puis se **plateaute** : doubler le budget rapporte de moins en moins, et le plateau restant est exactement la part des optima locaux que §3 a exhibée — le budget n'achète plus rien quand tous les runs restants sont *bloqués*, pas *interrompus*. C'est la frontière opérationnelle de l'op 11 : **au-delà du budget de saturation, la seule monnaie est le changement de voisinage ou les restarts** (exercice 1), pas plus d'évaluations." + "Le gap médian s'effondre aux petits budgets puis se **plateaute** : doubler le budget rapporte de moins en moins, et le plateau restant est exactement la part des optima locaux que §3 a exhibée — le budget n'achète plus rien quand tous les runs restants sont *bloqués*, pas *interrompus*. C'est la frontière opérationnelle de l'op 11 : **au-delà du budget de saturation, la seule monnaie est le changement de voisinage ou les restarts** (exercices 1 et 3), pas plus d'évaluations." ] }, { "cell_type": "markdown", - "id": "7df4c392", + "id": "ex11d-m3", "metadata": { "papermill": { - "duration": 0.002787, - "end_time": "2026-09-16T09:58:06.897507", + "duration": 0.002873, + "end_time": "2026-10-05T10:32:34.838152+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.894720", + "start_time": "2026-10-05T10:32:34.835279+00:00", "status": "completed" }, "tags": [] }, "source": [ - "## 5. Expérience ICT candidate, limites, exercices\n", + "### Exercice 3 — le voisinage 2-flip fait-il reculer le plateau ?\n", "\n", - "**Expérience ICT candidate** : le protocole qualité-budget de §4, appliqué à une descente **multi-regards** (op 12) — budget partagé entre deux potentiels différents, courbe comparée au budget intégrairement alloué au regard le plus performant en isolation. La dissociation §3 prédit que le partage ne peut pas battre le meilleur regard seul sur les instances où il se bloque ; la mesurer dirait si le plateau de saturation est un invariant ou un artefact du voisinage.\n", + "Le plateau de §4 est la part des optima **locaux au sens du 1-flip**. Or un optimum 1-flip n'est pas nécessairement un optimum pour un voisinage plus riche : prenons le voisinage **au plus deux flips** — l'union des mouvements d'un seul bit et des paires `(i, j)`. Lui **contient** tous les mouvements d'un seul bit, donc tout point bloquant au sens « au plus deux flips » bloque aussi en 1-flip — l'inverse est faux, et c'est précisément l'espace où le plateau peut reculer.\n", "\n", - "**Limites** (bornes explicites) : (1) substrat sac à dos 0/1 seul — voisinage bit-flip unimodal par objet ; (2) hill-climbing déterministe — pas de recuit, pas de restarts (c'est l'exercice 1, pas le corps) ; (3) la comparaison MEALPy reste le territoire de Search-11 — ce notebook énonce la loi, il ne refait pas le tour d'horizon.\n", + "**Piège de définition** : un voisinage d'**exactement** deux flips (les seules paires `(i, j)`) ne contient **pas** les mouvements d'un seul bit — deux bits retournés simultanément sont à distance de Hamming 2, et les deux voisinages ne sont pas emboîtés. Contre-exemple minimal : sac à dos de deux objets de poids `(1, 1)`, capacité 1, état `(0, 0)` — les deux 1-flips sont admissibles et améliorants, le seul mouvement exactement 2-flip donne `(1, 1)`, inadmissible. C'est pourquoi l'exercice prend l'**union**.\n", + "\n", + "**Objectif** : étendre le balayage à cette union et **retracer la courbe de §4** à budget comparable — le plateau recule-t-il, et à quel prix ?\n", + "\n", + "- **Étape 1** : écrire `descente_2flip` sur le même schéma que `descente_sous_budget`, avec le voisinage « au plus deux flips » (les `n` mouvements d'un bit, puis les `n(n−1)/2` paires) ; les mouvements doivent rester admissibles et le potentiel strictement décroissant (`hstrict`).\n", + "- **Étape 2** : compter les évaluations par balayage — le voisinage passe de `n` à `n + n(n−1)/2` candidats avant filtrage d'admissibilité, donc un balayage complet coûte plus cher. **À budget égal**, la 2-flip boucle moins de balayages complets — mais le nombre de pas effectivement acceptés dépend du paysage et de l'ordre de parcours : ce n'est pas une garantie, c'est une question à trancher sur les courbes.\n", + "- **Étape 3** : rapporter les deux courbes (1-flip et 2-flip) sur les mêmes instances et conclure sur l'échange *qualité par pas* contre *qualité par évaluation*.\n", + "- **Indice** : si le plateau recule mais que le gap médian à budget égal ne bouge pas, la bonne lecture est que §4 mesurait le **budget**, pas le voisinage.\n", "\n", - "**Exercices** — les stubs s'exécutent sans erreur (politique du dépôt : compléter, pas débloquer)." + "**Attention** : `hstrict` doit rester à zéro violation — c'est l'occasion de vérifier que la loi de §2 n'était pas un artefact du voisinage 1-flip." ] }, { "cell_type": "code", - "execution_count": 6, - "id": "6e8b1a33", + "execution_count": 8, + "id": "ex11d-c3", "metadata": { "execution": { - "iopub.execute_input": "2026-09-16T09:58:06.907490Z", - "iopub.status.busy": "2026-09-16T09:58:06.906911Z", - "iopub.status.idle": "2026-09-16T09:58:06.911407Z", - "shell.execute_reply": "2026-09-16T09:58:06.910885Z" + "iopub.execute_input": "2026-10-05T10:32:34.844580Z", + "iopub.status.busy": "2026-10-05T10:32:34.844385Z", + "iopub.status.idle": "2026-10-05T10:32:34.847790Z", + "shell.execute_reply": "2026-10-05T10:32:34.847109Z" }, "papermill": { - "duration": 0.010928, - "end_time": "2026-09-16T09:58:06.912174", + "duration": 0.007535, + "end_time": "2026-10-05T10:32:34.848373+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.901246", + "start_time": "2026-10-05T10:32:34.840838+00:00", "status": "completed" }, "tags": [] @@ -620,35 +769,43 @@ "name": "stdout", "output_type": "stream", "text": [ - "Exercices a completer : 1 (restarts), 2 (barriere), 3 (voisinage 2-flip).\n" + "Exercice 3 a completer (voisinage 2-flip).\n" ] } ], "source": [ - "# Exercice 1 — restarts strategiques : mesurer l'effet sur les blocages hors cible\n", - "# Indice : repartir d'un x0 aleatoire a chaque blocage, budget global constant a repartir.\n", - "# Etape 1 : encapsuler la boucle (descente + tirage) dans budget_restarts().\n", - "# Etape 2 : recompter stats['blocage_hors_cible'] a budget global egal.\n", - "def descente_restart(x0_gen, poids, valeurs, capacite, budget_global, k_restarts):\n", - " # TODO etudiant : k_restarts descentes, budget_global // k_restarts chacune, garder la meilleure\n", - " return None\n", - "\n", - "# Exercice 2 — barriere : LP fractionnaire vs borne triviale 0\n", - "# Indice : hbarrier est une HYPOTHESE ; une barriere plus serree raccourcit le plafond theorique.\n", - "# Etape 1 : recalculer le majorant de flips de descent_flips_le_barrier avec lp vs valeur initiale.\n", - "# Etape 2 : comparer au pas reellement observe.\n", - "def plafond_theorique(x0, lp):\n", - " # TODO etudiant : majorant du nombre de pas acceptes selon la barriere choisie\n", - " return None\n", - "\n", "# Exercice 3 — voisinage 2-flip : le plateau de saturation recule-t-il ?\n", - "# Indice : le voisinage 2-flip contient le 1-flip ; un optimum 1-flip n'est pas optimum 2-flip.\n", + "# Indice : prendre l'union « au plus deux flips » (1-flip + paires) : seule, elle contient le 1-flip.\n", + "# Un optimum 1-flip n'est pas optimum pour cette union ; le voisinage exactement 2-flip, lui, ne contient pas le 1-flip.\n", "# Etape 1 : etendre le balayage aux paires (i, j). Etape 2 : retracer la courbe de la section 4.\n", "def descente_2flip(x0, poids, valeurs, capacite, budget):\n", - " # TODO etudiant : meme schema, voisins = paires de bits\n", + " # TODO etudiant : meme schema, voisins = 1-flip + paires (i, j)\n", " return None\n", "\n", - "print(\"Exercices a completer : 1 (restarts), 2 (barriere), 3 (voisinage 2-flip).\")" + "print(\"Exercice 3 a completer (voisinage 2-flip).\")" + ] + }, + { + "cell_type": "markdown", + "id": "7df4c392", + "metadata": { + "papermill": { + "duration": 0.002963, + "end_time": "2026-10-05T10:32:34.853978+00:00", + "exception": false, + "start_time": "2026-10-05T10:32:34.851015+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 5. Expérience ICT candidate, limites, exercices\n", + "\n", + "**Expérience ICT candidate** : le protocole qualité-budget de §4, appliqué à une descente **multi-regards** (op 12) — budget partagé entre deux potentiels différents, courbe comparée au budget intégrairement alloué au regard le plus performant en isolation. La dissociation §3 prédit que le partage ne peut pas battre le meilleur regard seul sur les instances où il se bloque ; la mesurer dirait si le plateau de saturation est un invariant ou un artefact du voisinage.\n", + "\n", + "**Limites** (bornes explicites) : (1) substrat sac à dos 0/1 seul — voisinage bit-flip unimodal par objet ; (2) hill-climbing déterministe — pas de recuit, pas de restarts (c'est l'exercice 1, pas le corps) ; (3) la comparaison MEALPy reste le territoire de Search-11 — ce notebook énonce la loi, il ne refait pas le tour d'horizon.\n", + "\n", + "**Exercices** — les trois stubs sont **répartis** dans les sections qui les introduisent : exercice 2 (barrière) en §2, exercice 1 (restarts) en §3, exercice 3 (voisinage 2-flip) en §4. Aucun ne lève d'erreur : ils s'exécutent et rendent `None` tant qu'ils ne sont pas complétés (politique du dépôt : compléter, pas débloquer)." ] }, { @@ -656,10 +813,10 @@ "id": "0f03f301", "metadata": { "papermill": { - "duration": 0.005859, - "end_time": "2026-09-16T09:58:06.923859", + "duration": 0.002597, + "end_time": "2026-10-05T10:32:34.859283+00:00", "exception": false, - "start_time": "2026-09-16T09:58:06.918000", + "start_time": "2026-10-05T10:32:34.856686+00:00", "status": "completed" }, "tags": [] @@ -695,21 +852,21 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.13.7" }, "papermill": { "default_parameters": {}, - "duration": 2.192822, - "end_time": "2026-09-16T09:58:07.054544", + "duration": 2.24709, + "end_time": "2026-10-05T10:32:35.101971+00:00", "environment_variables": {}, "exception": null, - "input_path": "MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb", - "output_path": "MyIA.AI.Notebooks/Search/Part1-Foundations/Search-11d-Descente-Sous-Budget.ipynb", + "input_path": "Search-11d-Descente-Sous-Budget.ipynb", + "output_path": "s11d_reexec.ipynb", "parameters": {}, - "start_time": "2026-09-16T09:58:04.861722", + "start_time": "2026-10-05T10:32:32.854881+00:00", "version": "2.6.0" } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}