仙台IT文化祭 「C# 大好き MVP による C# ドキドキ・ライブコーディング...

Preview:

Citation preview

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 Summit2

C# の好きなところ

マルチ パラダイム言語

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

delegate

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

class

手続き型 関数型

ラムダ式

LINQ

型推論

ジェネリック

拡張メソッド

動的型付け

dynamic

非同期

async/await

オブジェクト指向

Parallel

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

ちょうど良い

シンプルな記述

ちょうど良い

多用途

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

ツールのサポート

Visual Studio

今回のお題

オセロの CPU アルゴリズム

4人打ち (チーム戦)

役割

自分の役割は何か?

私の役割

「ちゃんとやる」こと。

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

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

私の役割

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

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

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

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

Unsafe?

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

良いじゃない

前回の「工夫」

そもそもオセロが弱い。

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

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

誰が強い?

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

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

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

……}

class GameRunner {……

}

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

}

自分の番が来たら一番強い (誰かの) 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 AIParameter{

double[] parameters = new[] {0.71, 0.50, 0.04, 0.76, 0.50, 0.19, 0.52, 0.76, 0.97, 0.38

};}

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

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

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

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

圧倒的、閃きっ…!

ざわ…ざわ…

遺伝的アルゴリズム

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

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

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

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

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

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

“ReversiGameRunner” を作成

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

コマンドライン ツール

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

名付けて “Shallow Learning”

圧倒的、浅さっ…!

ボロ…ボロ…ボロ…

今回のパラメーター

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

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

31

石野さんの石は、

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