Upload
fujio-kojima
View
1.918
Download
0
Embed Size (px)
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
石野さんの石は、
自分の石と同じ価値っ…!