Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

「C#大好きMVPによるドキドキ ライブ コーディング」小島の分 | BuriKaigi2018

2,641 views

Published on

BuriKaigi2018
https://toyama-eng.connpass.com/event/72023/
2018/02/03

Published in: Technology
  • Be the first to comment

  • Be the first to like this

「C#大好きMVPによるドキドキ ライブ コーディング」小島の分 | BuriKaigi2018

  1. 1. C# 大好き MVP による、 C# ドキドキ・ライブコーディング ~ 小島の分 ~ BuriKaigi2018 - 富山合同勉強会 2018/02/03 小島 富治雄 #burikaigi
  2. 2. 自己紹介  小島 富治雄  @Fujiwo  福井コンピュータアーキテクト株式会社  Microsoft MVP (2005-2018) C#関連
  3. 3. 今回のお題 オセロの CPU アルゴリズム 4人打ち (チーム戦)
  4. 4. 2015年のお題「七ならべ」のときに 思いついた「工夫」  リフレクション? 他の人が書いたクラスのメソッドを書き換える? Unsafe? メソッドが取り替えられないなら インスタンスを取り替えてしまえば 良いじゃない
  5. 5. 以前の4人打ちオセロでの「工夫」  最初に4人分戦わせて、一番強いひとが私の代わりに打てばよいのに。  自 AI のコンストラクターで、事前に5回対戦して強いひと (AI) を選んどく。 class PlayerTable : IEnumerable<KeyValuePair<Board.Piece, IPlayer>> { Dictionary<Board.Piece, IPlayer> playerDictionary = new Dictionary<Board.Piece, IPlayer>(); …… } class GameRunner { …… }
  6. 6. PlayerChecker: 一番強いひとをチェック class PlayerChecker { readonly Board.Piece theStrongestPiece; readonly PlayerTable playerTable = new PlayerTable( players: new IPlayer[] { new PlayerRyotaMurohoshi(), new PlayerAILight (), new PlayerXin9le (), new PlayerFujiwo () } ); public static Board.Piece TheStrongestPiece => theStrongestPiece; …… }
  7. 7. 自分の番が来たら 一番強い (誰かの) AI に打たせる 6
  8. 8. … …が、駄目…! 7 動作せず… 他の人の AI もこちらの判定ルーチンをコール 呼び出しが無限ループ 犯罪的だっ…! ざわ… ざわ…
  9. 9. もっとひどい AI までっ…! 8 それをやってしまったら…… 戦争だろうがっ…! ざわ… ざわ… 開始時に、ルールを無視して 石を全部自分の色に変更!!!
  10. 10. さて今回は… 9
  11. 11. 不採用だったアルゴリズム  「ライフライン」 テレフォン  例えば、 twilio (電話API) でオセロ名人に電話をかけて正着を訊いてはどうか オーディエンス 会場アンケートAPI (謎) 50:50 ちょっとよくわからない
  12. 12. 社会的ハック 11 敵チームのひとりを事前に買収
  13. 13. 社会的ハック 12 「石が少ないことこそ美しい」という価値観の創生
  14. 14. アクセラレーション・ブースト! 13  await System.Accelatation.Boost.Start(時間の掛かる処理); やや専門的になるが、投機的実行をする際には、本来メモリに厳重 に保管してある重要な情報を取り出して、ハードディスク上などに 設けた「仮想メモリ」に持ち込み、そこで「アクセラレーション・ ブースト」と呼ばれる処理速度の加速をかける。 米グーグルのハッカー集団を震撼させた「インテル問題」の深刻度 | 現代ビジネスより
  15. 15. そんな中… ある日のチャット… 14
  16. 16. AI を強化して勝つっ…!! 15 AI のアルゴリズムで勝つ なんとその手があったっ…! なんと卑怯な……! そうまでして勝ちたいか…! ざわ… ざわ…
  17. 17. というわけで… 今回の AI アルゴリズム
  18. 18. リフレクション対策は必須! public class AIOriginal : IPlayer { protected bool CallingByEnemy { private get; set; } = false; public AIOriginal() => CallingByEnemy = !Assembly.GetCallingAssembly().GetName().Name.Equals( Assembly.GetEntryAssembly().GetName().Name); public Task<Point> GetPointAsync(Board board) => Task<Point>.Run(() => CallingByEnemy ? GetRandomPoint(board) : GetAPoint(board)); } 17
  19. 19. リフレクション対策は必須! public class AI : AIOriginal { public AI() => CallingByEnemy = !Assembly.GetCallingAssembly().GetName().Name.Equals( Assembly.GetEntryAssembly().GetName().Name); protected overload Point GetAPoint(board) => … } 18
  20. 20. 石野さん対策 鈴木さんと結託して! 石野さんだけに全力を! 19 アルゴリズムを強化して 勝つなんてずるい
  21. 21. AI の ロジック 20
  22. 22. 1. そこに置くことで、 (味方の盤面の価値 – 敵の盤面の価値) が最大になる位置に置くっ!
  23. 23. 2. 置いて、次に他の3人の分も置いてみることで、 (味方の盤面の価値 – 敵の盤面の価値) が最大になる位置に置くっ!
  24. 24. 盤面の価値の評価 23 評価関数 得点 得点テーブル (各マスを得点化) 打てる数 石を打てる場所の数が多い 石の周囲 石の周りに空が少ない 確定石 返されることのない石が多い 辺 辺に連続しておくときのパターン
  25. 25. 局面での重みづけ 24 局面に応じた評価関数の重みづけをパラメーター化 10個のパラメーター public class AIParameter { double[] parameters = new[] { 0.71, 0.50, 0.04, 0.76, 0.50, 0.19, 0.52, 0.76, 0.97, 0.38 }; }
  26. 26. 前回は遺伝的アルゴリズム 25 どのパラメーターの組み合わせが最強? 「遺伝的アルゴリズム」が使えるのではっ…! 圧倒的、閃きっ …! ざわ… ざわ…
  27. 27. 前回は遺伝的アルゴリズム 26 パラメーターの異なる多くのAI (最初は乱数で生成) この時点でもっとも強いAI 3つと何回か対戦 よりチームを多く勝ちに導いた AI 2つ 交配 • クローン • 交叉 (組み換え) • 突然変異 (一部を乱数で変更) 何世代も繰り返し 優秀なパラメーター (遺伝子) をのこす
  28. 28. “ReversiGameRunner” を作成 27 コマンドライン ツール 一晩中でも、遺伝的アルゴリズムを続けられる 名付けて “Shallow Learning” 圧倒的、浅さっ …! ボロ… ボロ… ボロ…
  29. 29. 今回は機械学習 (Machine Learning)! 28 コマンドライン ツール “ReversiGameRunner” で 多くのデータを生成 それを機械学習で解析しよう ざわ… ざわ…
  30. 30. 今回は機械学習 (Machine Learning)! 29 ReversiGameRunner Azure SQL Database クラウドに保存 Azure Machine Learning Studio 機械学習で解析! 様々なパラメーターで 94,100回戦ったデータ のべの計算時間 3.9日間
  31. 31. Azure SQL Database 30
  32. 32. Azure Machine Learning Studio 31
  33. 33. Azure Machine Learning Studio 32 Linear Regression (線形回帰) Feature Weight Bias 13.1048 p1 -6.54858 p2 -9.05739 p3 2.84534 p4 -0.0479862 p5 -1.16172 p6 -2.53962 p7 3.47528 p8 5.29898 p9 3.16031 p10 -2.9782
  34. 34. 今回のパラメーター 33 0.10, 0.00, 0.75, 0.40, 0.65, 0.55, 0.70, 0.85, 0.95, 0.25 0.36, 0.30, 0.06, 0.63, 0.46, 0.07, 0.85, 0.26, 0.09, 0.93 前回のパラメーター

×