BitValley2018 AfterPartyのLTでお話しました. 当番のシフトを組むのに時間がかかりすぎるという問題を,遺伝的アルゴリズムを使ってLINE BOTに実装することで解決しました.
遺伝的アルゴリズムでシフト組みを自動化した話BitValley 2018 AfterParty LT
View Slide
自己紹介• シバニャン• 京都大学工学部4回生• Twitter: @_6v_• CAMPHOR-
当番のシフト• 30コマ,約30人のシフト組み• 1コマに1人割り当てる
シフト決定の流れ調整サービス シフト組み シフト発表• 調整サービスを利用してシフトを提出してもらう• 手動でシフト組み• グループLINEで完成したシフトを発表
シフト組みの難しさ• 30コマ,約30人のシフト組み• 30^30 通り(≒2×10^44)
シフト組みの難しさ• 30コマ,約30人のシフト組み• 30^30 通り(≒2×10^44)2時間かかる・・・自動化したい・・・
シフト組みの課題• 同じ人が2回入らないといけない場合がある• 2回入る場合は日時が離れている方が良い• △,×を考慮するべきなど・・・
シフト組みの課題• 同じ人が2回入らないといけない場合がある• 2回入る場合は日時が離れている方が良い• △を考慮するべきなど・・・
遺伝的アルゴリズムでやるシフトを遺伝子に見立てて,生物が交叉,突然変異,自然淘汰によって進化するようにシフトを改良していく[(枠1),(枠2),(枠3),…,(枠30)]例)[(Gさん),(Eさん),(Nさん),…,(Eさん)][(Aさん),(Lさん),(Gさん),…,(Oさん)]
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成↓• シフト表の良さを評価↓• 評価が良かったシフト6個残して後は消す↓• 交叉,突然変異させて30個に増やす200ループ
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成200ループ[(Gさん),(Eさん),(Nさん),…,(Eさん)][(Aさん),(Lさん),(Gさん),…,(Oさん)]… (30パターン)[(Rさん),(Aさん),(Nさん),…,(Dさん)]
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成• シフト表の良さを評価200ループ[(Gさん),(Eさん),(Nさん),…,(Eさん)] : 300点[(Aさん),(Lさん),(Gさん),…,(Oさん)] : 100点… (30パターン)[(Rさん),(Aさん),(Nさん),…,(Dさん)] : 50点
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成• シフト表の良さを評価• 評価が良かったシフト6個残して後は消す200ループ[(Gさん),(Eさん),(Nさん),…,(Eさん)] : 300点[(Aさん),(Lさん),(Gさん),…,(Oさん)] : 100点… (6パターン)
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成• シフト表の良さを評価• 評価が良かったシフト6個残して後は消す• 交叉,突然変異させて30個に増やす200ループ[(Gさん),(Eさん),(Nさん),…,(Eさん)][(Aさん),(Lさん),(Gさん),…,(Oさん)][(Aさん),(Eさん),(Nさん),…,(Oさん)]… (30パターン)
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成• シフト表の良さを評価• 評価が良かったシフト6個残して後は消す• 交叉,突然変異させて30個に増やす200ループ[(Gさん),(Eさん),(Nさん),…,(Eさん)][(Aさん),(Lさん),(Gさん),…,(Oさん)][(Aさん),(Eさん),(Nさん),…,(Oさん)][(Gさん),(Eさん),(Nさん),…,(Tさん)]… (30パターン)
遺伝的アルゴリズムの説明• シフト表をランダムに30パターン生成↓• シフト表の良さを評価↓• 評価が良かったシフト6個残して後は消す↓• 交叉,突然変異させて30個に増やす200ループ大事なのはここ!評価する式を立てる
シフト組みの課題 より• 同じ人が2回入らないといけない場合がある• 2回入る場合は日時が離れている方が良い• △,×を考慮するべき
シフト組みの課題 より• 同じ人が2回入らないといけない場合がある→同じ人が2回入ったら 100点 を減らす• 2回入る場合は日時が離れている方が良い→(離れている日数)×1点 を加える• △,×を考慮するべき→△一個につき10000点,×一個につき1000000点 を減らす
シフト組みの課題 より• 同じ人が2回入らないといけない場合がある→同じ人が2回入ったら 100点 を減らす• 2回入る場合は日時が離れている方が良い→(離れている日数)×1点 を加える• △,×を考慮するべき→△一個につき10000点,×一個につき1000000点 を減らす評価式を追加するだけで,簡単にシフトの決め方を変えられる!
BOTにして使ってみる
まとめ• 遺伝的アルゴリズムを使うと,いい感じのシフトが組める• シフトの組み方の変更が簡単• BOTにすると非エンジニアも使えて便利