プログラミング教育用リバーシAIフレームワーク

Elementary School Junior and Senior High School Education


小学校でのプログラミング必修化も迫り、初等・中等教育におけるプログラミング教育をどのように行うべきかというのは重要な課題になっています。IT技術は非常に短い時間スケールで進化をするため、既存のコーディングの文法を教えるだけでは将来活用するための知見として十分とはいえません。そのため、リテラシー教育として、自分の達成したいことがどのように論理演算の上に実装することができ、実際にどのようにすれば実現できるかということを学際的・多角的に展開することが重要だと考えています。そのうちの一つの形として、ボードゲームのルール上で動作する人工知能を最適化していくことで、「どうやって自分の思考を言語化してコンピューターに実装するか」を体感する教材・フレームワークの開発を行いました。一般的にはリバーシは8×8の盤面ですが、ビギナーでもコーディングに集中できるように6×6の盤面を採用しています。実装にシンプルなウェブプログラミング(HTML5+CSS3+JavaScript(ES6以上))を用いてそのほかのフレームワークを用いないことで、任意のクラウドエディタ上で展開してブラウジング環境のみではじめることができます。例えば50人ぐらいの教室でも各々がスマートフォンを所持していれば成立する教育フレームワークです。

reveri AI platformの概要See the Pen OthelloAI Platform by puppy (@jedipuppy) on CodePen.


学生はこのCPU1を少しずつ改善していくことで強いプログラム作りを目指します。CPU1の思考部分は以下のようになっています。
othello_AI.AI1 = function(board,turn){

  Factor_NumOfDiscs = 1 //返す石の数をどれぐらい重要視するか(0以上の場合は多く返したがる。0以下だと少なく返したがる。)
  movelist = MovelistFunc(board.copy(),turn);
  var eval_list = []
  var eval_high = 0
    var eval_board = [  //盤面のそれぞれの位置の価値を設定(大きい数字なほど優先して打つようになる)
    [ 1, 1, 1, 1, 1, 1,],
    [ 1, 1, 1, 1, 1, 1,],
    [ 1, 1, 1, 1, 1, 1,],
    [ 1, 1, 1, 1, 1, 1,],
    [ 1, 1, 1, 1, 1, 1,],
    [ 1, 1, 1, 1, 1, 1,],
    ];

    for(var i=0; i < movelist.length; i++){
        eval_list.push(eval_board[movelist[i][0]][movelist[i][1]]+Factor_NumOfDiscs*movelist[i][2]+Math.random()*0.1);
    }
    best_move_index = eval_list.indexOf(Math.max.apply(null,eval_list) )
    best_move_array = [movelist[best_move_index][0],movelist[best_move_index][1]]
    return [best_move_array,eval_list];

}
思考部分はboard(盤面)、turn(手番)を引数にして、最善手及び各候補手の評価値を返します。このうち eval_board(着手場所に対応した評価値配列)とFactor_NumOfDiscs(返す石の数にかける係数)の2つのパラメータを調整することで強いプログラムを目指します。つまり評価値は座標x,yの位置にN個の石を返す場合について CPU1の思考 と計算することになります。このCPU1の場合は盤面すべてに対して「1」の評価値を返し、返す石の数に正の係数をかけるために単純にできるだけ多く返すプログラムと考えることができます。 例えば高校生が30分程度で調整した例として以下のようなものがあります。
 Factor_NumOfDiscs = 2.0
  var eval_board = [
  [ 10, 1, 4, 4, 1, 10,],
  [ 1, 1, 5, 5, 1, 1,],
  [ 4, 5, 6, 6, 5, 4,],
  [ 4, 5, 6, 6, 5, 4,],
  [ 1, 1, 5, 5, 1, 1,],
  [ 10, 1, 4, 4, 1, 10,],
  ];
この場合だと、隅を重要視して、その周辺の評価値を下げるというアイデアに到達していることが分かります。また Factor_NumOfDiscsについては序盤・中盤は小さいほうが筋よく打つが、最終盤は多く返したほしいため、そのバランスを加味して2.0という値に調整しています。

実践例

リバーシAI講座@広尾学園 2018年3月20日

講座用スライド

2018年3月20日に広尾学園で約30名の学生を対象に本プログラムを用いた2時間の講座を行いました。2名ペアの作業を行い全部で14個のプログラムができ、最後に500回の総当たり戦を行いました。以下の図はその時の結果でそれぞれの組み合わせに対する勝率(行が黒、列が白番)とイロレーティングを表示しています。参考にCPU2~6も参戦しています。学生が作ったプログラムはおよそ600~1100にレーティングが推移しており、それぞれの30分程度の最適化によって強さや相性に違いがでていることがわかります。

2018年3月20日の広尾の講座での結果

本講座においてアンケートで以下のようなフィードバックが得られました。

  • プログラミングってすごく頭良くてパソコンカチャカチャしているイメージだったので、私でもできるんだなって思ってすごく印象に残りました。最初、全然変な意見しか出てこない自分が嫌でしたが最後の方になるにつれだんだん割と大事な意見だったんだなと感じることが出来ました!
  • 盤面評価値を自分で色々いじってどんどん強いプログラムを作る為にはどうするできかと試行錯誤したこと。また、ディープラーニングの動きが加速し実際何をAIが行っているのか分からずただ結果だけを受け取るようになってきてる現代”学び”の概念が変わるのではないかという話もとても興味深かった。
  • プログラムを書く行程(考えるところ)が、授業内容としての自由度が高く自分の発想に委ねられている点で、新鮮味があって面白かったです。最後の締めの話は、とても熱い意見だったので参考になりました。
  • チームで作ったAIは盤面ごとの対応が出来ず、打って欲しいところに打ってくれなかったので臨機応変に対応するようなプログラミングを作るのは難しいと思いました。初期設定から少し変えるだけで強くなるのは面白かったです。
  • オセロは駒を置くときにプロは数字で見えるということに驚いた。また、その数字をAIに関数で入れ、数字を変えるだけで、AIの強さが変わって凄いと思った。
  • 講演有難うございました。プログラミングはしたことが無く少し不安でしたがめちゃくちゃ楽しかったです。また、第二回とかやって頂けたら嬉しいです。

自分より強いリバーシの人工知能を作ろう@東北大学 2018年6月9日

東北大学理学研究科・理学部の広報・アウトリーチ支援室が行っている「ぶらりがく」のイベントの一環として「自分より強いリバーシの人工知能を作ろう」という表題で行いました。約30名の小中学生が集まり、楽しくオリジナルのAIづくりに取り組みました。詳しくはこちらでレポートされています。

リバーシ×プログラミング@東京ガーデンテラス紀尾井町 2018年6月30日

Social Sports Park主催の元、東京ガーデンテラス紀尾井町で『リバーシ×プログラミング』として小中学生の親子20組を対象に行いました。子どものペアも大人のペアも大変楽しく盛り上がっていました。 詳しくはこちらでレポートされています。