第一篇說到整套 AI 有四種選擇要做:
1. 選職業
2. 組牌
3. 起手留牌
4. 打牌
每種選擇會用一個類神經網路來做,首先要設計的是每個類神經網路的輸入和輸出,選職業的部分在前一篇已討論完畢。
組牌的部分,輸入端最直觀的做法是把所有可選擇的牌和已選擇的牌列出來,由 AI 決定要選哪一張,重複 30 次這個動作就能組出一套牌,但因為一些現實因素,這是無法做到的。
首先,一張牌會有幾筆資料?
1. 花費
2. 攻擊力
3. 生命值
4. 是否嘲諷
5. 是否衝鋒
6. 是否聖盾
7. 是否風怒
8. 是否致命劇毒
9. 是否無法指定
10. 是否潛行
11. 是否生命竊取
12. 是否野獸
13. 是否龍類
14. 是否魚人
15. 是否機械
16. 是否惡魔
17. 是否海盜
18. 是否元素
18筆,好像有點多...
這才只是剛開始,再來是戰吼或法術可選擇的目標:
1. 無需指定
2. 可指定敵方
3. 可指定友方
4. 可指定手下
5. 可指定英雄
6. 需指定嘲諷
7. 需指定死聲
8. 需指定野獸
9. 需指定龍類
10. 需指定魚人
11. 需指定機械
12. 需指定惡魔
13. 需指定海盜
14. 需指定元素
15. 需指定凍結的
16. 攻擊力 n 以下
17. 攻擊力 n 以上
再來是法術的效果
1. 傷害目標
2. 治療目標
3. 殺死目標
4. 凍結目標
5. 傷害目標兩側
6. 凍結目標兩側
7. 傷害敵方全部手下
8. 傷害全部手下
9. 治療己方全部手下
10. 治療全部手下
11. 殺死敵方全部手下
12. 殺死全部手下
13. 傷害敵方英雄
14. 傷害己方英雄
15. 治療敵方英雄
16. 治療己方英雄
17. 抽牌
18. 棄牌
19. 目標生命值加成
20. 目標攻擊力加成
21. 友方手下生命值加成
22. 友方手下攻擊力加成
23. 目標本回合攻擊力加成
24. 友方手下本回合攻擊力加成
25. 英雄本回合攻擊力加成
26. 獲得護甲
27. 召喚翠玉魔像
28. 提升克蘇恩
29. 演化目標
30. 賦予目標嘲諷
31. 賦予目標聖盾
32. 賦予目標風怒
33. 賦予目標致命劇毒
34. 對兩側造成等同目標攻擊力的傷害
35. 對敵方手下造成等同目標攻擊力的傷害
36. 對全部手下造成等同目標攻擊力的傷害
37. 觸發目標的死亡之聲
39. 隨機友方手下生命值加成
40. 殺死隨機敵人
41. 本回合控制目標
42. 控制目標
43. 控制隨機敵人
44. 生命竊取
45. 秘密:打出手下時觸發
46. 秘密:施放法術時觸發
47. 秘密:攻擊手下時觸發
48. 秘密:攻擊英雄時觸發
49. 對目標造成無溢出傷害
50. 摧毀敵方秘密
51. 本回合下一個秘密費用為零
52. 本回合下一個戰吼觸發兩次
53. 治療隨機友方手下
54. 抽出一個秘密
55. 抽出一個武器
56. 使目標返回手中
57. 使全部手下返回手中
58. 使返回手中的手下費用改變 n
59. 是否任務
60. 獲得額外回合
61. 牌堆中無重複卡牌才可發動
62. 牌堆中無 2 費才可發動
63. 對手抽牌
64. 牌堆中手下變 0 費
65. 牌堆中手下攻擊加成
66. 牌堆中手下生命加成
這裡面還漏掉了非常多,但全部加起來一張牌已經要超過100個欄位了。
還有死聲、回合結束效果、常駐效果、二選一效果、三選一效果、四選一效果...
保守估計一張牌最少要 200 個欄位。
一開始說的理想做法,要把所有可選擇的卡牌跟已選擇的卡牌當作輸入,那至少是 200 張卡。一張 200 個欄位,輸入端的 size 就是 4 萬。類神經網路的神經數量,大約是輸入端的平方,所以一共要 16 億條神經,不用算也知道絕對爆記憶體,結論就是不可能這樣做。
目前想到的新作法是這樣:
* 類神經網路每次只審一張牌
* 審完之後給那張牌一個分數
* 所有可選的牌都審完一輪之後把分數最高的加入牌組
* 重複這個步驟直到牌組有 30 張牌
這樣如果一張牌的欄位有 200 個,輸入端的 size 就是 200,輸入端只要放入一張目前在審的牌就行了,完全不考慮其他牌。
這不就是單純的單卡評分系統嗎?
可以預期 AI 最後只會選競技場白板,完全不會搭配任何戰術。
但我已經想到方法來避免這個問題,請期待下一篇。