1. 程式人生 > 其它 >基於深度學習的一款五子棋小遊戲

基於深度學習的一款五子棋小遊戲

今天分享一個基於深度學習而開發的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討論交流