
撲克碎片
使用受約束的非線性優化選擇現金遊戲的最佳撲克芯片面額。
想像一下舉辦一個小型撲克遊戲。您知道要參加多少個朋友,您有多少籌碼以及購買。您如何選擇籌碼面額?
沒有撲克碎屑,選擇芯片教派是手動且容易出錯的。您首先嘗試選擇彼此劃分並易於記住的值。 (另外,努力回憶起上一次玩遊戲的價值。)接下來,您嘗試找到一種方法來使所選價值總和到購買。然後,每當每個人都沒有足夠的籌碼,或者剩下太多芯片時,您就會回溯。最後,您要安頓下一個次優的芯片分配,以便您可以真正開始播放。
另一方面,使用撲克碎屑,挑選芯片面額快速而容易。輸入玩家,購買,百葉窗和芯片數量的數量。在等待了片刻以獲取數學上最佳的結果之後,您可以下次保存它們,或與他人共享。如果要修改結果,請調整“高級選項”,並且將相應地重新計算芯片面額。
撲克削紙器使用混合企業非線性編程(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域活動,公共版本也應繼續保持功能並在線上可用。
支持該項目的最佳方法是:
如果您堅持花錢來表示支持,請以廣泛有益的方式進行。特別是,除了通用,互聯網上的公眾外,向以下組織捐款還能幫助我:
沒有幫助和反饋的撲克碎屑是不可能的: