博弈論之Nim游戲

? ? ? ?OI里,博弈論就是兩個聰明絕頂的人玩不公平的游戲。

? ? ? ? Nim游戲是組合游戲(Combinatorial Games)的一種,屬于“Impartial Combinatorial Games”(以下簡稱ICG)。

? ? ? ? 通常的Nim游戲的定義是這樣的:有若干堆石子,每堆石子的數量都是有限的,合法的移動是“選擇一堆石子并拿走若干顆(不能不拿)”,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

? ? ? ? 我們都知道,對于N堆石子,判斷第一個人是否贏是將每個石子進行異或運算,如果結果為0則第一個人取得必輸,否則必贏。

? ? ? ? 但主要是為什么用異或?為什么等于零則是先者必輸?

? ? ? ??首先先說一下大家都知道的定義吧:P-position和N-position。

? ? ? ??P-position:P即Previous,該局面為P-position,則代表著這個局面先行者必輸,后行者必贏。

? ? ? ? N-position:N即Next,該局面為N-position,則代表著這個局面的后行者必輸,先行者必贏。

? ? ? ? 很顯然,對于無法移動的局面(Terminal position)為P-position;可以移動到P-position局面的必為N-position局面(就是這個局面是先行者必輸的話,它的上一個局面一定是后行者必輸);所有移動都導致N-position局面的是P-position。

? ? ? ? 也就是說,對于一個局面A是?P-position還是N-position,如果它的子局面(所謂子局面就是這個局面的能夠發展成的后續局面,比如兩個石子堆個數為(3,3),那么它的子局面為(0,3)(1,3)(2,3))存在先者必輸P-position的局面,那么局面A就是后者必輸N-position的局面,如果它的子局面全部是后者必輸N-position的局面,那么局面A就是先者必輸P-position的局面(子局面的后者就是局面A的操作者)。

? ? ? ? 為此我們要判斷的就是一開始是屬于什么局面,根據上述定義可知這個局面的判定取決于它的子局面,而它的子局面又取決于它的子子局面……直到這個局面能夠獨立判斷是P-position還是N-position,然后再回溯判斷,對于這個遞歸的算法你可能已經敏銳地看到有大量重復的子問題了,需要記憶化搜索或DP,這實際上也就是博弈論的本質而已,只是我們存在一種比搜索更優的方法——異或。

? ? ? ? 為什么用異或呢?因為異或有一種我們需要的神奇的性質——消去律。

? ? ? ?1.對于Terminal?position只有一個,也就是全為0,結果也為0,故先行者必輸。

? ? ? ?2.某個局面(a1,a2,...,an),若a1^a2^......^an=k(k不等于0),則必有一種局面ai能夠通過合法的步驟轉換為ai',使結果變為0(k二進制中的某一位中的1必定是某個ai貢獻過來的),其中ai^k=ai'<ai(ai在k的二進制下最高位是1),所以是后行者必輸。

? ? ? 3.某個局面(a1,a2,...,an),若a1^a2^......^an=0,若ai能夠通過合法的步驟轉換成另一個局面ai'使結果也為0,那么a1^a2^..^ai^...^an=a1^a2^..^ai'^...^an,根據消去律,得到ai=ai',這是不合法的移動(因為還是它本身),所以是先行者必輸。

? ? ? 而這樣,我們就可以在O(n)內知道應該是先行還是后行了。

? ? ? 關于SG函數,我們先定義一種作用在集合的運算mex,定義結果為該集合中未出現最小非負整數,如mex{0,1,2,4}=3、 mex{2,3,5}=0、mex{}=0。

? ? ??對于一個給定的有向無環圖,定義關于圖的每個頂點的Sprague-Garundy函數g如下:g(x)=mex{ g(y) | y是x的后繼(就是子局面) }。

? ? ? 實際上,所以Nim游戲都可以抽象成一個模型:一個有向圖中,一個棋子代表著當前局面,每個頂點代表著每個局面,而每位選手則負責移動棋子,直到某個選手無法移動棋子則為負。

? ? ?所以對于SG函數的性質,跟上面所講的1,2,3是一樣的:

? ? ? 1.對于Terminal?position對應的頂點,就是沒有出邊,其g(x)=0;

? ? ? 2.若該點ai的g(ai)不為0,則它的后繼里存在一個頂點ai'它的g(ai')=0;

? ? ? 3.若該點ai的g(ai)=0;則它的后繼里沒有一個頂點ai'它的g(ai')=0。

? ? ? 事實上,如果有多堆石子,我們可以把每堆石子都抽象成一個棋子在圖中移動,那么我們所要做的就是講每個棋子所在頂點的SG值算出來,異或一下即可。

? ? ? 稍微變一下,有n堆石子,每次可以從第1堆石子里取1顆、2顆或3顆,可以從第2堆石子里取奇數顆,可以從第3堆及以后石子里取任意顆, 我們可以把它看作3個子游戲,第1個子游戲只有一堆x顆石子,每次可以取1、2、3顆,很容易看出x顆石子的局面的SG值是x%4(數學歸納法可以證明)。第2個子游戲也是只有一堆 石子,每次可以取奇數顆,經過簡單的畫圖可以知道這個游戲有x顆石子時的SG值是x%2。第3個游戲有n-2堆石子,就是一個Nim游戲。對于原游戲的每 個局面,把三個子游戲的SG值異或一下就得到了整個游戲的SG值,然后就可以根據這個SG值判斷是否有必勝策略以及做出決策了。

? ? ?g(x)=b,說明當前局面可以移動到g(a)=b-1,b-2,b-3.......1,0上。

? ? ? 所以,對于我們來說,我們是將一個復雜的游戲分成許許多多若干個簡單的小游戲,再分別求出SG值,再全部異或起來就是原游戲的SG值了。

? ? ? 關于題目所說的完美操作,雙方足夠聰明,指的就是當前這個局面如果能夠贏得這場游戲的話,這個人就會順著這個能夠贏的這條路徑進行下去,就是N-position。

轉載于:https://www.cnblogs.com/Lanly/p/7262998.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455552.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python標準庫sys_Python標準庫之Sys模塊使用詳解

sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不同部分. 處理命令行參數 在解釋器啟動后, argv 列表包含了傳遞給腳本的所有參數, 列表的第一個元素為腳本自身的名稱. 使用sys模塊獲得腳本的參數 復制代碼代碼如下: print "script name is", sys.argv[0] …

python3.7知識點匯總

Python3.7從零開始學 —|進入Python3.7的精彩世界 —|---|Python起源 —|---|—|Python作者簡介 —|---|—|---|Guido von Rossum&#xff0c;荷蘭人。1982年&#xff0c;Guido從阿姆斯特丹大學獲得了數學和計算機碩士學位。1989年&#xff0c;他創立了Python語言。 —|---|—|…

塊編碼、對象編碼、小波編碼、分布式編碼【轉貼】

人類獲取的信息中70%來自于視覺&#xff0c;視頻信息在多媒體信息中占有重要地位&#xff1b;同時視頻數據冗余度最大&#xff0c;經壓縮處理后的視頻質量高低是決定多媒體服務質量的關鍵因素。因此數字視頻技術是多媒體應用的核心技術&#xff0c;對視頻編碼的研究已成為信息技…

cookie練習

cookie是網站便于辨別用戶身份&#xff0c;進行 session 跟蹤而儲存在用戶本地終端上的數據。 cookie通過jsdom操作完成。 添加cookie&#xff1a; document.cookie ‘name val’;前一個是name&#xff0c;后一個是val。添加的時間是永久的。 document.cookie ‘name val ;…

算法學習系列(十):用數組模擬鏈表、雙鏈表、棧、隊列、單調棧、單調隊列

目錄 引言一、數組模擬鏈表1.模板2.例題3.測試 二、數組模擬雙鏈表1.模板2.例題3.測試 三、數組模擬棧1.模板2.例題3.測試 四、數組模擬隊列1.模板2.例題3.測試 五、數組模擬單調棧1.例題模板2.測試 六、數組模擬單調隊列1.例題模板2.測試 引言 首先說一下為什么要拿數組來模擬…

為什么你的路由器穿墻能力差?看完秒懂

1、信號弱賴我咯? 不管你承認與否&#xff0c;只要有墻家中就會存有信號死角&#xff0c;不要小看一墻之隔。如何讓路由器的信號增強? 網上一搜旁門左道真不少&#xff0c;什么調整天線尋找合理角度&#xff0c;又或是用易拉罐DIY一個信號放大器&#xff0c;然鵝并非簡單的將…

fish工具_Python程序員使用哪些開發工具

Python程序員使用哪些開發工具?很多Python學習者想必都會有如下感悟&#xff1a;最開始學習Python的時候&#xff0c;因為沒有去探索好用的工具&#xff0c;吃了很多苦頭。后來工作中深刻體會到&#xff0c;合理使用開發的工具的便利和高效。今天&#xff0c;北京學佳澳小編總…

[shiro學習筆記]第二節 shiro與web融合實現一個簡單的授權認證

本文地址&#xff1a;http://blog.csdn.net/sushengmiyan/article/details/39933993shiro官網: http://shiro.apache.org/shiro中文手冊&#xff1a;http://wenku.baidu.com/link?urlZnnwOHFP20LTyX5ILKpd_P94hICe9Ga154KLj_3cCDXpJWhw5Evxt7sfr0B5QSZYXOKqG_FtHeD-RwQvI5ozyT…

Web安全之Cookie劫持

1.Cookie是什么? 2.竊取的原理是什么? 3.系統如何防Cookie劫持呢? 看完這三個回答&#xff0c;你就明白哪位傳奇大俠是如何成功的!!! Cookie: HTTP天然是無狀態的協議&#xff0c;為了維持和跟蹤用戶的狀態&#xff0c;引入了Cookie和Session。Cookie包含了瀏覽器客戶端的用…

python中關于深拷貝和淺拷貝的詳解

python中關于深拷貝和淺拷貝的詳解 概述 在python的語法中,有兩種變量的拷貝方式 一種是深拷貝,一種是淺拷貝 我們先說深拷貝 語法 這里需要通過導入系統的copy模塊中的deepcopy才可以 import copy 新的對象 copy.deepcopy(被拷貝對象) 解釋 深拷貝是將操作對象整體復制…

運動估計簡介

運動估計( Motion Estimation) 維基百科鏈接&#xff1a;http://en.wikipedia.org/wiki/Motion_estimation運動估計的應用有很多&#xff0c;最初的應用的領域是視頻的編碼。運動估計算法一般分為: 像素遞歸法pel-recursive algorithm (PRA)和塊匹配法 block-matching algorith…

tutte定理證明hall定理_深入淺出|中心極限定理(Central Limit Theorem)及證明

在介紹統計學中最重要的定理之一-中心極限定理-之前&#xff0c;我們先來想一個問題&#xff1a;統計學的目的是什么&#xff1f;根據<Mathematical statistics with application 7th Edition>書中所寫的&#xff1a;統計學的目的是基于從總體中的樣本所獲得的信息&#…

讓數據中心變得更加友好

通常來說&#xff0c;數據中心是一個安全防護十分嚴密的地方&#xff0c;其安全功能的設計旨在阻止不速之客的訪問。但專家認為數據中心可以變得更加友好&#xff0c;因為數據中心需要在人類社會中發揮更大的作用。 數據中心的整體概念是一種可以通過云計算或其他方法進行遠程訪…

traceroute/tracert--獲取網絡路由路徑

traceroute 是用來檢測發出數據包的主機到目標主機之間所經過的網關數量的工具。traceroute 的原理是試圖以最小的TTL發出探測包來跟蹤數據包到達目標主機所經過的網關&#xff0c;然后監聽一個來自網關ICMP的應答。發送數據包的大小默認為 38個字節。 通過traceroute我們可以知…

使用Cygwin實現vlc 1.0.5的wince移植

本文完全參照了天將降的博客文章&#xff0c;寫于此以作來日備忘之用&#xff0c;原文地址&#xff1a;http://bk6.blog.163.com/blog/static/24498560201051193449196/ 第一步&#xff1a;下載安裝Cygwin。筆者建議大家不要安裝不完整的版本&#xff0c;以免出現不必要的錯誤…

andriod studio 運行 無結果_華為物聯網操作系統LiteOS內核教程01——IoT-Studio介紹及安裝...

1. 物聯網一站式開發工具 —— IoT StudioIoT Studio 是支持 LiteOS 嵌入式系統軟件開發的工具&#xff0c;提供了代碼編輯、編譯、燒錄 及調試等一站式開發體驗&#xff0c;支持 C、C、匯編等多種開發語言&#xff0c;讓您快速&#xff0c;高效地進 行物聯網開發。2. IoT Stud…

5G通信技術能否終結商用WiFi?

科技創新與體育發展可謂相生相伴&#xff0c;而如今科技在體育領域的應用也越來越廣泛。本周的話題關于5G技術與球場&#xff0c;作者為英國體育娛樂營銷咨詢公司Stadia Solutions的聯席首席執行官戈登坎貝爾。在坎貝爾先生看來&#xff0c;球場Wi-Fi賦予了俱樂部對數據的掌控力…

顏色轉換

以藍色為例&#xff0c;#0000FF應該被表示成rgb(0,0,255)。 我們將函數命名為getRGB() &#xff08;可以將字符串視為數組&#xff0c;這個數組的元素為字符&#xff09; function getRGB(color) {var rgb [parseInt(0xcolor.slice(1,3)),parseInt(0xcolor.slice(3,5)),parseI…

wince ./configure

CPPFLAGS"-I/usr/wince/include -D_WIN32_WCE0x0500" LDFLAGS"-L/usr/wince/lib" ./configure--hostarm-mingw32ce 指定軟件運行的系統平臺&#xff1b;host就是你編譯好的程序可以運行的平臺--target-osmingw32ce 指定軟件面向(target to)的系統平臺.這主…

android 按鍵會觸發ontouch嗎?_Android實現炫酷的拖拽浮動按鈕

IOS的Assistive Touch效果很炫酷&#xff0c;可以任意拖拽&#xff0c;同時點擊后會展開菜單欄。然而&#xff0c;這不只是IOS的特權&#xff0c;Android也可以實現。但是由于懸浮窗需要申請權限&#xff0c;所以本文僅在app內實現&#xff0c;可以任意拖拽&#xff0c;并可以響…