基於深度學習的一款五子棋小遊戲
阿新 • • 發佈:2022-05-11
今天分享一個基於深度學習而開發的AI小遊戲
簡單介紹
這一款基於深度學習的五子棋小遊戲的介面是使用Unity開發的,而網路結構是使用keras搭建的。
環境
筆者的環境如下
作業系統 windows 10
使用框架是keras
初始化介面
遊戲介面
棋譜部分程式碼
using System; using System.Collections; using System.Collections.Generic; using Wineforever; using System.Linq; using System.IO; using UnityEngine; using System.Diagnostics; using System.Text; public static class ai{ public struct Point { public int X; public int Y; } public static Point move() { var root = System.IO.Directory.GetCurrentDirectory(); //呼叫預測指令碼 System.Console.InputEncoding = System.Text.Encoding.UTF8; System.Diagnostics.Process exep = new System.Diagnostics.Process(); exep.StartInfo.UseShellExecute = false; exep.StartInfo.FileName = "cmd.exe"; exep.StartInfo.RedirectStandardInput = true; exep.Start(); exep.StandardInput.WriteLine("cd /d "+ root); exep.StandardInput.WriteLine("python predict.py"); exep.StandardInput.WriteLine("exit()"); exep.WaitForExit(); //分析輸出資訊 var policy_dic = Wineforever.String.client.LoadFromSheet(root + "\\policy.wf")["Policy"];//預測落子 //var eva = double.Parse(Wineforever.String.client.LoadFromSheet(System.AppDomain.CurrentDomain.BaseDirectory + "Assets\\eva.wf")["Evaluation"][0]);//勝率指數 var policy_list = policy_dic.Select((i => double.Parse(i))).ToList(); var sorted = policy_list.Select((x, i) => new KeyValuePair<double, int>(x, i)).OrderByDescending(x => x.Key).ToList(); //var policy_sorted = sorted.Select(i => i.Key).ToList(); var policy_index = sorted.Select(i => i.Value).ToList(); //轉換成落子座標 var Move = new Point(); for (int i = 0; i < 361; i++) { int index = policy_index[i]; int Y = index % 19, X = index / 19; if (GameObject.Find("board").GetComponent<logic>().Board_State[X,Y] == -1) { Move.X = X; Move.Y = Y; break; } } return Move; } }
網路結構
網路結構就很簡單了,使用keras搭建四層卷積層,輸入的尺寸是4x19x19
ef create_model(): lr = 1e-4 policy_net = Sequential() policy_net.add(Convolution2D(filters=32,kernel_size=(5,5),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr),input_shape=(4,19,19))) policy_net.add(Convolution2D(filters=64,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr))) policy_net.add(Convolution2D(filters=128,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr))) policy_net.add(Convolution2D(filters=4,kernel_size=(1,1),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr))) policy_net.add(Flatten()) policy_net.add(Dense(361,activation="softmax",kernel_regularizer=l2(lr))) adam = Adam(lr=2e-4) policy_net.compile(optimizer=adam,loss='categorical_crossentropy') policy_net.save('policy_model.h5')
訓練
使用命令:
python train.py
測試
在資料夾下點選gobang.exe即可
說明
專案中我已經將tarin的一部分資料放在Assets下的train中了,資料的數量比較的少,大概只用三四百個資料的樣子,這裡呢,當你完整和AI玩一盤遊戲後所產生的對戰資料也會被儲存在train的目錄下,這樣即可為後面的訓練提供資料的基礎。訓練時,它的loss下降的是很漫長的,這裡提供的模型,是經過使用了30000條資料經過大概三天的時間訓練而來的。大家在這個模型的基礎上繼續訓練,會有一個相對好的結果。但是呢,這個AI現在的棋力還是很弱的,暫時性的只是學會了如何下棋,想要達到打敗普通人還是很難的。想要達到一個很好的效果,還是需要花費大量的時間和資源進行訓練。
總結
由於筆者的水平有限,在表述上有不準確的地方,還請諒解。。。
原始碼地址:https://github.com/huzixuan1/AI_Gomoku
有問題歡迎新增1017190168討論交流