Minimax演算法及例項分析

2021-07-24 20:15:51 字數 2114 閱讀 7672

電腦科學中最有趣的事情之一就是編寫乙個人機博弈的程式。有大量的例子,最出名的是編寫乙個西洋棋的博弈機器。但不管是什麼遊戲,程式趨向於遵循乙個被稱為minimax演算法,伴隨著各種各樣的子演算法在一塊。

minimax演算法又名極小化極大演算法,是一種找出失敗的最大可能性中的最小值的演算法。minimax演算法常用於棋類等由兩方較量的遊戲和程式,這類程式由兩個遊戲者輪流,每次執行乙個步驟。我們眾所周知的五子棋、象棋等都屬於這類程式,所以說minimax演算法是基於搜尋的博弈演算法的基礎。該演算法是一種零總和演算法,即一方要在可選的選項中選擇將其優勢最大化的選擇,而另一方則選擇令對手優勢最小化的方法。

minimax是一種悲觀演算法,即假設對手每一步都會將我方引入從當前看理論上價值最小的格局方向,即對手具有完美決策能力。因此我方的策略應該是選擇那些對方所能達到的讓我方最差情況中最好的,也就是讓對方在完美決策下所對我造成的損失最小。

minimax不找理論最優解,因為理論最優解往往依賴於對手是否足夠愚蠢,minimax中我方完全掌握主動,如果對方每一步決策都是完美的,則我方可以達到預計的最小損失格局,如果對方沒有走出完美決策,則我方可能達到比預計的最悲觀情況更好的結局。總之我方就是要在最壞情況中選擇最好的。

例項分析:

現在考慮這樣乙個遊戲:有三個盤子a、b和c,每個盤子分別放有三張紙幣。a放的是1、20、50;b放的是5、10、100;c放的是1、5、20。單位均為「元」。有甲、乙兩人,兩人均對三個盤子和上面放置的紙幣有可以任意檢視。遊戲分三步:

甲從三個盤子中選取乙個。

乙從甲選取的盤子中拿出兩張紙幣交給甲。

甲從乙所給的兩張紙幣中選取一張,拿走。

其中甲的目標是最後拿到的紙幣面值盡量大,乙的目標是讓甲最後拿到的紙幣面值盡量小。

基本思路

一般解決博弈類問題的自然想法是將格局組織成一棵樹,樹的每乙個節點表示一種格局,而父子關係表示由父格局經過一步可以到達子格局。minimax也不例外,它通過對以當前格局為根的格局樹搜尋來確定下一步的選擇。而一切格局樹搜尋演算法的核心都是對每個格局價值的評價。

解題

下圖是上述示例問題的格局樹:

我們從甲的角度考慮。其中正方形節點表示輪到我方(甲),而三角形表示輪到對方(乙)。經過三輪對弈後(我方-對方-我方),將進入終局。黃色葉結點表示所有可能的結局。從甲方看,由於最終的收益可以通過紙幣的面值評價,我們自然可以用結局中甲方拿到的紙幣面值表示終格局的價值。

下面考慮倒數第二層節點,在這些節點上,輪到我方選擇,所以我們應該引入可選擇的最大價值格局,因此每個節點的價值為其子節點的最大值:

倒數第三層輪到對方選擇,假設對方會盡力將局勢引入讓我方價值最小的格局,因此這些節點的價值取決於子節點的最小值。  這些輪到對方的節點叫做min節點。

最後,根節點是max節點,因此價值取決於葉子節點的最大值。最終完整賦值的格局樹如下

總結一下minimax演算法的步驟:

首先確定最大搜尋深度d,d可能達到終局,也可能是乙個中間格局。

在最大深度為d的格局樹葉子節點上,使用預定義的價值評價函式對葉子節點價值進行評價。

自底向上為非葉子節點賦值。其中max節點取子節點最大值,min節點取子節點最小值。

每次輪到我方時(此時必處在格局樹的某個max節點),選擇價值等於此max節點價值的那個子節點路徑。

在上面的例子中,根節點的價值為20,表示如果對方每一步都完美決策,則我方按照上述演算法可最終拿到20元,這是我方在minimax演算法下最好的決策。格局轉換路徑如下圖紅色路徑所示:

強調幾點:參考

if用法及例項分析

以分號結束的一行 例 int a 2 int b 3 printf d n a比如這樣就有三個語句,其實也可以將它們寫在一行,但是會影響可讀性。用 將多行語句包起來,組成乙個復合語句 include int main 執行結果為 pass 可再加語句,再運用 使其內容增多 例 include int...

演算法 分治演算法及例項

關於二分查詢法 二分查詢法主要是解決在 一堆數中找出指定的數 這類問題。而想要應用二分查詢法,這 一堆數 必須有一下特徵 儲存在陣列中 有序排列 所以如果是用鍊錶儲存的,就無法在其上應用二分查詢法了。曽在面試被問二分查詢法可以什麼資料結構上使用 陣列?鍊錶?至於是順序遞增排列還是遞減排列,陣列中是否...

K最近鄰分類演算法原理及例項分析

目錄 1 概述 k最近鄰 k nearest neighbor,knn 指導思想是 近朱者赤,近墨者黑 由你的鄰居來推斷出你的類別,knn分類演算法是最簡單的機器學習演算法。2 原理 從訓練集中找到和新資料最接近的k條記錄,然後根據多數類來決定新資料類別,本質上,knn是使用距離來計算相似度。演算法...