Go + WS (仮) psoをws使ってやってみる- @spdy+ws勉強会

22
Go + WS () PSOWS使って やってみる 2013/3/28(Wed.) @SPDY+WS勉強会

Transcript of Go + WS (仮) psoをws使ってやってみる- @spdy+ws勉強会

Page 1: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

Go + WS (仮)PSOをWS使って

やってみる

2013/3/28(Wed.)@SPDY+WS勉強会

Page 2: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

自己紹介

上田拓也豊橋技術科学大学大学院電子・情報工学専攻博士後期課程3年(今週末まで)

twitter : @tenntennblog: http://u.hinoichi.net

Page 3: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

アジェンダ

● Go言語でWebSocket○ ライブラリの使い方

● 粒子群最適化法(PSO) + WebSocket○ WebSocketを使った分散シミュレーション○ 粒子群最適化法

Page 4: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

Go言語でWebSocket

Page 5: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

Go言語とは(念のため)

● Googleの開発しているネイティブコードを吐き出す、クールな言語○ シンプルな文法○ 静的型付け○ チャネルとGoroutine○ 豊富なライブラリ○ かわいいマスコット

● ビッグウェーブがきてますよ○ GoCon 2013 spring

■ 申込人数 182 / 120人○ 電車でGo!

■ 電車借り切ってGo言語でハッカソン

Page 6: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

net/httpパッケージ

package mainimport "fmt"import "net/http"

func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "hello, gophers")

}

func main() {http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)

}

localhost:8080にアクセすると「hello, gophers」と出る。

Page 7: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

HandlerとHandlerFunc

type Handler interface {ServeHTTP(ResponseWriter, *Request)

}

// ServeHTTPを実装

type HandlerFunc func(ResponseWriter, *Request)func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)

Page 8: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

websocketパッケージ

● リポジトリ○ code.google.com/p/go.net/websocket

● ドキュメント○ http://godoc.org/code.google.com/p/go.

net/websocket

Page 9: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

構成の例

受信部

送信部

クライアントサイド

Clients

受信部

送信部

Server

ブロードキャスト

受信部

Page 10: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

websocketパッケージの使い方

● ハンドラを作って登録する○ Clientを作りServerに登録

● Client型を作る○ 受信部を作る

○ 送信部を作る

● Server型を作る○ 登録部○ 掃除受信部(ブロードキャスト)

Page 11: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

ハンドラの作成と登録

● WebSocketのハンドラの型

type Handler func(*Cnn)// http.func (Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)

handler := func (ws *websocket.Cnn) {// 受信部

// 送信部

}http.Handle("/ws", handler)

Page 12: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

受信部を作る● websocket.JSON.Receiveを使う

// 別のgoroutineで受信処理

go func() {done = make(chan bool)for {

var msg Message // 適当な型

err := websocket.JSON.Receive(ws, &msg)if (err == io.EOF) {

done <- truebreak

}// ブロードキャストする

}}()

Page 13: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

送信処理を作る

● websocket.JSON.Sendを使う

for {select {

case msg := <-ch:websocket.JSON.Send(ws, msg)

case <-done:return

}}

Page 14: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

粒子群最適化法(PSO)+

WebSocket

Page 15: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

何をやったのか?

● 粒子群最適化法をブラウザ側(JS0で実行する● 結果をWSでサーバに送る● サーバに送られてきた結果を他のクライアント

にブロードキャスト

分散して粒子群最適化法を行なう!

Page 16: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

粒子群最適化法とは?

● 粒子に解空間を探索させ、目的関数値を最小に最適化していく

● 個体のベストと全体のベストを持つことで、他の粒子に結果を伝達する

解空間解

Page 17: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

粒子群最適化法とは?

● 基本的にはランダムウォーク● ローカルベストとグローバルベストに吸いよされ

る● 完成も持つ

解空間解

Page 18: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

粒子群最適化法とは?

● 粒子○ 解空間上の位置○ 速度○ 個体のベスト○ 全体のベスト

Page 19: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

粒子群最適化法と分散処理

● 粒子群最適化法は分散処理と相性がいい○ 各粒子の動作はグローバルベストとして以外影響がな

い○ 粒子を動的に増減できる○ 粒子を小グループに分割して実行できる

■ グローバルベストを一定間隔で同期する

Page 20: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

分散型の粒子群最適化法

解空間

=1クライアントServer

グローバルベスト

ブロードキャスト

Page 21: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

DEMO

Page 22: Go + WS (仮)  psoをws使ってやってみる- @spdy+ws勉強会

まとめ

● Go言語で結構簡単にWebSocket使える○ Goroutineとチャネルが便利

● ブラウザで分散シミュレーション○ WebSocketを使えば簡単○ 粒子群最適化法は実装簡単