Outil web de programmation linéaire pour Ale Abbey qui optimise les mélanges d'ingrédients pour cibler saveur, couleur, force et mousse.
Quand Ale Abbey - Monastery Brewery Tycoon est sorti sur Steam, j'ai tout de suite voulu construire un assistant automatisé pour contourner ses mécaniques d'essai-erreur. Le principal obstacle dans le jeu est de trouver le mélange précis d'ingrédients pour respecter des bornes numériques serrées sur quatre traits clés : saveur, couleur, force et mousse.
Plutôt que de gérer les approximations manuelles en jeu, j'ai vu un problème d'optimisation en recherche opérationnelle. J'ai initialisé une base TypeScript moderne pour traduire les valeurs de brassage du jeu en un système strict de programmation linéaire capable de calculer des permutations d'ingrédients impeccables à la demande.
Le moteur est construit en TypeScript et React, avec Vite pour un bundling moderne et rapide. Pour calculer les contraintes mathématiques, j'ai intégré javascript-lp-solver directement dans le flux d'exécution principal.
Le moteur traduit les bornes cibles des vertus de bière (Mauvais, Neutre, Bon) en contraintes algébriques et traite les valeurs d'ingrédients comme des variables entières. Les utilisateurs configurent le système via une interface assistant pas à pas stylée avec Tailwind CSS, leur permettant d'optimiser pour plusieurs objectifs comme le coût total le plus bas ou le moins d'ingrédients distincts. Les structures de données sous-jacentes, les contraintes et les configurations du solveur sont isolées et entièrement vérifiées avec Jest.
Ce projet a été un excellent exercice pour traduire des mécaniques de jeu vidéo arbitraires en contraintes logicielles structurées. Je n'ai jamais vraiment fini de jouer au jeu ni entièrement finalisé l'application, mais ça m'a rappelé à quel point c'est gratifiant de construire des outils pratiques pour développeurs à partir d'une curiosité d'ingénieur pure.
J'ai appris à intégrer une bibliothèque externe de programmation linéaire dans un cycle de vie de composants React typés, à mapper des sélections utilisateur complexes en temps réel vers une matrice mathématique objective, et à maintenir un flux de travail strict orienté tests avec Jest. Ça a prouvé qu'un projet n'a pas besoin d'être complet pour être un excellent terrain de jeu pour affûter la modélisation de domaine et les compétences en optimisation.