日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nim 博弈论

發(fā)布時間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nim 博弈论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

幾種nim游戲

  • 1.排石頭游戲
  • 2.巴什博奕(Bash Game)
  • 3.威佐夫博奕(Wythoff Game)
  • 4.nim堆
  • 5思考題
  • 總結(jié)

1.排石頭游戲

給你一排n個石頭,每次只能取一個或兩個,求必勝策略
先討論石頭是奇數(shù)還是偶數(shù),奇數(shù)就從中間拿一個,然后,對手拿幾個,你就從與它對應(yīng)的位置上拿幾個。偶數(shù)的話就從中間拿2個。

2.巴什博奕(Bash Game)

只有一堆n個物品,兩個人輪流從這堆物品中取物,規(guī)定每次至少取一個,最多取m個。最后取光者得勝。
n=s+(m+1)*k
先手拿s個,然后對手拿l個,你就拿m+1-l個。

3.威佐夫博奕(Wythoff Game)

有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規(guī)定每次至少取一個,多者不限,最后取光者得勝。
這個游戲所包含的數(shù)學原理很深,先手必敗 ,公式是a=i*(1+sqrt(5))/2(I=0~n);b=a+n;
參考編程之美,里面將原理講的非常詳細。
公式證明就不寫了,主要就是證明a,b包含了整個自然數(shù)集,并且不重復(fù)。1/a+1/b=1。a-b=1。聯(lián)立方程組,求解。這里要引用一個定理,參考博客https://blog.csdn.net/maththinker/article/details/47757445

這是直接公式求解: bool nim(int x, int y) {double a, b;a = (1 + sqrt(5.0)) / 2;b = (3 + sqrt(5.0)) / 2;if (x == y)return true;if (x > y)swap(x, y);if (y - x == (long)floor(x*a))return false;return true; } 這是迭代出所以不安全局面: #include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorithm> #include<vector> #include<map> #include<queue> #include<Windows.h> #include<math.h> using namespace std; const int maxn = 100000; bool nim(int x, int y) {if (x == y)return true;//先手必勝,這是安全局面if (x > y)swap(x, y);if (x == 1 && y == 2)return false; //先手必輸,這是不安全局面vector<int> A;A.push_back(2);int n = 1;int delta = 1;int mp[maxn];memset(mp, 0, sizeof(mp));mp[2] = 1;while (x > n) {while (mp[++n]);delta++;A.push_back(n + delta);mp[n + delta] = 1;}if (x != n || !mp[y])return true;//已知的不安全局面中沒有它else return false; } int main(){cout << (nim(6, 10) ? "win" : "lose") << endl;system("pause");return 0; }

4.nim堆

有n堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規(guī)定每次至少取一個,多者不限,最后取光者得勝。
m1 ^ m2 ^ m3 ^ m4…=0表示先手必敗
改變一個值肯定使它們異或不為0 。如果一開始不為0,那么就找到這個改變的數(shù)使它變?yōu)?。

5思考題


這個思考題就比較有意思了,但是不難,不妨先將1,2,3,4,5,6,7等較小的局面給推出來。
我們可以知道n>1,n=2時,我拿只能拿一個,你就可以拿完,顯然是必輸局,暫稱為N。n=3時,顯然也是N局,n=4,顯然不是N局,暫稱為Y局,為了保證不一開始就輸,我只能拿1個,你為了不輸也只能拿一個,然后我就能拿完。n=5時顯然是必輸局勢,它只有兩種拿法,一種是拿一個,拿完后局勢就變成4,也就是你的Y局,拿2個,那就接輸了。所有我們不難發(fā)現(xiàn)一個規(guī)律,將前一個N局勢稱為Nn-1,(n-Nn-1)*2<Nn-1,讓后者不能一次拿光并且你處在N局勢,符合這個條件就是Y局勢。N局勢顯然就是不能轉(zhuǎn)換到前一個N局勢的數(shù)。
主要難點就在于對于狀態(tài)轉(zhuǎn)換的處理。如何將局勢轉(zhuǎn)換成必勝局勢,讓對手必輸。

總結(jié)

總的來說,博弈論游戲有很多,也沒人能將所有公式都列出來,也不必將所有公式都背下來,關(guān)鍵是如何分析問題,如何設(shè)計一個方法來解決它,更深層次就可以推導出它的數(shù)學原理。

總結(jié)

以上是生活随笔為你收集整理的nim 博弈论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。