遺伝的アルゴリズムでシフト組みを自動化した話

B74ae56d7910fbe1dd685c999b8f9e31?s=47 ShibaNyan
September 10, 2018

 遺伝的アルゴリズムでシフト組みを自動化した話

BitValley2018 AfterPartyのLTでお話しました.
当番のシフトを組むのに時間がかかりすぎるという問題を,遺伝的アルゴリズムを使ってLINE BOTに実装することで解決しました.

B74ae56d7910fbe1dd685c999b8f9e31?s=128

ShibaNyan

September 10, 2018
Tweet

Transcript

  1. 遺伝的アルゴリズムで シフト組みを自動化した話 BitValley 2018 AfterParty LT

  2. 自己紹介 •  シバニャン •  京都大学工学部4回生 •  Twitter: @_6v_ •  CAMPHOR-

  3. 当番のシフト •  30コマ,約30人のシフト組み •  1コマに1人割り当てる

  4. シフト決定の流れ 調整サービス シフト組み シフト発表 •  調整サービスを利用してシフトを提出してもらう •  手動でシフト組み •  グループLINEで完成したシフトを発表

  5. シフト組みの難しさ •  30コマ,約30人のシフト組み •  30^30 通り(≒2×10^44)

  6. シフト組みの難しさ •  30コマ,約30人のシフト組み •  30^30 通り(≒2×10^44) 2時間かかる・・・ 自動化したい・・・

  7. シフト組みの課題 •  同じ人が2回入らないといけない場合がある •  2回入る場合は日時が離れている方が良い •  △,×を考慮するべき など・・・

  8. シフト組みの課題 •  同じ人が2回入らないといけない場合がある •  2回入る場合は日時が離れている方が良い •  △を考慮するべき など・・・

  9. 遺伝的アルゴリズムでやる シフトを遺伝子に見立てて,生物が交叉,突然 変異,自然淘汰によって進化するようにシフトを 改良していく [(枠1),(枠2),(枠3),…,(枠30)] 例) [(Gさん),(Eさん),(Nさん),…,(Eさん)] [(Aさん),(Lさん),(Gさん),…,(Oさん)]

  10. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 ↓ •  シフト表の良さを評価 ↓ •  評価が良かったシフト6個残して後は消す ↓

    •  交叉,突然変異させて30個に増やす 200ループ
  11. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 200ループ [(Gさん),(Eさん),(Nさん),…,(Eさん)] [(Aさん),(Lさん),(Gさん),…,(Oさん)] … (30パターン) [(Rさん),(Aさん),(Nさん),…,(Dさん)]

  12. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 •  シフト表の良さを評価 200ループ [(Gさん),(Eさん),(Nさん),…,(Eさん)] : 300点 [(Aさん),(Lさん),(Gさん),…,(Oさん)]

    : 100点 … (30パターン) [(Rさん),(Aさん),(Nさん),…,(Dさん)] : 50点
  13. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 •  シフト表の良さを評価 •  評価が良かったシフト6個残して後は消す 200ループ [(Gさん),(Eさん),(Nさん),…,(Eさん)] :

    300点 [(Aさん),(Lさん),(Gさん),…,(Oさん)] : 100点 … (6パターン)
  14. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 •  シフト表の良さを評価 •  評価が良かったシフト6個残して後は消す •  交叉,突然変異させて30個に増やす 200ループ

    [(Gさん),(Eさん),(Nさん),…,(Eさん)] [(Aさん),(Lさん),(Gさん),…,(Oさん)] [(Aさん),(Eさん),(Nさん),…,(Oさん)] … (30パターン)
  15. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 •  シフト表の良さを評価 •  評価が良かったシフト6個残して後は消す •  交叉,突然変異させて30個に増やす 200ループ

    [(Gさん),(Eさん),(Nさん),…,(Eさん)] [(Aさん),(Lさん),(Gさん),…,(Oさん)] [(Aさん),(Eさん),(Nさん),…,(Oさん)] [(Gさん),(Eさん),(Nさん),…,(Tさん)] … (30パターン)
  16. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 ↓ •  シフト表の良さを評価 ↓ •  評価が良かったシフト6個残して後は消す ↓

    •  交叉,突然変異させて30個に増やす 200ループ
  17. 遺伝的アルゴリズムの説明 •  シフト表をランダムに30パターン生成 ↓ •  シフト表の良さを評価 ↓ •  評価が良かったシフト6個残して後は消す ↓

    •  交叉,突然変異させて30個に増やす 200ループ 大事なのはここ! 評価する式を立てる
  18. シフト組みの課題 より •  同じ人が2回入らないといけない場合がある •  2回入る場合は日時が離れている方が良い •  △,×を考慮するべき

  19. シフト組みの課題 より •  同じ人が2回入らないといけない場合がある →同じ人が2回入ったら 100点 を減らす •  2回入る場合は日時が離れている方が良い →(離れている日数)×1点

    を加える •  △,×を考慮するべき →△一個につき10000点,×一個につき1000000 点 を減らす
  20. シフト組みの課題 より •  同じ人が2回入らないといけない場合がある →同じ人が2回入ったら 100点 を減らす •  2回入る場合は日時が離れている方が良い →(離れている日数)×1点

    を加える •  △,×を考慮するべき →△一個につき10000点,×一個につき1000000 点 を減らす 評価式を追加するだけで, 簡単にシフトの決め方を 変えられる!
  21. BOTにして 使ってみる

  22. まとめ •  遺伝的アルゴリズムを使うと,いい感じのシフ トが組める •  シフトの組み方の変更が簡単 •  BOTにすると非エンジニアも使えて便利