Programmation via ChatGPT
du modèle économique K1

 

1) Introduction

L'intelligence artificielle nous permet de programmer le modèle assez facilement. À chaque étape, des erreurs de syntaxe et des tests non-ok peuvent se produirent, on redemande alors à ChaptGPT de les corriger, ce qu'il arrive à faire.

 

2) Programmation

Programmeur
ChatGPT

On programme une simulation économique très simple

1) Le modèle

Le modèle comprend une masse monétaire en quantité NF, des biens produits et périssables dans la journée, des usines en quantité NU, et des entités en quantité N.
Il n'y a qu'un seul type de bien et qu'un seul type d'usine.
L'unité de temps est la journée. Le temps en cours T est exprimé en nombre de jours à partir du jour zéro.
Chaque usine possède une date de naissance exprimée en nombre de jour à partir du jour zéro.
L'usine est périssable dans V jours après sa naissance.
L'usine produit P biens chaque jour.
Chaque entité possède des usines et de la monnaie.

2) Initialisation du modèle

Chaque usine à une date de naissance aux hasard comprise entre T et T-V.
Chaque unité monétaire est distribué à une entité au hasard.
Chaque usine est distribuée à une entité au hasard.

fixe les paramètres comme suit :
NF = 100_000
NU = 80
N = 200
T = 0
V = 200
P = 10

Programme une page web en javascript qui affiche :

1. la courbe des réserves de monnaies de chaque entité par ordres décroisant partant de l'entité la plus riche à l'entité la plus pauvre.

2. la courbe du nombre d'usine de chaque entité par ordres décroisant partant de l'entité ayant le plus d'usines à l'entité n'en ayant pas.

3. la courbe de la production potentiel des usines (nombre de jour restant avant la fin de vie de l'usine multiplié par la production de biens par jour de l'usine) de chaque entité par ordres décroisant partant de l'entité ayant le potentiel de production le plus grand à l'entité n'en ayant pas.

Réflexion durant 31s

J’ai créé une page web prête à l’emploi qui initialise le modèle avec tes paramètres (NF=100 000, NU=80, N=200, T=0, V=200, P=10, B=3) et trace les trois courbes demandées (monnaie, nombre d’usines, potentiel). Elle est interactive : bouton « Relancer » pour ré-initialiser aléatoirement; tracés adaptatifs et nets sur écran HD.

Ouvre le fichier dans la zone de droite et lance-le dans ton navigateur. Si tu veux que j’ajoute l’évolution au fil des jours (T→T+1, consommation B, extinction d’usines, etc.), je peux te le brancher directement sur cette base.

3. Initialisation complémentaire

Chaque entité se fixe un prix de vente des biens qu'elle produit. Ce prix de vente est initialisé pour chaque entité au hasard entre 20 et 30

4. Le marché

Les entités possédant des usines sont appelées entités productrices.
Chaque jour se produit ce qui suit :
Un revenu universelle R (créé par création monétaire) est versé à chaque entité. Le paramètre R est fixé à 75.
Puis se déroule un marché où : Chaque entité productrice met en vente les biens produits par ses usines au prix fixé par elle.
Chaque entité met à la dépense une somme d'argent comprise au hasard entre 20% et 80% de sa réserve pour l'achat de biens sur le marché.
L'entité qui possède encore des biens à vendre sur le marché est appelé entité offreuse.
Le marché se résout comme suit :
On regroupe toutes les entités dans une liste qui constitue la liste initiale des entités demandeuses, et on regroupe les entités offreuses dans une autre liste. Puis on répète l'opération suivante jusqu'à ce qu'une des deux listes soient vides :
On choisit une entité demandeuse au hasard dans la liste des entités demandeuses, et on choisit l'entité offreuse (dans la liste des entités offreuses) qui propose un prix de vente le plus bas.
Si la somme d'argent mis à la dépense par l'entité demandeuse est supérieure ou égale au prix de l'offre alors on procède à la transaction d'un bien selon ce prix.
Si la somme mise à la dépense par l'entité demandeuse est inférieure au prix de l'offre alors la transaction n'a pas lieu et l'entité demandeuse est retirée de la liste des entités demandeuses.
Si après la transaction d'un bien l'entité offreuse n'a plus de bien à vendre alors elle est retirée de la liste des entités offreuses.

Ajoute un bouton dans la page web en JavaScript qui exécute une journée, et ré-affiche les 3 courbes actualisées (en enlevant les usines obsolescentes).

Réflexion durant 3m 22s

C’est fait ✅

  • Chaque entité a maintenant un prix de vente initial tiré au hasard entre 20 et 30.
  • J’ai ajouté un bouton « Exécuter une journée » : il verse le revenu universel R=75, fait produire les usines actives, lance le marché (budgets tirés entre 20 % et 80 % des réserves, achats au meilleur prix), puis périme les usines (suppression des obsolescentes) et met à jour les 3 courbes.
  • La masse monétaire affichée se met à jour (création monétaire incluse).

Tu peux cliquer sur Réinitialiser / relancer pour repartir d’un tirage neuf, puis sur Exécuter une journée autant de fois que tu veux. Si tu veux que le prix évolue (ex. ajustement dynamique, bruit, stratégie) ou afficher des histos des prix/transactions, je l’ajoute.

On ajoute une taxe à la vente de TV = 20%. C'est un impôt qui est prélevé à chaque vente effectuée, et qui est préalablement reportée dans le prix de vente. Ainsi, l'entité fixe le prix vente hors TV pour la journée, des biens qu'il produit. Le prix réel est donc augmenté de cette taxe. L'Impôt retourne à l’État par simple destruction monétaire, réduisant ainsi la masse monétaire.

Ajoutez dans la page web une case indiquant la somme totale des taxes à la vente prélevée au cours de la journée, et ainsi enlevé de la masse monétaire.

Ajoutez dans la page web une case indiquant la somme totale des revenus universel, versé au cours de la journée, et ainsi ajouté à la masse monétaire.

Mettez des courbes un peu plus voyante.

Réflexion durant 18s

Ajouts réalisés ✅

  • Taxe à la vente (TV = 20 %) :
    • Chaque entité fixe désormais un prix HT. Le prix payé est TTC = HT × (1+TV).
    • À chaque transaction, le vendeur reçoit le HT, la TV est prélevée et détruite (diminution de la masse monétaire).
  • Nouveaux indicateurs (pills en haut) :
    • RU aujourd’hui : total du revenu universel versé au jour courant (création monétaire).
    • Taxes TV 20 % aujourd’hui : total des taxes collectées au jour courant et retirées de la masse monétaire.
  • Courbes plus voyantes :
    • Traits plus épais avec halo lumineux et remplissage plus marqué pour une meilleure lisibilité.

Tu peux lancer Exécuter une journée pour voir le RU et les Taxes du jour se mettre à jour, ainsi que l’impact sur la masse monétaire totale.
Souhaites-tu aussi un cumul RU / Taxes depuis T=0, ou un graphique du prix moyen TTC et du volume de transactions par jour ?

On ajoute une taxe sur les revenus TR = 20%. C'est un impôt qui est prélevé sur le revenu lors d'une journée, pour chaque entité. L'Impôt retourne à l’État par simple destruction monétaire, réduisant ainsi la masse monétaire.

Ajoutez dans la page web une case indiquant la somme totale des taxes sur le revenu prélevée au cours de la journée, et ainsi enlevé de la masse monétaire.

Réflexion durant 12s

C’est ajouté ✅

  • TR = 20 % appliquée sur le revenu du jour de chaque entité (revenu universel + recettes HT de ventes).
  • La taxe est détruite (baisse de masse monétaire).
  • Nouvelle pastille en haut : « Taxes TR 20 % aujourd’hui », qui affiche le total perçu/détruit pour la journée.
  • Les autres indicateurs (RU du jour, Taxes TV du jour, masse monétaire totale, usines actives) se mettent toujours à jour après chaque clic sur Exécuter une journée.

Si tu préfères taxer uniquement le RU (sans taxer les ventes) ou appliquer des tranches de revenu, je peux ajuster la règle en une seconde.

Affiche la courbe du nombre de biens achetés en une journée, pour chaque entité, dans l'ordre décroissant

Réflexion durant 7s

Ajout effectué ✅

  • Nouvelle courbe #4 : *Biens achetés par entité en une journée* (ordre décroissant).
  • À chaque clic sur Exécuter une journée, le moteur compte, pour chaque entité, le nombre d'unités achetées puis trace la courbe (couleur accent4).
  • L’axe X est adapté (« acheteuse → non acheteuse »).
  • Rien d’autre n’a été modifié dans la logique du marché, des taxes (TV, TR) ou des indicateurs.

Tu veux aussi la courbe des biens vendus par entité dans la journée, ou un histogramme du prix TTC observé ?

Chaque jour chaque entité modifie son prix de vente comme suit. Il tire un nombre R au hasard entre 2 et 1, et il tire au hasard un booléen pile ou face. Si c'est pile alors il multiplie son prix de vente par R, et si c'est face alors il divise son prix de vente par R.

Réflexion durant 5s

C’est intégré ✅

Chaque jour, avant la mise en vente :

  • Pour chaque entité on tire R ∈ [1,2) et pile/face.
  • Si pile → prix ← prix × R ; si face → prix ← prix ÷ R.
  • Un petit garde-fou maintient le prix strictement positif.

Tu peux enchaîner plusieurs clics sur Exécuter une journée pour voir l’effet de ce « marche aléatoire multiplicatif » sur la dynamique des achats et de la masse monétaire.
Si tu veux fixer des bornes (ex. min=5, max=200) ou ajouter un bruit log-normal plutôt qu’un tirage uniforme, dis-moi et je l’applique.

Une correction du programme est necessaire : Reflexion 42s

Affiche un histogramme du prix TTC de chaque biens vendus au cours de la journée

Réflexion durant 5s

C’est en place ✅

  • Ajout d’un histogramme des prix TTC des ventes du jour (section 5).
  • Le moteur enregistre le prix TTC de chaque transaction et trace la distribution (règle de Sturges bornée 10→40 bins).
  • Si aucune vente a eu lieu sur la journée, l’histogramme reste vide.
  • Des tests supplémentaires vérifient que:
    • #ventes == longueur(lastPricesTTC),
    • tous les prix TTC sont non négatifs.

Tu veux aussi afficher la moyenne / médiane / écart-type des prix TTC du jour ou un histogramme cumulatif (CDF) ?

Une correction du programme est necessaire : Reflexion 27s

Affiche le prix moyen TTC des biens vendus au cours de la journée.

Réflexion durant 5s

C’est fait ✅

  • J’ai ajouté une pastille en haut : « Prix moyen TTC aujourd’hui ».
  • Le calcul se fait à partir des prix TTC de chaque vente du jour (lastPricesTTC) et s’affiche avec 2 décimales (format fr-FR).
  • Si aucune vente n’a eu lieu, l’indicateur reste sur .
  • J’ai aussi ajouté un test : si des ventes existent, l’average affiché doit être cohérent avec sum(lastPricesTTC)/len (tolérance 1e-3).

Si tu préfères une autre présentation (ex. , 4 décimales, ou une médiane et écart-type à côté), dis-moi ce que tu attends exactement et je l’intègre.

Une correction du programme est necessaire : Reflexion 11s
Une correction du programme est necessaire : Reflexion 6s
Une correction du programme est necessaire : Reflexion 9s

Chaque jour, chaque entité calcul le nombre de biens qu'il à produit mais n'a pas pu vendre au cours de la journée.

Calcul la somme des invendus de toutes les entités au cours de la journée et affiche ce nombre de biens invendus dans la page web

Réflexion durant 7s

C’est fait ✅

  • Paramètre NB supprimé du bloc PARAMS et de la doc (footer nettoyé).
  • Calcul des invendus du jour :
    • On calcule la production du jour lors de la création des offres : producedToday = Σ (usines actives × P).
    • On compte les ventes réalisées via pricesTTC.length.
    • Invendus = producedToday - ventes.
    • Stockés dans state.lastProduced et state.lastUnsold.
  • Affichage : nouvelle pastille « Invendus aujourd’hui » actualisée à chaque render().

Sanity tests ajoutés

  • Présence du DOM statUNSOLD.
  • Cohérence journée :
    Produit = Vendu + Invendu.
  • Non-négativité de lastProduced et lastUnsold.

Tu veux aussi une courbe d’invendus par entité (ordre décroissant) ou un cumul des invendus sur plusieurs jours ?

Une correction du programme est necessaire : Reflexion 8s

Chaque jour, chaque entité calcul le nombre de biens qu'il a vendu au cours de la journée.

Pour chaque entité, si le nombre de bien qu'il a vendu est plus faible que le nombre de biens invendu (le nombre de biens qu'il n'a pas pu vendre au cours de la journée) alors il divise son prix de vente par un facteur au hasard compris entre 1 et 2. C'est une évolution du prix qui s'exécute en plus de l'évolution journalière du prix, et qui s'applique pour la journée suivante.

Réflexion durant 26s

✅ Ajout de la règle d’ajustement “réactif” des prix (ventes < invendus)

J’ai mis à jour le code dans la page ouverte pour implémenter exactement votre règle :

  • Calcul par entité (chaque jour) :
    • Production du jour : prodPerEntity[eid] = (#usines actives × P)
    • Ventes du jour : salesPerEntity[eid] (incrémenté à chaque transaction côté vendeur)
    • Invendus du jour : unsoldPerEntity[eid] = max(0, prod - sales)
  • Nouvelle règle d’évolution de prix (en plus de la marche aléatoire quotidienne existante)
    À la fin de la journée, juste après le marché et la péremption des usines, avant d’avancer le temps :
    • Si salesPerEntity[eid] < unsoldPerEntity[eid], alors on divise le prix par un facteur aléatoire f ∈ [1, 2) (i.e. price /= 1 + rng()).
    • Cela s’applique pour la journée suivante (les prix sont modifiés après le marché du jour courant).
  • Traçabilité & tests ajoutés
    • Mémorisation par entité dans l’état : lastProducedPerEntity, lastSold, lastUnsoldPerEntity.
    • Garde les prix avant/après l’ajustement réactif pour vérifier que si la condition est vraie, le prix baisse bien.
    • Tests supplémentaires (sans toucher aux existants) :
      • Par entité : produit = vendu + invendu.
      • Ajustement réactif : si invendu > vendu, alors prix_après ≤ prix_avant.

Tout a été intégré sans casser les autres fonctionnalités (moyenne TTC sur les ventes, histogramme, invendus globaux, affichage des taux TV/TR, etc.).
Si vous voulez que j’affiche aussi par entité les ventes/invendus du jour (liste triée ou courbe), je peux l’ajouter.

Pour chaque journée, pour chaque entité, si l'entité n'a pas d'invendu c'est à dire s'il a vendu tous les biens qu'il a produit au cours de la journée, alors il augmente son prix de vente par un facteur au hasard compris entre 1 et 2. C'est une évolution du prix qui s'exécute en plus de l'évolution journalière du prix, et qui s'applique pour la journée suivante.

Réflexion durant 13s

Ajout effectué ✅

  • Nouvelle règle : si une entité a tout vendu (prod>0 et invendu=0), son prix HT est multiplié par un facteur aléatoire dans [1, 2) pour la journée suivante.
    (Cette hausse s’ajoute à l’évolution journalière déjà en place. Elle est exclusive du cas “invendus > ventes” qui, lui, provoque une baisse.)
  • Implémentation :
    • Calcul par entité : prodPerEntity, salesPerEntity, unsoldPerEntity.
    • Deux conditions :
      • reactCond: invendus > ventesdivision du prix.
      • reactUpCond: prod>0 & invendus=0multiplication du prix.
    • Les deux sont évaluées après le marché et la péremption, et avant l’incrément du jour.
  • Traçabilité dans l’état :
    • _reactBefore (prix avant réaction), _reactAfter (après éventuelle baisse),
      _reactCond (baisse), _reactUpCond (hausse), _reactAfterUp (après hausse).
  • Tests ajoutés (les anciens restent intacts) :
    • Baisse : si _reactCond[i] est vrai, alors price_after <= price_before.
    • Hausse : si _reactUpCond[i] est vrai, alors price_afterUp >= price_after (donc hausse réelle).

Si vous souhaitez que la hausse s’applique même quand prod=0 (cas limite où “tout vendu” est trivial), dites-moi votre préférence ; pour l’instant, j’ai choisi prod>0 pour éviter des hausses artificielles quand aucune production n’a eu lieu.

Une correction du programme est necessaire : Reflexion 25s

La construction d'une usine nécessite UB = 150 biens achetés sur le marché qui peuvent, lorsqu'ils sont ainsi converti en construction d'usine, être accumulé sur plusieurs jours. Chaque entité peut posséder une usine en construction.
La date de naissance de l'usine en construction commence dès le premier bien utilisé à sa construction. L'usine n'est pas productive tant que sa construction n'est pas achevée, et donc elle peut devenir obsolète avant même d'avoir démarrer.

Chaque jour, chaque entité, après le marché, utilise au hasard entre 20% et 80% des biens qu'il a achetés sur le marché, à la construction de son usine en cours de construction. Mais attention, il ne peut pas utiliser ses biens invendus pour la construction de son usine en cours de construction, il ne peut utiliser que les biens qu'il a acheté sur le marché.
Une fois que l'usine est construite, les biens supplémentaires alloués à la construction sont utilisés pour construire une nouvelle usine, de tel sorte qu'il y a presque toujours une usine en construction.

Réflexion durant 23s

J’ai tenté de mettre à jour tout le bloc <script> de votre canvas pour intégrer la construction d’usines (UB=400, accumulation multi-jours, naissance au 1er bien alloué, péremption possible avant achèvement, utilisation de 20–80% des biens *achetés* du jour, enchaînement de chantiers avec report des surplus).

Cependant, la mise à jour a échoué à cause d’un problème de remplacement par expression régulière dans la canvas (canmore.update_textdoc). Le message d’erreur indique que le remplacement global du bloc <script>…</script> n’a pas pu s’appliquer correctement.

Voici exactement ce que j’avais prévu d’ajouter (et que je peux ré-appliquer proprement si vous me laissez réessayer) :

1. Nouveaux paramètres & état

  • PARAMS.UB = 400
  • Chaque entité a désormais un chantier : e.building = { progress, required: UB, birth, remaining } | null
  • Nouveaux agrégats par entité pour les tests :
    lastBuildUsedPerEntity, lastBuildCompletedPerEntity

2. Chronologie par jour mise à jour

  • Après le marché et les taxes TR, on fait la péremption des usines ET des chantiers (remaining--).
  • Construction : pour chaque entité, on alloue useForBuild = floor(U[0.2,0.8] * achats_du_jour) *exclusivement sur les biens achetés*, jamais les invendus.
    • Si pas de chantier, on en crée un : birth = T, remaining = V.
    • On crédite progress, on peut finir plusieurs usines le même jour.
    • À chaque achèvement : si remaining > 0, on ajoute une usine productive avec birth et remaining du chantier.
    • Si surplus, on démarre un nouveau chantier dans la foulée (naissance à T) et on continue d’allouer.
    • Si le chantier devient périmé (remaining<=0) avant achèvement, il est perdu (les biens alloués sont consommés).
  • Ajustements réactifs des prix restent après (baisse si invendus>ventes, hausse si tout vendu).

3. Tests ajoutés (sans toucher aux existants)

  • allocation <= achats du jour pour chaque entité.
  • Sanités précédentes conservées (moyenne TTC sur ventes, Produit = Vendu + Invendu, etc.).

---

Comment voulez-vous procéder ?

Je peux :

  • Ré-appliquer la mise à jour en patching ponctuel au lieu de remplacer tout le <script> d’un coup (moins risqué pour la regex), ou
  • Vous fournir le fichier HTML complet corrigé à coller tel quel (copier/coller remplace l’ancien).

Dites-moi votre préférence. Si vous optez pour le patch, je procède par petites insertions/remplacements (ajout de UB, ajout de building à l’init, modification de la péremption pour inclure le chantier, insertion du bloc “construction”, ajout des stats/tests).

Fournir le fichier HTML complet corrigé

Fichier HTML complet corrigé — avec construction d’usines (UB=150), naissance de chantier au premier bien alloué, péremption des chantiers/usines, utilisation de 20–80% des achats du jour (jamais les invendus), enchaînement des chantiers, et tests supplémentaires pour garantir que l’allocation de construction ≤ achats du jour.
Je l’ai déjà remplacé dans votre canvas. Si quelque chose ne correspond pas à votre intention (par ex. ordre exact « péremption vs construction »), dites-moi l’attendu et j’ajuste.

Jeu-K1-001.html

 

Dans le programme, les paramètres sont regroupés et peuvent être modifiés avant de lancer l'exécution.

// ===== Paramétres =====
const PARAMS = {
   NF: 100_000, // masse monétaire initiale
   NU: 80,      // nombre d'usines
   N: 200,      // entités
   T: 0,        // jour courant
   V: 200,      // durée de vie d'une usine (jours)
   P: 10,       // production par jour d'une usine
   B: 3,        // consommation/jour/entité (non utilisé ici)
   R: 75,       // revenu universel/jour/entité (spécification)
   TV: 0.20,    // taxe à la vente (modifiable, ex: 0.20 = 20%)
   TR: 0.20,    // taxe sur les revenus (modifiable, ex: 0.20 = 20%)
   UB: 150      // biens nécessaires pour construire une usine
};