Golangで並行シミュレーテッドアニーリング
- 2. Who are you?
辻 大志郎(つじ だいしろう) @d_tutuz
渋谷区役所(~2014/9)
Future Architect(2014/10~)
✓ 所属
Technology Innovation Group
競技プログラミング部
2
- 5. What is シミュレーテッドアニーリング?
✓ 最適化問題を解くアルゴリズム
• 与えられた制約条件のもとで、評価値を最大または最小にする最適解を求める問題
✓ 特定の問題に依存しない、メタヒューリスティクスな手法
✓ 焼きなまし法、とも言われたり
• 金属工学の焼きなましの原理に似ていることから
5
- 19. 巡回セールスマン問題の近傍
✓ 2-opt
• TSPで最も基本的な近傍
• ある巡回路上において、適当な2辺を交換する手法
1
2 3 4
7 6 5
1
2 3 4
7 6 5
※2辺を交換して評価値が改善する例
もとの巡回路: (1, 2, 6, 5, 4, 3, 7)
交換後の巡回路: (1, 2, 3, 4, 5, 6, 7)
19
- 21. TPSAの実装
func (t *TPSA) Solve() error {
iteration := 0
for iteration < t.MaxIteration {
wg := &sync.WaitGroup{}
for i := 0; i < t.Thread; i++ {
wg.Add(1)
//各温度プロセスが並行してSAを実行
go func(i int) {
defer wg.Done()
t.sa(i)
}(i)
}
wg.Wait()
// 隣接プロセス間の解交換は逐次処理
t.exchangeSolutions(iteration)
iteration++
}
}
✓ SAを実施する各プロセスは goroutine で温度数分まで非同期処理として並行化
✓ 解交換は sync.WaitGroup を用いて待ち合わせすることで同期処理
21https://github.com/d-tsuji/tpsa
- 24. 実験結果(評価値)
✓ 評価値の実験結果
• SAと比較してTPSAで良好な結果を得ていることが確認できた
berlin52
(最適解7,542)
krod100
(最適解21,294)
ch130
(最適解6,110)
24
平均値 最良値 最悪値
SA 7,840 7,544 8,238
TPSA 7,544 7,544 7,544
平均値 最良値 最悪値
SA 6,347 6,185 6,482
TPSA 6,171 6,129 6,253
平均値 最良値 最悪値
SA 22,197 21,662 22,795
TPSA 21,294 21,294 21,294
- 28. 【参考】実験時にハマったこと
✓ 共有ロックを取得することを知らなかった...
✓ 並行処理する関数内で rand インスタンスを生成することで対応
28
/*
* Top-level convenience functions
*/
var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})
// ...
// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0)
// from the default Source.
func Float64() float64 { return globalRand.Float64() }
// ...
type lockedSource struct {
lk sync.Mutex
src Source64
}
※go1.12のmath/rand/rand.goより抜粋