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

Preview:

Citation preview

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を使えば簡単○ 粒子群最適化法は実装簡単

Recommended