Slide 1

Slide 1 text

0 遺伝的アルゴリズムを実装する 2024-08-23 第102回NearMe技術勉強会 Takuma KAKINOUE

Slide 2

Slide 2 text

1 遺伝的アルゴリズム(GA)について ● そもそもGAとは? ○ 近似解の探索のためのヒューリスティックな⼿法 ■ 探索⼿法は、⽣物の進化から着想を得ている ● 選択、交叉、突然変異 ○ 多⽬的最適化にも有効 ■ 解集団を⽤いた多点局所探索というアプローチのため ● GAで解ける問題の例 ○ ナップザック問題 ○ 巡回セールスマン問題 ○ 機械学習モデルのハイパーパラメータのチューニング

Slide 3

Slide 3 text

2 選択(Selection)の⼿法 ● エリート(elite)⽅式 ○ 適応度の⾼いn個の個体を残す⽅式 ● ルーレット(roullet)⽅式 ○ SoftMax関数を使って適応度に応じて確率的に個体を選択する⽅式 ● トーナメント(tournament)⽅式 ○ 解集団をn個のグループに分割し、各グループの中で ⼀番適応度の⾼い個体のみ残す⽅式

Slide 4

Slide 4 text

3 交叉(Crossover)の⼿法 ● ⼀点(one-point)交叉 ○ 染⾊体内のある1箇所で分割して、交叉させる⽅法 ● ⼆点(two-point)交叉 ○ 染⾊体内のある2箇所で分割して、交叉させる⽅法 ● ⼀様(uniform)交叉 ○ 染⾊体に含まれる遺伝⼦の⻑さと同じ⻑さのmaskを⽣成し、 maskが1の部分の遺伝⼦を⼊れ替える⽅法

Slide 5

Slide 5 text

4 ⼀点交叉のコード 区切りのindexをランダムで 指定して、両親の遺伝⼦を 区切ってコピーしたものを 結合し、⼦の遺伝⼦としている。

Slide 6

Slide 6 text

5 GAの⼿法 ※どちらも親集団μ個から個集団λ個が⽣成される ● ( μ, λ ) - ES ○ ⼦集団λ個の中から上位μ個を選択して次世代の親とする⽅法 ● ( μ + λ ) - ES ○ 親集団μ個と⼦集団λ個の和集合の中から上位μ個を選択して次世代の親とする ⽅法 ○ ⼤域的最適解を得られやすい

Slide 7

Slide 7 text

6 アルゴリズムのフローチャート 1. 個体(Individual)をランダムに⽣成して、初期の解集団(Population)を構築 2. 以下をn世代繰り返す a. 解集団の各個体に対して適合度(Fitness)を算出する b. 解集団から適合度が⾼い個体を上位μ個抽出(selection)する c. bで抽出された個体同⼠を交叉(Crossover)させて、新たな個体をλ個⽣成する d. cで新たに⽣成された各個体に対して突然変異(Mutation)を⾏う e. 解集団を以下の個体に置き換える i. ( μ, λ )の場合、”cで⽣成されたλ個の個体” ii. ( μ + λ )の場合、”bで抽出されたμ個の個体”と”cで⽣成されたλ個の個体” 3. 解集団からパレート解を抽出し、出⼒する(多⽬的最適化の場合)

Slide 8

Slide 8 text

7 実装する上で⼯夫した点 ● インターフェース部分 ○ 各⼿法をクロージャ(Closure)を使って実装

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

10 Thank you