1. 程式人生 > >中國象棋人機對弈搜尋演算法學習-極大極小值,負極大值,alpha-beta演算法

中國象棋人機對弈搜尋演算法學習-極大極小值,負極大值,alpha-beta演算法

極大極小值法

深度搜索(dfs)虛擬碼

/**
1。 p 為棋盤
2。 d 為規定的搜素最大深度,比如d層紅方,d-1層為黑方,d-2層為紅方...依此類推,可採用mod2來判斷當前是哪一方
4。評估棋盤的函式evaluation,當然需要看是哪一方,若紅方為機器,黑方為人,那麼機器(紅方)做為極大(INF),人作為極小(-INF),讓機器選擇最合適的一步。
**/
int MiniMax(chessmap p , int d)
{
    int bestvalue , value ;
    if( Game Over )// 如果遊戲結束
        return evaluation(p);
    if
(depth <= 0) // 如果已經到了搜尋樹葉子結點 return evaluation(p); if( d % 2 == RED) //輪到紅方 bestvalue = - INF; else bestvalue = INF ; for(each possible move m) { MakeMove(m) ; //產生第i個局面(子節點),p會相應變化 value = MiniMax(p,d-1);//遞迴 UnMakeMove(m) ; // 恢復p if
(d % 2 == RED) bestvalue = max(value ,bestvalue);//取最大 else bestvalue = max(value ,bestvalue);//取最小 } return bestvalue; }

思路

負極大值法:

虛擬碼

負極大值法 依然是 極大極小值法,只是多了個負號。博弈樹中父結點的值 是 其子節點的 負最大值。即 黑方取最大,紅方取 負最大,這樣比較最大就行了。程式碼要比極大極小值法要好簡潔一些。

實現時,需要用變數儲存每一次移動情況,DFS中只需要擁有一個最大深度的陣列即可。結束時,取陣列的第一個移動,作為當前的最好移動。

Alpha-beta搜尋演算法

口袋的例子
 
  比如你的死敵面前有很多口袋,他和你打賭賭輸了,因此他必須從中給你一樣東西,而挑選規則卻非常奇怪:
  每個口袋裡有幾件物品,你能取其中的一件,你來挑這件物品所在的口袋,而他來挑這個口袋裡的物品。你要趕緊挑出口袋並離開,因為你不願意一直做在那裡翻口袋而讓你的死敵盯著你。
  假設你一次只能找一隻口袋,在找口袋時一次只能從裡面摸出一樣東西。
  很顯然,當你挑出口袋時,你的死敵會把口袋裡最糟糕的物品給你,因此你的目標是挑出“諸多最糟的物品當中是最好的”那個口袋。
  你很容易把最小-最大原理運用到這個問題上。你是最大一方棋手,你將挑出最好的口袋。而你的死敵是最小一方棋手,他將挑出最好的口袋裡儘可能差的物品。運用最小-最大原理,你需要做的就是挑一個有“最好的最差的”物品的口袋。
  假設你可以估計口袋裡每個物品的準確價值的話,最小-最大原理可以讓你作出正確的選擇。我們討論的話題中,準確評價並不重要,因為它同最小-最大或Alpha-Beta的工作原理沒有關係。現在我們假設你可以正確地評價物品。
  最小-最大原理剛才討論過,它的問題是效率太低。你必須看每個口袋裡的每件物品,這就需要花很多時間。
  那麼怎樣才能做得比最小-最大更高效呢?
  我們從第一個口袋開始,看每一件物品,並對口袋作出評價。比方說口袋裡有一隻花生黃油三明治和一輛新汽車的鑰匙。你知道三明治更糟,因此如果你挑了這隻口袋就會得到三明治。事實上只要我們假設對手也會跟我們一樣正確評價物品,那麼口袋裡的汽車鑰匙就是無關緊要的了。
  現在你開始翻第二個口袋,這次你採取的方案就和最小-最大方案不同了。你每次看一件物品,並跟你能得到的最好的那件物品(三明治)去比較。只要物品比三明治更好,那麼你就按照最小-最大方案來辦——去找最糟的,或許最糟的要比三明治更好,那麼你就可以挑這個口袋,它比裝有三明治的那個口袋好。
  比方這個口袋裡的第一件物品是一張20美元的鈔票,它比三明治好。如果包裡其他東西都沒比這個更糟了,那麼如果你選了這個口袋,它就是對手必須給你的物品,這個口袋就成了你的選擇。
  這個口袋裡的下一件物品是六合裝的流行唱片。你認為它比三明治好,但比20美元差,那麼這個口袋仍舊可以選擇。再下一件物品是一條爛魚,這回比三明治差了。於是你就說“不謝了”,把口袋放回去,不再考慮它了。
  無論口袋裡還有什麼東西,或許還有另一輛汽車的鑰匙,也沒有用了,因為你會得到那條爛魚。或許還有比爛魚更糟的東西(那麼你看著辦吧)。無論如何爛魚已經夠糟的了,而你知道挑那個有三明治的口袋肯定會更好。
草圖,理解著思考

我:我的接受程度有下限,給我的太差,我肯定不幹。
對方: 我肯定給你相對最差的,但是我無法確定每個口袋究竟有哪些物品,我不希望出現某個口袋好東西很多,我可給不起。

相關推薦

中國象棋人機對弈搜尋演算法學習-極大極大值alpha-beta演算法

極大極小值法 深度搜索(dfs)虛擬碼 /** 1。 p 為棋盤 2。 d 為規定的搜素最大深度,比如d層紅方,d-1層為黑方,d-2層為紅方...依此類推,可採用mod2來判斷當前是哪一方 4。評估棋盤的函式evaluation,當然需要看

QT五子棋專案詳解之四:AI人機對戰max-min極大博弈演算法

不考慮博弈的演算法怎麼能算是AI呢?max-min極大極小值演算法就是考慮了博弈的演算法。來看一個簡單的例子在這個棋局中,電腦為白旗,白旗走哪一步更好呢,也許使用策略表會告訴你,應該衝4,但是衝4後,玩家就會連成4。這就是考慮了博弈之後,這一步棋就是敗局。這就是為什麼有max

五子棋(人機)-極大搜尋演算法

從人落子開始到出現勝負或者和局,之間所落的子,構成了一個解。而解空間就是一個樹,解就是這解空間中的一條路徑。只不過這個解空間是電腦的選擇和人的選擇共同構成的(奇數層是電腦(因為輪到電腦落子麼),偶數層是人)。 極大極小值搜尋演算法,來搜尋(回溯)這個解空間:它假設人和電腦都

201803-4棋局評估_極大演算法_對抗搜尋(轉載)

問題描述 試題編號:201803-4 試題名稱:棋局評估 時間限制:1.0s 記憶體限制:256.0MB 問題描述:問題描述  Alice和Bob正在玩井字棋遊戲。   井字棋遊戲的規則很簡單

極大搜尋 + 剪枝

/* 題意: Alice和Bob玩遊戲,在一個4x4 的方格上 每個人每次選擇2x2的區域將裡面的四個值求和加到最後的分數當中(兩個人共用一個分數), 然後逆時針翻轉它們, Alice想要分數儘量大Bob想要分數儘量小 兩個人每次的選擇都是最優的,求最後的分數

牛頓法求極大

牛頓法至少有兩個應用方向,1、求方程的根,2、最優化。牛頓法涉及到方程求導,下面的討論均是在連續可微的前提下討論。 1、求解方程。 並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。 原理是利用泰勒公式,在x0處展開,且展開

極大搜尋和阿爾法貝塔剪枝搜尋演算法的簡單描述與理解--萌新向通俗易懂

這是本人第一次正經寫部落格,排版技術不行,看起來可能有點難受,但我相信如果大家認真按順序讀下去一定能理解這個演算法,如果還有不是很清楚或者覺得我哪裡有講錯的地方歡迎評論留言!這段時間都在!會看和回覆的! 阿爾法貝塔剪枝是基於極大極小值搜尋的一種演算法。 舉個比較簡單的例子

基於Qt Creator實現中國象棋人機對戰 c++實現

這是自己大一學完c++後,在課程實踐中寫過的一個程式,實現象棋人機對戰的演算法還是有點難的, 自己當時差不多也是寫了兩個月左右吧!當時看書又有很多問題得不到解決,所以就在網上找了一個視訊跟著

[演算法] 極大搜尋

原文連結: http://www.xqbase.com/computer/search_minimax.htm總結兩點:1. 深度優先搜尋,只有在葉子節點計算評估分。 2. max和min層只負責從分支中,選擇最大或者最小的評分。《對弈程式基本技術》專題 最小-最大

極大演算法

作者:知乎使用者 連結:https://www.zhihu.com/question/27221568/answer/140874499 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   先來說極小極大演算法主要應用於什麼樣的遊戲: 1. 零和遊戲(

【LeetCode 913】cat-and-mouse | BFS+記憶化 | 極大搜尋+AB剪枝 | CGUZ | H

【難題警告!】 核心:BFS + 記憶化(標程) /  極大極小搜尋 + alpha-beta剪枝(近似解) Difficulty : Hard     Discuss (32) ACCEPTED  1,341          SUBMISSIONS  6

博弈基礎——極大搜尋

        計算機博弈(也稱機器博弈),是一個挑戰無窮、生機勃勃的研究領域,是人工智慧領域的重要研究方向,是機器智慧、兵棋推演、智慧決策系統等人工智慧領域的重要科研基礎。機器博弈被認為是人工智慧領

極大演算法原理

參考書籍《人工智慧基礎教程》 該演算法的搜尋策略是考慮雙方若干步之後,從可能的步中選擇相對較好的走發來走。 以MAX表示程式方,MIN表示對手方,P表示局勢,f(P)是根據當前局勢做出的估計函式。 則 F(p)>0表示對MAX有利的局勢 F(p)<0表示對MI

CCF 201803-4 棋局評估 極大搜尋

題意:3X3的井字棋,1先走,2後走,給定一個狀態。當前輪到1走,1,2都按照最優策略行棋,求最後的分數。 #include <cstdio> #include <algorithm

演算法學習之資料結構之單鏈表反轉兩兩反轉

  連結串列反轉,就是將連結串列從1->2->3->4->5這種形式反轉成5->4->3->2->1這種形式,目前能想到的有兩種實現方式,對於什麼是連結串列,連結串列的一些性質就不多說了,直接說兩種實現方式,實現方式如下:   1,用頭節點插入法新建連結串列。反

MATLAB—一字棋(極大搜尋

init.m %初始化棋盤狀態 function cur=init() cur=rand(3,3); %儲存當前棋盤的狀態 %計算機為先手時的初值,即均為0 for i=1:3 for j=1:3 cur(i,j)=0;

poj 1085 Triangle War 1568 Find the Winning Move 極大搜尋 alpha-beta剪枝

一,極大極小搜尋及alpha-beta剪枝(參考這裡) 在博弈搜尋中,比如:圍棋,五子棋,象棋等,結果有三種可能:勝利,失敗和平局。 理論上可以窮舉所有的走法,這就需要生成整棵博弈樹。實際上不可行。因此搜尋時可以限制博弈樹的深度,到達該深度則不再往下搜,相當

POJ 1085 Triangle War(極大搜尋+alpha-beta剪枝)

// // main.cpp // Richard // // Created by 邵金傑 on 16/8/29. // Copyright © 2016年 邵金傑. All rights reserved. // #include<iostream&g

POJ 1085 Triangle War(博弈極大搜尋+alpha_beta剪枝)

題目:給出10個點,總共有18條邊,每次兩個人輪流加入一條邊,如果形成一個三角形,則三角形歸他所有,而且可以額外再走一步。最後三角形多的人勝 博弈問題 所謂的極大極小搜尋,其實就是搞個估價函式。然後主角肯定選個估價函式最大的,即對自己最有利的局面走。 而輪到對方的時候,

極大搜索思想+(α/β)減枝 【轉自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

ima 基本 個數 博弈論 數字 這就是 pre -- 繼續 極大極小搜索,即minimax搜索算法,專門用來做博弈論的問題的暴力. 多被稱為對抗搜索算法. 這個搜索算法的基本思想就是分兩層,一層是先手,記為a,還有一層是後手,記為b. 這個搜索是認為這a與b的利益關