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 による、
C# ドキドキ・ライブコーディング
(出張編)
~ 小島の分 ~
小島 富治雄
#sendaiitfes #s282035
自己紹介
 小島 富治雄
 @Fujiwo
 福井コンピュータアーキテクト株式会社
 Microsoft MVP (2005-2018) C#関連
C#の父 Anders Hejlsberg との出会い
Anders Hejlsberg
1983年 Turbo Pascal
(1995年 Delphi)
2000年 C#
2006年2月2日 横浜
MVP Global Summ...
C# の好きなところ
 マルチ パラダイム言語
 様々なパラダイムを徐々に学べる
delegate
C# 1.X C# 2.0 C# 3.0 C# 4.0 C# 5.0
class
手続き型 関数型
ラムダ式
LINQ
型推論
ジェネリック...
C#
 マルチパラダイム言語
 ちょうど良い
 シンプルな記述
 ちょうど良い
 多用途
 各種デバイス、各種プラットフォーム、サーバーサイド
 ツールのサポート
 Visual Studio
今回のお題
オセロの CPU アルゴリズム
4人打ち (チーム戦)
役割
自分の役割は何か?
私の役割
 「ちゃんとやる」こと。
 ちゃんとやらないと石野さんにおこられる。
ちゃんとやれよ。
何ちゃんとやってんだ!
私の役割
ちゃんと「工夫」しないと。
2015年のお題「七ならべ」のときに
思いついた「工夫」
 リフレクション?
他の人が書いたクラスのメソッドを書き換える?
Unsafe?
メソッドが取り替えられないなら
インスタンスを取り替えてしまえば
良いじゃない
前回の「工夫」
 そもそもオセロが弱い。
 2人打ちでも石をどこに置けばよいのかわからない。
 オセロが強いひとがやればよいのに。
誰が強い?
 最初に4人分戦わせて、一番強いひとが私の代わりに打てばよいのに。
 自 AI のコンストラクターで、事前に5回対戦して強いひと (AI) を選んどく。
class PlayerTable
: IEnumerable<KeyVa...
PlayerChecker: 一番強いひとをチェック
class PlayerChecker
{
readonly Board.Piece theStrongestPiece;
readonly PlayerTable playerTable ...
自分の番が来たら
一番強い (誰かの) AI に打たせる
13
… …が、駄目…!
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 14
動作せず…
他の人の AI もこちらの判定ルーチンをコール
呼び出しが無限ループ
犯罪的だっ…!
ざわ…...
もっとひどい AI までっ…!
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 15
それをやってしまったら……
戦争だろうがっ…!
ざわ…
ざわ…
開始時に、ルールを無視して
石を全...
さて今回は…
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 16
不採用だったアルゴリズム
 「ライフライン」
テレフォン
 例えば、 twilio (電話API) でオセロ名人に電話をかけて正着を訊いてはどうか
オーディエンス
会場アンケートAPI (謎)
50:50
ちょっとよくわからない
社会的ハック
18
敵チームのひとりを事前に買収
社会的ハック
19
「石が少ないことこそ美しい」という価値観の創生
そんな中… ある日のチャット…
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 20
AI を強化して勝つっ…!!
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 21
AI のアルゴリズムで勝つ
その手があったっ…!
目からうろこっ…!
天啓っ……!
ざわ…
ざわ…
というわけで… 今回の AI アルゴリズム
1. そこに置くことで、
(味方の盤面の価値 – 敵の盤面の価値)
が最大になる位置に置くっ!
2. 置いて、次に他の3人の分も置いてみることで、
(味方の盤面の価値 – 敵の盤面の価値)
が最大になる位置に置くっ!
盤面の価値の評価
25
評価関数
得点 得点テーブル (各マスを得点化)
打てる数 石を打てる場所の数が多い
石の周囲 石の周りに空が少ない
確定石 返されることのない石が多い
辺 辺に連続しておくときのパターン
局面での重みづけ
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 26
局面に応じた評価関数の重みづけをパラメーター化
10個のパラメーター
public class AIPara...
最強のパラメーターを求めて…
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 27
どのパラメーターの組み合わせが最強?
「遺伝的アルゴリズム」が使えるのではっ…!
圧倒的、閃きっ...
遺伝的アルゴリズム
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 28
パラメーターの異なる多くのAI
(最初は乱数で生成)
この時点でもっとも強いAI
3つと何回か対戦
よりチーム...
“ReversiGameRunner” を作成
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 29
コマンドライン ツール
一晩中でも、遺伝的アルゴリズムを続けられる
名付けて...
今回のパラメーター
仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 30
0.36, 0.30, 0.06, 0.63, 0.46, 0.07, 0.85, 0.26, 0.09, 0...
目標: 同じチームの石野さんの
アルゴリズムのサポート
31
石野さんの石は、
自分の石と同じ価値っ…!
Upcoming SlideShare
Loading in …5
×

仙台IT文化祭 「C# 大好き MVP による C# ドキドキ・ライブコーディング (出張編)」 小島の分

2017年10月28日『仙台 IT 文化祭 2017』 ( http://2017.sendaiitfes.org ) でのセッション「ドキドキ ライブコーディング(出張編)」
#SendaiITFes #RebirthTohoku

■動画:
[Video] 仙台IT文化祭 2017 「C# 大好き MVP による C# ドキドキ・ライブコーディング (出張編)」 #SendaiITFes #RebirthTohoku | YouTube


https://www.youtube.com/watch?v=-bAF458xpXE

■関連資料:
https://twitter.com/search?f=tweets&q=%23sendaiitfes%20%23s282035

4 色オセロ対決 again - 仙台 IT 文化祭 2017 | xin9le.net
http://blog.xin9le.net/entry/2017/11/04/035632
仙台IT文化祭で「ドキドキ ライブコーディング(出張編)」してきた! | 僕はここだ!
http://mrstar-logs.hatenablog.com/entry/2017/10/30/231011

  • Be the first to comment

  • Be the first to like this

仙台IT文化祭 「C# 大好き MVP による C# ドキドキ・ライブコーディング (出張編)」 小島の分

  1. 1. C# 大好き MVP による、 C# ドキドキ・ライブコーディング (出張編) ~ 小島の分 ~ 小島 富治雄 #sendaiitfes #s282035
  2. 2. 自己紹介  小島 富治雄  @Fujiwo  福井コンピュータアーキテクト株式会社  Microsoft MVP (2005-2018) C#関連
  3. 3. C#の父 Anders Hejlsberg との出会い Anders Hejlsberg 1983年 Turbo Pascal (1995年 Delphi) 2000年 C# 2006年2月2日 横浜 MVP Global Summit 2
  4. 4. C# の好きなところ  マルチ パラダイム言語  様々なパラダイムを徐々に学べる delegate C# 1.X C# 2.0 C# 3.0 C# 4.0 C# 5.0 class 手続き型 関数型 ラムダ式 LINQ 型推論 ジェネリック 拡張メソッド 動的型付け dynamic 非同期 async/await オブジェクト 指向 Parallel …
  5. 5. C#  マルチパラダイム言語  ちょうど良い  シンプルな記述  ちょうど良い  多用途  各種デバイス、各種プラットフォーム、サーバーサイド  ツールのサポート  Visual Studio
  6. 6. 今回のお題 オセロの CPU アルゴリズム 4人打ち (チーム戦)
  7. 7. 役割 自分の役割は何か?
  8. 8. 私の役割  「ちゃんとやる」こと。  ちゃんとやらないと石野さんにおこられる。 ちゃんとやれよ。 何ちゃんとやってんだ!
  9. 9. 私の役割 ちゃんと「工夫」しないと。
  10. 10. 2015年のお題「七ならべ」のときに 思いついた「工夫」  リフレクション? 他の人が書いたクラスのメソッドを書き換える? Unsafe? メソッドが取り替えられないなら インスタンスを取り替えてしまえば 良いじゃない
  11. 11. 前回の「工夫」  そもそもオセロが弱い。  2人打ちでも石をどこに置けばよいのかわからない。  オセロが強いひとがやればよいのに。
  12. 12. 誰が強い?  最初に4人分戦わせて、一番強いひとが私の代わりに打てばよいのに。  自 AI のコンストラクターで、事前に5回対戦して強いひと (AI) を選んどく。 class PlayerTable : IEnumerable<KeyValuePair<Board.Piece, IPlayer>> { Dictionary<Board.Piece, IPlayer> playerDictionary = new Dictionary<Board.Piece, IPlayer>(); …… } class GameRunner { …… }
  13. 13. PlayerChecker: 一番強いひとをチェック class PlayerChecker { readonly Board.Piece theStrongestPiece; readonly PlayerTable playerTable = new PlayerTable( players: new IPlayer[] { new PlayerRyotaMurohoshi(), new PlayerAILight (), new PlayerXin9le (), new PlayerFujiwo3 () } ); public static Board.Piece TheStrongestPiece => theStrongestPiece; …… }
  14. 14. 自分の番が来たら 一番強い (誰かの) AI に打たせる 13
  15. 15. … …が、駄目…! 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 14 動作せず… 他の人の AI もこちらの判定ルーチンをコール 呼び出しが無限ループ 犯罪的だっ…! ざわ… ざわ…
  16. 16. もっとひどい AI までっ…! 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 15 それをやってしまったら…… 戦争だろうがっ…! ざわ… ざわ… 開始時に、ルールを無視して 石を全部自分の色に変更!!!
  17. 17. さて今回は… 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 16
  18. 18. 不採用だったアルゴリズム  「ライフライン」 テレフォン  例えば、 twilio (電話API) でオセロ名人に電話をかけて正着を訊いてはどうか オーディエンス 会場アンケートAPI (謎) 50:50 ちょっとよくわからない
  19. 19. 社会的ハック 18 敵チームのひとりを事前に買収
  20. 20. 社会的ハック 19 「石が少ないことこそ美しい」という価値観の創生
  21. 21. そんな中… ある日のチャット… 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 20
  22. 22. AI を強化して勝つっ…!! 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 21 AI のアルゴリズムで勝つ その手があったっ…! 目からうろこっ…! 天啓っ……! ざわ… ざわ…
  23. 23. というわけで… 今回の AI アルゴリズム
  24. 24. 1. そこに置くことで、 (味方の盤面の価値 – 敵の盤面の価値) が最大になる位置に置くっ!
  25. 25. 2. 置いて、次に他の3人の分も置いてみることで、 (味方の盤面の価値 – 敵の盤面の価値) が最大になる位置に置くっ!
  26. 26. 盤面の価値の評価 25 評価関数 得点 得点テーブル (各マスを得点化) 打てる数 石を打てる場所の数が多い 石の周囲 石の周りに空が少ない 確定石 返されることのない石が多い 辺 辺に連続しておくときのパターン
  27. 27. 局面での重みづけ 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 26 局面に応じた評価関数の重みづけをパラメーター化 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 }; }
  28. 28. 最強のパラメーターを求めて… 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 27 どのパラメーターの組み合わせが最強? 「遺伝的アルゴリズム」が使えるのではっ…! 圧倒的、閃きっ …! ざわ… ざわ…
  29. 29. 遺伝的アルゴリズム 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 28 パラメーターの異なる多くのAI (最初は乱数で生成) この時点でもっとも強いAI 3つと何回か対戦 よりチームを多く勝ちに導いた AI 2つ 交配 • クローン • 交叉 (組み換え) • 突然変異 (一部を乱数で変更) 何世代も繰り返し 優秀なパラメーター (遺伝子) をのこす
  30. 30. “ReversiGameRunner” を作成 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 29 コマンドライン ツール 一晩中でも、遺伝的アルゴリズムを続けられる 名付けて “Shallow Learning” 圧倒的、浅さっ …! ボロ… ボロ… ボロ…
  31. 31. 今回のパラメーター 仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 30 0.36, 0.30, 0.06, 0.63, 0.46, 0.07, 0.85, 0.26, 0.09, 0.93
  32. 32. 目標: 同じチームの石野さんの アルゴリズムのサポート 31 石野さんの石は、 自分の石と同じ価値っ…!

×