Go + WS (仮) psoをws使ってやってみる- @spdy+ws勉強会
-
Upload
takuya-ueda -
Category
Technology
-
view
600 -
download
0
Transcript of Go + WS (仮) psoをws使ってやってみる- @spdy+ws勉強会
Go + WS (仮)PSOをWS使って
やってみる
2013/3/28(Wed.)@SPDY+WS勉強会
自己紹介
上田拓也豊橋技術科学大学大学院電子・情報工学専攻博士後期課程3年(今週末まで)
twitter : @tenntennblog: http://u.hinoichi.net
アジェンダ
● Go言語でWebSocket○ ライブラリの使い方
● 粒子群最適化法(PSO) + WebSocket○ WebSocketを使った分散シミュレーション○ 粒子群最適化法
Go言語でWebSocket
Go言語とは(念のため)
● Googleの開発しているネイティブコードを吐き出す、クールな言語○ シンプルな文法○ 静的型付け○ チャネルとGoroutine○ 豊富なライブラリ○ かわいいマスコット
● ビッグウェーブがきてますよ○ GoCon 2013 spring
■ 申込人数 182 / 120人○ 電車でGo!
■ 電車借り切ってGo言語でハッカソン
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」と出る。
HandlerとHandlerFunc
type Handler interface {ServeHTTP(ResponseWriter, *Request)
}
// ServeHTTPを実装
type HandlerFunc func(ResponseWriter, *Request)func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)
websocketパッケージ
● リポジトリ○ code.google.com/p/go.net/websocket
● ドキュメント○ http://godoc.org/code.google.com/p/go.
net/websocket
構成の例
受信部
送信部
クライアントサイド
Clients
受信部
送信部
Server
ブロードキャスト
受信部
websocketパッケージの使い方
● ハンドラを作って登録する○ Clientを作りServerに登録
● Client型を作る○ 受信部を作る
○ 送信部を作る
● Server型を作る○ 登録部○ 掃除受信部(ブロードキャスト)
ハンドラの作成と登録
● WebSocketのハンドラの型
type Handler func(*Cnn)// http.func (Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)
handler := func (ws *websocket.Cnn) {// 受信部
// 送信部
}http.Handle("/ws", handler)
受信部を作る● 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
}// ブロードキャストする
}}()
送信処理を作る
● websocket.JSON.Sendを使う
for {select {
case msg := <-ch:websocket.JSON.Send(ws, msg)
case <-done:return
}}
粒子群最適化法(PSO)+
WebSocket
何をやったのか?
● 粒子群最適化法をブラウザ側(JS0で実行する● 結果をWSでサーバに送る● サーバに送られてきた結果を他のクライアント
にブロードキャスト
分散して粒子群最適化法を行なう!
粒子群最適化法とは?
● 粒子に解空間を探索させ、目的関数値を最小に最適化していく
● 個体のベストと全体のベストを持つことで、他の粒子に結果を伝達する
解空間解
粒子群最適化法とは?
● 基本的にはランダムウォーク● ローカルベストとグローバルベストに吸いよされ
る● 完成も持つ
解空間解
粒子群最適化法とは?
● 粒子○ 解空間上の位置○ 速度○ 個体のベスト○ 全体のベスト
粒子群最適化法と分散処理
● 粒子群最適化法は分散処理と相性がいい○ 各粒子の動作はグローバルベストとして以外影響がな
い○ 粒子を動的に増減できる○ 粒子を小グループに分割して実行できる
■ グローバルベストを一定間隔で同期する
分散型の粒子群最適化法
解空間
=1クライアントServer
グローバルベスト
ブロードキャスト
DEMO
まとめ
● Go言語で結構簡単にWebSocket使える○ Goroutineとチャネルが便利
● ブラウザで分散シミュレーション○ WebSocketを使えば簡単○ 粒子群最適化法は実装簡単