
ポーカーチッパー
制約付きの非線形最適化を使用して、キャッシュゲームのポーカーチップ宗派を最適に選択します。
小さなポーカーゲームをホストすることを想像してみてください。何人の友人が出席するか、あなたが持っているチップの数、そして買い物を知っています。どのようにチップの宗派を選びますか?
ポーカーチッパーがなければ、チップの宗派をピッピングすることは手動でエラーが発生しやすいです。最初に、お互いをうまく分割し、覚えやすい値を選択しようとします。 (あるいは、最後にプレイしたときから値を思い出すのに苦労します。)次に、選択した値を購入する方法を見つける方法を見つけようとします。その後、すべての人に十分なチップがない場合、またはチップがあまりにも多く残っているときはいつでもバックトラックします。最後に、実際にプレイを開始できるように、最適ではないチップ割り当てに落ち着きます。
一方、ポーカーチッパーを使用すると、チップの宗派を選ぶのは高速で簡単です。プレイヤーの数、購入、ブラインド、およびチップの数を入力します。数学的に最適な結果を少し待った後、次回はそれらを保存するか、他の人と共有することができます。結果を変更する場合は、「高度なオプション」を調整すると、それに応じてチップの宗派が再計算されます。
Poker Chipperは、混合整数非線形プログラミング(MINLP)を使用します。これは、制約された非コンベックス最適化の一形態であり、ポーカーチップの宗派を最適に選択します。
最適化は、「ソルバー」(この場合はSCIP)を使用して実行されます。ポーカーチッパーへのいくつかの入力は、ソルバー制約に変換され、宗派が許容できるものに影響します。他の入力は、ソルバーの目的関数に影響を与えます。これは、候補の宗派が評価、ランク付け、選択される方法に影響します。ユーザーインターフェイスでは、候補ソリューションの「制約」に影響を与える入力、および目的関数に影響する入力は、それぞれ「要件」と「スコア」に影響を与えるものとして説明されます。
ポーカーチッパーは、完全に静的なWebアプリケーションです。言い換えれば、最適化の実行に関与するすべての処理は、完全にユーザーのブラウザでクライアント側に発生します。 SCIPソルバーはネイティブに動作するように設計されているため、Poker ChipperはSCIPにWebAssembly(WASM)をEmscriptenとコンパイルしてブラウザ用にバンドルします。
以下のリンクは、アプリケーションを最高レベルから最低レベルまで理解するために、コードを読み取る必要があります。
src/App.svelte - メインの高レベルアプリケーションsrc/*.svelte - UIコンポーネントsrc/solve.js - ユーザー入力をMINLPモデルに変換し、WASM SCIPを使用して解決しますsrc/solveWorker.js - ノンブロッキングスレッドでソルバーを実行するWebワーカーpublic/serviceWorker.js - キャッシュおよびオフライン機能のサービスワーカーpublic/* - PWAマニフェスト、グローバルスタイルシート、ファビコンなど。experiments/* - Python(Z3以降の両方のSCIPを使用)の初期概念の探索、およびemscriptenとSCIPをコンパイルするためのDockerFilesrc/compiled/* - emscriptenを介してwasmにコンパイルされたSCIPと関連するサポートファイル以下の図では、ラベル付き矢印は非同期のフェッチリクエストとメッセージの合格を表します。
フローチャートLR
a [Svelte Front End] - > | Requests |を解きますB ["Webワーカー
(非ブロッキングスレッド) "]
b-> | solutions | a
a < - > |静的資産| C [サービスワーカー]
B < - > |ソルバー静的資産| c
C-> |キャッシュ| c
C < - > |静的資産| D [Webサーバー]
ポーカーチッパーは積極的に維持されています。最近のコミットがなければ、すべてがスムーズに実行されています!最初のリリースの時点で、コードは安定しており、追加されたままの主要な傑出した機能はありません。
GitHubの問題を介したバグレポートと機能リクエストが奨励されます。 20行以上のコードを持つプルリクエストは、事前の議論に関連付けられていない場合、または実質的な説明的な英語の散文を伴わない限り、迅速にマージされる可能性は低いです。言い換えれば、コンテキストのないコードを含むプル要求は、多くの遅延後にマージされる場合があるか、まったくマージされない場合があります。
Poker Chipperは、サーバー側の処理なし(変化しないファイルの外側)を持たない完全に静的なWebアプリケーションであるため、非常にスケーラブルで、メンテナンスの負担が非常に低くなっています。そのため、たとえ何かが私に起こっていて、プロジェクトに取り組み続けることができなかったとしても、githubアカウントが開いていてjstrieb.github.ioドメインがアクティブである限り、パブリックバージョンはオンラインで機能し続ける必要があります。
プロジェクトをサポートする最良の方法は次のとおりです。
あなたがあなたのサポートを示すためにお金を使うことを主張するならば、広く有益な方法でそうしてください。特に、次の組織への寄付は、一般的なインターネットを使用する一般の人々に加えて、私を助けてくれます。
ポーカーチッパーは、ヘルプとフィードバックなしでは不可能だったでしょう。