32
C# 大好き MVP による、 C# ドキドキ・ライブコーディング (出張編) ~ 小島の分 ~ 小島 富治雄 # sendaiitfes #s282035

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

Embed Size (px)

Citation preview

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

C# 大好き MVP による、

C# ドキドキ・ライブコーディング(出張編)

~ 小島の分 ~

小島 富治雄

#sendaiitfes #s282035

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

自己紹介

小島 富治雄

@Fujiwo

福井コンピュータアーキテクト株式会社

Microsoft MVP (2005-2018) C#関連

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

C#の父 Anders Hejlsberg との出会い

Anders Hejlsberg

1983年 Turbo Pascal

(1995年 Delphi)

2000年 C#

2006年2月2日 横浜

MVP Global Summit2

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

C# の好きなところ

マルチ パラダイム言語

様々なパラダイムを徐々に学べる

delegate

C# 1.X C# 2.0 C# 3.0 C# 4.0 C# 5.0

class

手続き型 関数型

ラムダ式

LINQ

型推論

ジェネリック

拡張メソッド

動的型付け

dynamic

非同期

async/await

オブジェクト指向

Parallel

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

C# マルチパラダイム言語

ちょうど良い

シンプルな記述

ちょうど良い

多用途

各種デバイス、各種プラットフォーム、サーバーサイド

ツールのサポート

Visual Studio

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

今回のお題

オセロの CPU アルゴリズム

4人打ち (チーム戦)

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

役割

自分の役割は何か?

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

私の役割

「ちゃんとやる」こと。

ちゃんとやらないと石野さんにおこられる。

ちゃんとやれよ。何ちゃんとやってんだ!

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

私の役割

ちゃんと「工夫」しないと。

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

2015年のお題「七ならべ」のときに

思いついた「工夫」リフレクション?

他の人が書いたクラスのメソッドを書き換える?

Unsafe?

メソッドが取り替えられないならインスタンスを取り替えてしまえば

良いじゃない

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

前回の「工夫」

そもそもオセロが弱い。

2人打ちでも石をどこに置けばよいのかわからない。

オセロが強いひとがやればよいのに。

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

誰が強い?

最初に4人分戦わせて、一番強いひとが私の代わりに打てばよいのに。

自 AI のコンストラクターで、事前に5回対戦して強いひと (AI) を選んどく。

class PlayerTable: IEnumerable<KeyValuePair<Board.Piece, IPlayer>> {Dictionary<Board.Piece, IPlayer> playerDictionary= new Dictionary<Board.Piece, IPlayer>();

……}

class GameRunner {……

}

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

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;……

}

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

自分の番が来たら一番強い (誰かの) AI に打たせる

13

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

… …が、駄目…!

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 14

動作せず…

他の人の AI もこちらの判定ルーチンをコール

呼び出しが無限ループ

犯罪的だっ…!

ざわ…ざわ…

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

もっとひどい AI までっ…!

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 15

それをやってしまったら……戦争だろうがっ…!

ざわ…ざわ…

開始時に、ルールを無視して石を全部自分の色に変更!!!

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

さて今回は…

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 16

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

不採用だったアルゴリズム

「ライフライン」

テレフォン

例えば、 twilio (電話API) でオセロ名人に電話をかけて正着を訊いてはどうか

オーディエンス

会場アンケートAPI (謎)

50:50

ちょっとよくわからない

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

社会的ハック

18

敵チームのひとりを事前に買収

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

社会的ハック

19

「石が少ないことこそ美しい」という価値観の創生

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

そんな中… ある日のチャット…

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 20

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

AI を強化して勝つっ…!!

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 21

AI のアルゴリズムで勝つ

その手があったっ…!

目からうろこっ…!天啓っ……!

ざわ…ざわ…

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

というわけで… 今回の AI アルゴリズム

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

1. そこに置くことで、(味方の盤面の価値 – 敵の盤面の価値)

が最大になる位置に置くっ!

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

2. 置いて、次に他の3人の分も置いてみることで、(味方の盤面の価値 – 敵の盤面の価値)が最大になる位置に置くっ!

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

盤面の価値の評価

25

評価関数

得点 得点テーブル (各マスを得点化)

打てる数 石を打てる場所の数が多い

石の周囲 石の周りに空が少ない

確定石 返されることのない石が多い

辺 辺に連続しておくときのパターン

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

局面での重みづけ

仙台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

};}

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

最強のパラメーターを求めて…

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 27

どのパラメーターの組み合わせが最強?

「遺伝的アルゴリズム」が使えるのではっ…!

圧倒的、閃きっ…!

ざわ…ざわ…

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

遺伝的アルゴリズム

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 28

パラメーターの異なる多くのAI(最初は乱数で生成)

この時点でもっとも強いAI3つと何回か対戦

よりチームを多く勝ちに導いたAI 2つ

交配• クローン• 交叉 (組み換え)• 突然変異 (一部を乱数で変更)

何世代も繰り返し優秀なパラメーター (遺伝子) をのこす

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

“ReversiGameRunner” を作成

仙台IT文化祭2017 http://2017.sendaiitfes.org/ #sendaiitfes 29

コマンドライン ツール

一晩中でも、遺伝的アルゴリズムを続けられる

名付けて “Shallow Learning”

圧倒的、浅さっ…!

ボロ…ボロ…ボロ…

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

今回のパラメーター

仙台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

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

目標: 同じチームの石野さんのアルゴリズムのサポート

31

石野さんの石は、

自分の石と同じ価値っ…!