Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
遺伝的アルゴリズムを実装する
Search
NearMeの技術発表資料です
PRO
August 26, 2024
1
25
遺伝的アルゴリズムを実装する
NearMeの技術発表資料です
PRO
August 26, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
観察研究における因果推論
nearme_tech
PRO
1
14
React
nearme_tech
PRO
2
18
Architecture Decision Record (ADR)
nearme_tech
PRO
1
750
Fractional Derivative!
nearme_tech
PRO
1
21
GitHub Projectsにおける チケットの ステータス更新自動化について
nearme_tech
PRO
1
35
2つの曲線を比較する方法ってあるの? 〜フレシェ距離を試してみた〜 with Python
nearme_tech
PRO
1
150
Constrained K-means Clustering (クラスタサイズの制限をしたK-means法) を調べてみた
nearme_tech
PRO
1
61
VRPの近傍操作SWAP*について調べてみた
nearme_tech
PRO
1
81
新人エンジニアが読んでためになった本
nearme_tech
PRO
2
45
Featured
See All Featured
Unsuck your backbone
ammeep
667
57k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
7
560
How to name files
jennybc
77
99k
Visualization
eitanlees
143
15k
Side Projects
sachag
452
42k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
109
6.9k
Clear Off the Table
cherdarchuk
91
320k
Teambox: Starting and Learning
jrom
131
8.7k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
No one is an island. Learnings from fostering a developers community.
thoeni
19
2.9k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
2
220
Transcript
0 遺伝的アルゴリズムを実装する 2024-08-23 第102回NearMe技術勉強会 Takuma KAKINOUE
1 遺伝的アルゴリズム(GA)について • そもそもGAとは? ◦ 近似解の探索のためのヒューリスティックな⼿法 ▪ 探索⼿法は、⽣物の進化から着想を得ている • 選択、交叉、突然変異
◦ 多⽬的最適化にも有効 ▪ 解集団を⽤いた多点局所探索というアプローチのため • GAで解ける問題の例 ◦ ナップザック問題 ◦ 巡回セールスマン問題 ◦ 機械学習モデルのハイパーパラメータのチューニング
2 選択(Selection)の⼿法 • エリート(elite)⽅式 ◦ 適応度の⾼いn個の個体を残す⽅式 • ルーレット(roullet)⽅式 ◦ SoftMax関数を使って適応度に応じて確率的に個体を選択する⽅式
• トーナメント(tournament)⽅式 ◦ 解集団をn個のグループに分割し、各グループの中で ⼀番適応度の⾼い個体のみ残す⽅式
3 交叉(Crossover)の⼿法 • ⼀点(one-point)交叉 ◦ 染⾊体内のある1箇所で分割して、交叉させる⽅法 • ⼆点(two-point)交叉 ◦ 染⾊体内のある2箇所で分割して、交叉させる⽅法
• ⼀様(uniform)交叉 ◦ 染⾊体に含まれる遺伝⼦の⻑さと同じ⻑さのmaskを⽣成し、 maskが1の部分の遺伝⼦を⼊れ替える⽅法
4 ⼀点交叉のコード 区切りのindexをランダムで 指定して、両親の遺伝⼦を 区切ってコピーしたものを 結合し、⼦の遺伝⼦としている。
5 GAの⼿法 ※どちらも親集団μ個から個集団λ個が⽣成される • ( μ, λ ) - ES
◦ ⼦集団λ個の中から上位μ個を選択して次世代の親とする⽅法 • ( μ + λ ) - ES ◦ 親集団μ個と⼦集団λ個の和集合の中から上位μ個を選択して次世代の親とする ⽅法 ◦ ⼤域的最適解を得られやすい
6 アルゴリズムのフローチャート 1. 個体(Individual)をランダムに⽣成して、初期の解集団(Population)を構築 2. 以下をn世代繰り返す a. 解集団の各個体に対して適合度(Fitness)を算出する b. 解集団から適合度が⾼い個体を上位μ個抽出(selection)する
c. bで抽出された個体同⼠を交叉(Crossover)させて、新たな個体をλ個⽣成する d. cで新たに⽣成された各個体に対して突然変異(Mutation)を⾏う e. 解集団を以下の個体に置き換える i. ( μ, λ )の場合、”cで⽣成されたλ個の個体” ii. ( μ + λ )の場合、”bで抽出されたμ個の個体”と”cで⽣成されたλ個の個体” 3. 解集団からパレート解を抽出し、出⼒する(多⽬的最適化の場合)
7 実装する上で⼯夫した点 • インターフェース部分 ◦ 各⼿法をクロージャ(Closure)を使って実装
8 コードを動かしてみる • git ◦ https://github.com/kakky-hacker/algorithm_sandbox • command ◦ cd
genetic_algorithm ◦ python sample/knapsack.py ▪ 以下のナップザック問題を解く • 値段 = [100, 200, 650, 1100, 2100, 3300] • 嬉しさ = [2, 5, 16, 32, 64, 105] • 所持⾦ = 40000
9 PythonのGAフレームワーク • DEAP ◦ スター数がこの3つの中で⼀番多い(2024/08/23時点) ◦ https://github.com/DEAP/deap • Platypus
◦ 前に使ったことがあったので久しぶりに覗いたら最後のcommitが6年前だった.. ◦ https://github.com/andyrimmer/Platypus • pymoo ◦ 多⽬的最適化に特化しているらしい ◦ https://github.com/anyoptimization/pymoo
10 Thank you