
扑克碎片
使用受约束的非线性优化选择现金游戏的最佳扑克芯片面额。
想象一下举办一个小型扑克游戏。您知道要参加多少个朋友,您有多少筹码以及购买。您如何选择筹码面额?
没有扑克碎屑,选择芯片教派是手动且容易出错的。您首先尝试选择彼此划分并易于记住的值。 (另外,努力回忆起上一次玩游戏的价值。)接下来,您尝试找到一种方法来使所选价值总和到购买。然后,每当每个人都没有足够的筹码,或者剩下太多芯片时,您就会回溯。最后,您要安顿下一个次优的芯片分配,以便您可以真正开始播放。
另一方面,使用扑克碎屑,挑选芯片面额快速而容易。输入玩家,购买,百叶窗和芯片数量的数量。在等待了片刻以获取数学上最佳的结果之后,您可以下次保存它们,或与他人共享。如果要修改结果,请调整“高级选项”,并且将相应地重新计算芯片面额。
扑克削纸器使用混合企业非线性编程(MINLP),这是一种受约束,非convex优化的形式,以最佳选择扑克芯片面额。
使用“求解器”进行优化 - 在这种情况下,SCIP。对扑克削片机的一些输入被转化为求解器限制,这会影响宗派是可以接受的。其他输入会影响求解器的目标函数,这会影响候选人教派的评估,排名和选择。在用户界面中,影响约束的输入和影响目标函数的输入被描述为分别影响候选解决方案的“需求”和“得分”。
扑克削纸器是一个完全静态的Web应用程序。换句话说,执行优化涉及的所有处理都会发生客户端 - 完全在用户的浏览器中。 SCIP求解器旨在本地运行,因此,通过将SCIP与Emscripten一起编译为WebAssembly(WASM),扑克削片机将其捆绑为浏览器。
以下链接在该顺序中列出,应读取代码以了解从最高到最低级别的应用程序。
src/App.svelte - 主要高级应用程序src/*.svelte - UI组件src/solve.js - 将用户输入转换为MINLP模型并使用WASM SCIP解决src/solveWorker.js - 网络工作者以非阻止线程运行求解器public/serviceWorker.js - 用于缓存和离线功能的服务工作者public/* - PWA清单,全球样式表,Favicons等。experiments/* - python中初始概念的探索(带有Z3和后来的SCIP)和Dockerfile,用于用Emscripten编译SCIPsrc/compiled/* - SCIP通过emscripten汇编为WASM,以及关联的支持文件在下图中,标记的箭头表示异步提取请求和消息传递。
流图LR
一个[Svelte前端] - > |解决请求| B [“ Web Worker
(非块线)”]
B-> |解决方案|一个
a <-> |静态资产| C [服务工作者]
b <-> |求解器静态资产| c
C-> |缓存| c
c <-> |静态资产| D [Web服务器]
扑克碎屑被积极维护。如果没有最近的提交,那么一切都会顺利进行!截至最初的版本,代码稳定,并且没有任何重大的出色功能尚待添加。
鼓励通过GITHUB问题发出错误报告和功能请求。除非与先前的讨论相关联或伴随着大量的,解释性的英语散文,否则不太可能迅速合并具有20行代码的拉动请求。换句话说,在很大的延迟之后可能会合并包含无上下文的代码的拉请请求,或者根本无法合并。
由于扑克削纸器是一个完全静态的Web应用程序,没有服务器端处理(除了提供不变的文件之外),因此它非常可扩展,并且维护负担非常低。因此,即使我发生了什么事,而且我无法继续从事该项目,只要我的github帐户开放并且jstrieb.github.io域活动,公共版本也应继续保持功能并在线上可用。
支持该项目的最佳方法是:
如果您坚持花钱来表示支持,请以广泛有益的方式进行。特别是,除了通用,互联网上的公众外,向以下组织捐款还能帮助我:
没有帮助和反馈的扑克碎屑是不可能的: