Discuz! Board

 找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 97|回復: 0
打印 上一主題 下一主題

博弈遊戲的AI設計(二):博弈树與α

[複製鏈接]

2587

主題

2589

帖子

7857

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
7857
跳轉到指定樓層
樓主
發表於 2023-8-23 16:10:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
上一篇咱們先容了极大极小树。

對付分硬币如许相對於简略的遊戲,它仍是可以或许用得上的。可是呢,它必需得穷举出所有的状况。再從闭幕状况起頭,计较每一個节點的估值,最後才能获适當前最優的决议计劃。

绝大部門的遊戲,决议计劃空間都至關巨大。

三子棋

即便是最简略的三子棋(又叫做“井”字棋,一字棋)。它的第一步有9種决议计劃,然後對面有9*8=72種决议计樹林抽水肥,劃,....,最後一层的决议计劃個数到达了 9! = 362880 種。如斯简略的遊戲,在不做特别處置的時辰,都有几十万種决议计劃(固然這個量级计较機仍是可以或许hold住的)。它的棋盘巨细仅仅是3 X 3,五子棋是15 X 15,围棋是19 X 19,想要穷举出所有决议计劃,几近是不成能的。

是以,咱們不克不及够像上一章那样,每次都穷举出所有的成果,再去渐渐找最優决议计劃。跟着树的深度的增长,咱們的节點個数是指数级上升的。

咱們不雲林找小姐,能不搜刮到必定水平,就遏制继续往下搜刮。

當咱們停下来今後,這個時辰,因為咱們遊戲尚未竣事,咱們若何果断當前的成果的黑白?

咱們必要設計一個评價函数(Evaluation function)對付當前場合排場举行评分。這個评價函数若何設計?主如果按照分歧的遊戲,另有人類的平常履历来果断。

我那時設計五子棋AI的時辰,就報酬的設計了一個评價當前場合排場的分数的函数。好比已有5個子连成一線了,它就是最高分;若是有4個子连成一線,它就是次高分;另有雙3,...。如许咱們就可以按照場合排場,得到一個得分。固然,當對面挪用這個评價函数的時辰,得到的分数前面要取一個负号。由於敌手的最高分,就是咱們的最低分。

有了评價函数,咱們便可以随時终止咱們的搜刮了。由於對付任何場合排場,咱們都可以或许给出一個收益得分 。咱們可以限制咱們的搜刮的深度,随時竣事搜刮。

可是咱們的搜刮空間依然很是巨大。由於最起頭的几层,可做的决议计劃是至關多的。

好比五子棋,第一步就有225種下法。而敌手對應就有225*224=50,400種决议计劃;再往下一层,就有225*224*223=11,239,200種。這才第三层,就已快爆炸了。

一般五子棋的妙手都能想到後面五六步,乃至十几步。想要與之匹敌,咱們必需得想法子削减咱們的搜刮数目,增长咱們的搜刮深度,如许咱們的AI才能看得更远的将来,想得更多,如许棋力才會變强。

這里,咱們用到了壮大的α-β剪枝技能。它的思绪就是,削减所有無需要的搜刮,實時终止,從而节流算力,同時又不克不及漏過所有可能的最優解。下面来具體先容一下。

咱們先来理解一下,怎样样的搜刮是没有需要的,假如咱們限制了搜刮深度為3,咱們重新起頭搜刮,以下:

咱們從根节點往下搜,直到第一個叶子节點:

此時,达到了第一個深度為3的节點,此時咱們挪用估值函数,假如咱們得到它的收益為3,如今咱們轉頭来看它的父节點:

因為,這個父亲节點是MIN节點,咱們晓得,它老是會選擇子节點中最小值。如今,子节點已呈現了一個值為3。

如今细心想一想,若是咱們继续得到它的子节點的收益,為一個比3要大的值,假如為12好了。那末當前的父节點,必定不會選擇這個12,而會去選擇3。是以,這個父亲节點的收益,不管若何,都不會跨越3,那末它的取值范畴,咱們可以认為是:(-∞,3]。也就是说,咱們的子节點,實在更新了它的父节點的收益的一個上界值,如圖:

到這里,咱們實在并無举行剪枝,只是找到了一個父节點的上界值(β值),咱們仍是得继续搜刮它的子节點:

假設咱們搜刮到了12,咱們仍然试圖更新父节點的上界值(β值),可是由於比3要大,更新失败了,继续搜刮下一個,直到搜刮完所有的固然父节點的所有子节點:

當它所有的子节點都被搜刮完今後,咱們實在可以晓得當前节點的收益就是3了。這個時辰咱們可以點窜它的下界為3,收益為3。

注重這個時辰,實在跟以前的极大极小树的搜刮進程没有區分,咱們并無举行任何的剪枝。接下来继续搜刮:

咱們肯定了當前节點收益為3,再去看它的父节點,即根节點。根节點本来的收益值范畴是(-∞,+∞)。如今咱們找到了一個子节點收益是3。

根节點是一個MAX节點,跟以前相反,子节點的收益值3,可以用来更新的是根节點的下界(α值)。至於為甚麼,可以類比一下以前的。咱們如今已有搜刮到一個3,若是咱們今後搜刮到比3小的值,那末根节點在取最大值的時辰,必定會選擇更大的3,而不是其他值。是以最優解的下界就是3,不會再更小了。

咱們带着根节點的取值區間[3, +∞)继续往下搜刮,把這個區間赋给下一個子节點:

往下继续深度優先遍历,拜候它的第一個子节點。此時达到設定的深度3,咱們挪用评價函数,假如评價函数返回值為2:

注重,重點来了。

咱們晓得,當前子节點是一個收益為2的MAX节點。MAX节點可以更新父节點的上界。是以,父亲节點的上界,被點窜成為了2。 這里就呈現了一個抵牾的區間[3,2],以下圖:

察看當前的节點,它的收益值的取值區間是[3,2]。這较着是分歧理的,收益不成能下界是3,同時上界又是2。咱們可以做出果断,這個节點不管若何都不成能是最優解。

因為這個區間已發生了抵牾,咱們可以直接给當前节點判极刑,跳多余下所有的子节點了:

上面的操作叫做α-β剪枝(究竟是α仍是β我也搞不清)。

你可以细心想想。总之,收益值的可行區間一旦酿成抵牾的,阐明當前节點必定不會是得到最優的决议计劃,那末咱們可以直接跳過這個节點,無论它另有几多個子节點没有被搜刮。

----------------------  塌實的朋分線  ----瑪卡,------------------

Tips: 若是你感觉我上面一段颇有事理,可以疏忽這部門內容。

若是你是一個严谨的猜疑论者,內心不塌實,請继续看下去下面的证實進程。

咱們就来细心阐發會商一下,假設咱們接着往下搜刮會產生甚麼:

剩下的值不過就两種环境,咱們全都来會商一遍:

第一種,搜刮到比2小的值,好比1:

那末它的父亲节點是個MIN节點,會選擇比2更小的1,假如最後中心的节點收益就是這個1,再看根节點:

因為根节點是MAX节點,是以,即便找到了收益更小的1,根节點其實不會選擇它,而是選擇更大的值為3的左侧阿谁节點。

第二種环境,搜刮到比2大的值,好比5:

它其實不能取代2,以是中心节點的收益仍是2。在根MAX节點做弃取的時辰,仍然仍是會選擇更大的左侧的阿谁3的节點。

是以,咱們可以安心地说,當發明收益值的區間發生抵牾的時辰,咱們當前的节點不管再怎样继续搜刮,也不成能呈現最優解了。這下可以安心跳過了。

----------------------  塌實的朋分線  ----------------------

在這個例子內里,咱們已给中心阿谁點判了极刑,直接跳過它剩下的2個子节點,轉到了右侧阿谁节點。

老端正,把父亲节點的可行區間通報给當前子节點,继续往下深度優先遍历:

到了叶子节點,挪用估值函数,假如這回返回的收益是14:

因為14是MAX层,试圖更新父节點的上界。没有發生抵牾區間,继续往下搜。假如下一個搜刮到的是1:

更新上界,發生抵牾區間,遏制继续搜刮。到這里咱們遍历了根节點的所有可能子节點,可以做出终极果断,根节點的收益终极值為3,和获得最優的路径:

經由過程保护一個收益的可行區間,在搜刮的進程中举行剪枝操作,就是所谓的α-β剪枝

因為α-β剪枝剪掉的點,都是必定不成能是最優解的节點,是以咱們永久不會错過最優解。同時,因為實時的剪枝操作,咱們大大地削减了必要搜刮的节點数目,节流下来的算力就可以举行更多更深條理的搜刮。

這就是傳说中的博弈树跟α-β剪枝的道理了。

下面中醫治療口臭,给出實現的伪代码:

  1. Max-Value-Pruning(node, a, b):
  2. if node is Terminal Node:         //果断是不是终止搜刮
  3. return Evaluation(node)          //挪用评價函数
  4. v = -∞
  5. for action in node.actions:       //對付當前所有的动作
  6. child = Result(node, action)    //得到子节點的状况
  7. v = v臉面膜,max(v, Min-Value-Pruning(child, a, b))
  8. if v >= b:
  9. return v
  10. a = max(a, v)
  11. return v
  12. Min-Value-Pruning(node, a, b):
  13. if node is Terminal Node:
  14. return Evaluation(node)
  15. v = +∞
  16. for action in node.actions:
  17. child = Result(node, action)  //得到子节點的状况
  18. v = min(v, Max-Value-Pruning(child, a, b))
  19. if v <= a:
  20. return v
  21. b = min(b, v)
  22. return v
複製代碼
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|台灣運動娛樂論壇  

娛樂城, 百家樂, 真人百家樂, 中醫推薦, 現金板, 彰化當舖, 彰化汽車借款, 彰化機車借款, 現金版, 刷卡換現金, 娛樂城, 運彩玩法, 7M足球即時比分, NBA即時比分, 發發發老虎機, 百家樂, 歐冠杯歐冠杯決賽歐冠盃歐冠盃決賽LEO娛樂財神娛樂財神娛樂城娛樂城註冊送娛樂城體驗金線上娛樂線上娛樂城賭博場所運彩場中運動彩券場中台灣運動彩券首頁運動彩券單場運彩單場運動彩場中投注場中投注表場中投注時間表場中投注時刻表台灣運彩足球賠率台灣運彩場中

GMT+8, 2024-5-2 11:53 , Processed in 0.058496 second(s), 4 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表