
Chipper de poker
Sélectionnez de manière optimale les dénominations de puces de poker pour les jeux en espèces en utilisant l'optimisation non linéaire contrainte.
Imaginez héberger un petit jeu de poker. Vous savez combien d'amis assisteront, combien de jetons vous avez et l'achat. Comment choisissez-vous des dénominations de puces?
Sans Chipper de poker, choisir des dénominations de puces est manuelle et sujette aux erreurs. Vous essayez d'abord de choisir des valeurs qui se divisent bien et sont faciles à retenir. (Alternativement, luttez pour rappeler les valeurs de la dernière fois que vous avez joué.) Vous essayez ensuite de trouver un moyen de faire en sorte que les valeurs choisies résument à l'achat. Ensuite, vous revenez chaque fois qu'il n'y a pas assez de puces pour tout le monde, ou quand il reste trop de jetons. Enfin, vous vous contentez d'une allocation sous-optimale de puces afin que vous puissiez réellement commencer à jouer.
Avec Poker Chipper, en revanche, la sélection des dénominations de puces est rapide et facile. Entrez le nombre de joueurs, achetez, stores et nombre de jetons. Après avoir attendu un moment pour les résultats mathématiquement optimaux, vous pouvez les sauver la prochaine fois ou les partager avec d'autres. Si vous souhaitez modifier les résultats, ajustez les «options avancées» et les dénominations de puce seront recomputées en conséquence.
Poker Chipper utilise une programmation non linéaire mixte (MINLP), qui est une forme d'optimisation non convexe contrainte, pour choisir de manière optimale des dénominations de puces de poker.
L'optimisation est effectuée à l'aide d'un "solveur" - dans ce cas, SCIP. Certaines entrées de la déchiqueteuse de poker sont traduites en contraintes de solveur, qui affectent les dénominations admissibles. D'autres entrées influencent la fonction objectif du solveur, qui affecte la façon dont les dénominations candidates sont évaluées, classées et choisies. Dans l'interface utilisateur, les entrées affectant les contraintes et les entrées affectant la fonction objectif sont décrites comme influençant respectivement les "exigences" et le "score" des solutions candidates.
Poker Chipper est une application Web entièrement statique. En d'autres termes, tous les traitements impliqués dans l'optimisation de l'efficacité se produisent entièrement dans le côté client - entièrement dans le navigateur de l'utilisateur. Le Scip Solver est conçu pour fonctionner nativement, donc Poker Chipper le regroupe pour le navigateur en compilant Scip à WebAssembly (WASM) avec Emscripten.
Les liens ci-dessous sont répertoriés dans l'ordre, le code doit être lu pour comprendre l'application du plus haut niveau au plus bas.
src/App.svelte - Application principale de haut niveausrc/*.svelte - composants d'interface utilisateursrc/solve.js - Convertir les entrées utilisateur en modèle MINLP et résoudre en utilisant WasM Scipsrc/solveWorker.js - travailleur Web pour exécuter le solveur dans un thread non bloquantpublic/serviceWorker.js - travailleur des services pour la mise en cache et les fonctionnalités hors lignepublic/* - PWA Manifest, Global Stylesheet, Favicons, etc.experiments/* - Exploration du concept initial dans Python (avec Z3, et plus tard, SCIP), et DockerFile pour compiler SCIP avec Emscriptensrc/compiled/* - SCIP compilé sur WASM via Emscripten, plus les fichiers de support associésDans le diagramme ci-dessous, les flèches étiquetées représentent des demandes de fetch asynchrones et le passage du message.
Organigramme LR
A [svelte frontal] -> | Résoudre les demandes | B ["Wew travailleur
(thread non bloquant) "]
B -> | Solutions | UN
A <-> | Assets statiques | C [travailleur des services]
B <-> | Assets statiques du solveur | C
C -> | Cache | C
C <-> | Assets statiques | D [serveur Web]
Poker Chipper est activement maintenu. S'il n'y a pas de commits récents, tout fonctionne bien! Depuis la version initiale, le code est stable et il n'y a aucune fonctionnalité majeure et exceptionnelle qui reste à ajouter.
Les rapports de bogues et les demandes de fonctionnalités via les problèmes de GitHub sont encouragés. Il est peu probable que les demandes d'attraction avec plus de 20 lignes de code soient fusionnées rapidement, sauf si associées à une discussion préalable ou accompagnées d'une prose anglaise explicative substantielle. En d'autres termes, les demandes de traction contenant du code sans contexte peuvent être fusionnées après beaucoup de retard ou ne peuvent pas être fusionnées du tout.
Étant donné que Poker Chipper est une application Web entièrement statique sans traitement côté serveur (en dehors de servir des fichiers inchangés), il est extrêmement évolutif et a un fardeau de maintenance très faible. En tant que tel, même si quelque chose m'arrivait, et je ne pouvais pas continuer à travailler sur le projet, la version publique devrait rester fonctionnelle et disponible en ligne tant que mon compte GitHub est ouvert et que le domaine jstrieb.github.io est actif.
Les meilleures façons de soutenir le projet sont de:
Si vous insistez pour dépenser de l'argent pour montrer votre soutien, veuillez le faire d'une manière largement bénéfique. En particulier, les dons aux organisations suivants m'aident, en plus du public général à l'aide d'Internet:
Poker Chipper n'aurait pas été possible sans aide et commentaires de: