Learning

コンピュータ同士で対戦した結果(1局=1分~2分)の学習準備です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. CSForm.cs にコンピュータ同士で対戦するソースを追加します。
    元のソースは Base Project を参照して下さい。
        // Constructor
        public MyForm()
        {
            BackColor = SystemColors.AppWorkspace;
            Width  = 560;
            Height = 600;
            Paint += new PaintEventHandler(MyHandler);
            MouseDown += new MouseEventHandler(OnMyMouseDown);
    
            m_teban = 0;
            m_t = (int[,])m_tt.Clone();
            while(m_teban!=9)
            {
                m_teban = Chenge(m_teban);
                if (m_teban==9) break;
                Think(0, m_teban, m_t);
                y= m_pos/10;
                x= m_pos%10;
                if (Reverse(m_teban, x, y, m_t)==false)
                {   string str = "Think Play Error  C:" + m_teban + "[" + y + "," + x + "]";
                    MessageBox.Show(str);
                    return;
                }
                m_dat[m_num] = y*10+x;
                m_num++;
            }
            Invalidate();
        }
    
        // 終局判定と手番の切り替え
        int Chenge(int c)
        {   ArrayList   array;
            int     nc;
            if (c == 0)
            {   m_num = 0;
                m_my = 1;
                m_you = -1;
                return 1;           // 黒番で Start
            }
            if (c==9)   return 9;   // ゲーム終了
            nc= 0-c;                // 手番の切替
            array = Search(nc, m_t);
            if (array.Count>0)
            {   nc = Set_Teban(m_num);
                return nc;
            }
            array = Search(c, m_t);
            if (array.Count>0)
            {   m_dat[m_num] = 99;
                m_num++;
                return c;
            }
            return 9;       // 終局
        }
    
  2. コンピュータ同士で対戦した結果の学習準備です。
    MyForm() の Constructor で事前に対戦結果を学習します。
    学習結果が効果を発揮するには数万件以上の対局データが必要で、データベースなど専用のファイルを利用するのでしょうね。
    今回は、取り合えず1局だけの対局データを収集してみました。
    m_teban が 9 になるまで、黒と白を切り替えながら Think() でプレイします。
    ループから抜けると1局分の対局データが m_dat[70] に格納されています。
    ディープラーニング(deep learning)は三目並べゲームの方が先輩です。
    対局データの登録は 三目並べの自動学習 を参考にして下さい。
            m_teban = 0;
            m_t = (int[,])m_tt.Clone();
            while(m_teban!=9)
            {
                m_teban = Chenge(m_teban);
                if (m_teban==9) break;
                Think(0, m_teban, m_t);
                y= m_pos/10;
                x= m_pos%10;
                if (Reverse(m_teban, x, y, m_t)==false)
                {   string str = "Think Play Error  C:" + m_teban + "[" + y + "," + x + "]";
                    MessageBox.Show(str);
                    return;
                }
                m_dat[m_num] = y*10+x;
                m_num++;
            }
            Invalidate();
    
  3. 終局の判定と手番の切り替えを行う Chenge() 関数です。
        int Chenge(int c)
        {   ArrayList   array;
            int     nc;
            if (c == 0)
            {   m_num = 0;
                m_my = 1;
                m_you = -1;
                return 1;           // 黒番で Start
            }
            if (c==9)   return 9;   // ゲーム終了
            nc= 0-c;                // 手番の切替
            array = Search(nc, m_t);
            if (array.Count>0)
            {   nc = Set_Teban(m_num);
                return nc;
            }
            array = Search(c, m_t);
            if (array.Count>0)
            {   m_dat[m_num] = 99;
                m_num++;
                return c;
            }
            return 9;       // 終局
        }
    
  4. コンピュータ同士で対戦しても1局分のデータを収集するのに「1分~2分」かかります。
    3目並べでは数万件のデータを登録して初めて効果を発揮しました。
    オセロゲームでは3目並べに比べようもない多量のデータが必要になりそうです。
    データを集めるには1局=1分としても、途方もない時間を必要とします。
    データを収集するには限界がありそうなので、ディープラーニングに関する私の感想を述べます。

[Next Chapter ↓] Osero Game
[Previous Chapter ↑] Base Project

超初心者のプログラム入門(C# Frame Work)