Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rubyによる組合せ最適化

981 views

Published on

2015-11-13 RubyWorld Conference 2015
http://2015.rubyworld-conf.org/ja/program/

WINWORKS KK http://www.win-works.com/

Published in: Software
  • Be the first to comment

Rubyによる組合せ最適化

  1. 1. Rubyによる組合せ最適化 Masaki Takeuchi @m4i 2015-11-13 RubyWorld Conference 2015
  2. 2. Masaki Takeuchi 竹内 真樹 @m4i ウィンワークス株式会社 Chief Scientist
  3. 3. 本日の内容 1 • 最適化問題とは何か 2 • 応用分野と勤務スケジューリング問題 3 • なぜRubyを使うのか
  4. 4. 本日の内容 1 • 最適化問題とは何か 2 • 応用分野と勤務スケジューリング問題 3 • なぜRubyを使うのか
  5. 5. 利益を最大化するには? 製品X 製品Y 原料A 原料B 2kg 1kg 2kg 3kg 12kg 18kg
  6. 6. 利益を最大化するには? 製品X 製品Y 利用可能量 利益 2 3 原料A 1 2 12 原料B 3 2 18
  7. 7. 利益を最大化するには? 製品X 製品Y 利用可能量 利益 2 3 原料A 1 2 12 原料B 3 2 18 6個 ×6 = 12 ×6 = 6 ×6 = 18
  8. 8. 利益を最大化するには? 製品X 製品Y 利用可能量 利益 2 3 原料A 1 2 12 原料B 3 2 18 6個 18 = 6× 12 = 6× 12 = 6×
  9. 9. 利益を最大化するには? 製品X 製品Y 利用可能量 利益 2 3 原料A 1 2 12 原料B 3 2 18
  10. 10. 利益を最大化するには? 製品X 製品Y 利用可能量 利益 2𝑥 + 3𝑦 原料A 𝑥 + 2𝑦 ≤ 12 原料B 3𝑥 + 2𝑦 ≤ 18
  11. 11. 定式化 (formulation) maximize subject to 2𝑥 + 3𝑦 𝑥 + 2𝑦 ≤ 12 3𝑥 + 2𝑦 ≤ 18 𝑥, 𝑦 ≥ 0 𝑥, 𝑦 は整数 目的関数 (objective function) 制約条件 (constraint)
  12. 12. 最適化問題 (optimization problem) とは 条件を満たす解の中で最適なものを求める問題 数理最適化 (mathematical optimization) 目的関数と制約条件が線形式 線形最適化 (linear optimization) 変数が整数 整数最適化 (integer optimization)
  13. 13. 最適化ソルバ • 定式化した数理モデルを与えると結果を返してくれる • 無料のものから有料のものまでさまざま • 本日は Gurobi Optimizer を利用
  14. 14. Rubyによる最適化プログラム maximize subject to 2𝑥 + 3𝑦 𝑥 + 2𝑦 ≤ 12 3𝑥 + 2𝑦 ≤ 18 𝑥, 𝑦 ≥ 0 𝑥, 𝑦 は整数 require 'gurobi‘ model = Gurobi::Model.new x = model.add_var(vtype: :integer) y = model.add_var(vtype: :integer) model.maximize x * 2 + y * 3 model.add_constr x + y * 2 <= 12 model.add_constr x * 3 + y * 2 <= 18 model.optimize https://github.com/m4i/gurobi-jruby を利用
  15. 15. 本日の内容 1 • 最適化問題とは何か 2 • 応用分野と勤務スケジューリング問題 3 • なぜRubyを使うのか
  16. 16. 最適化の事例 試合スケジュール決定 • NFLの17週間の256試合のスケジュール作成 ガスの生産最適化 • ガス経路計画 • ガスの仕様、未精製ガスの生産バランスに関する将来計画 発電所用ダムへの水の流路、流量の決定 • コロンビア川に直列に並ぶ6つの発電所ダムへの最適配水 • 環境保護、保養、洪水制御などの制約を満たしダムを最適管理 引用元: http://www.octobersky.jp/casestudy/
  17. 17. 勤務スケジューリング
  18. 18. 勤務スケジューリングは何が大変? 分類 具体例 1 就業規則に基づいた休日割り当て 連続勤務日数、各月の公休日数 2 現場の運用に合った適切なスタッフの配置 開店、閉店時のスタッフ、催事対応 3 繁閑に整合した人数配分 平日、週末の忙しさに応じた人数配分 4 各スタッフの希望 公休の希望、アルバイトスタッフの勤務可能 日 5 公平で、無理のないシフト割り当て 早番/遅番の回数、休日の公休割り当て、遅 番の翌日は早番にしない 6 総就業時間予算以内のシフト割り当て 繁忙月と閑散月の人件費のコントロール
  19. 19. 勤務スケジューリングの定式化 変数 𝑤𝑖𝑗𝑘 は 「𝑖 日にスタッフ 𝑗 がシフト 𝑘 に 就くかどうか」 𝑤𝑖𝑗𝑘 ∈ {0,1} 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  20. 20. 勤務スケジューリングの定式化 1人のスタッフが1日に就くことが できるシフトは1つだけ 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  21. 21. 勤務スケジューリングの定式化 1人のスタッフが1日に就くことが できるシフトは1つだけ
  22. 22. 勤務スケジューリングの定式化 1人のスタッフが1日に就くことが できるシフトは1つだけ ∀𝑖∀𝑗 ෍ 𝑘 𝑤𝑖𝑗𝑘 = 1 ෍ = 1
  23. 23. 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖 スキルA
  24. 24. 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖 スキルA
  25. 25. 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  26. 26. 金曜日 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  27. 27. 金曜日 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  28. 28. 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  29. 29. 昼に勤務しているシフト 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない 𝑤𝑖𝑗𝑘 スタッフ𝑗 日にち 𝑖
  30. 30. 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない
  31. 31. ෍ ≥ 1 勤務条件を表す制約式の例 金曜日の昼はスキルAを持った人が1人以上いなくてはならない
  32. 32. 必要人数と勤務人数のGap最小化 9:00 15:00 21:00 オーバースタッフ (余剰時間) アンダースタッフ (不足時間) 必要人員数 実際の勤務人数
  33. 33. 目標関数:ペナルティの合計を最小化 必要人員数と割当てた スタッフ数の差(Gap)を 最小化 働きやすい勤務の 組み合わせなどの 違反回数の合計を最小化 シフト割り当て回数の公平化 勤務人数の平準化 勤務効率 働きやすさ 公平性   i h ij MaximumNdPenaltycPenaltybGapaMinimize ...21: a, b. c, d… は評価の重み係数
  34. 34. 本日の内容 1 • 最適化問題とは何か 2 • 応用分野と勤務スケジューリング問題 3 • なぜRubyを使うのか
  35. 35. 2.x 3.x 1.x オンプレミス SaaS 2007年 2008年 2009年 2010年 2011年 2012年 2013年 2014年 2015年 2016年 4.x Web ASP ➠ Ruby on Rails ➠ 最適化 C++ ➠ JRuby ➠ WINWORKS One の歴史
  36. 36. なぜRubyを使うのか require 'gurobi‘ model = Gurobi::Model.new x = model.add_var(vtype: :integer) y = model.add_var(vtype: :integer) model.maximize x * 2 + y * 3 model.add_constr x + y * 2 <= 12 model.add_constr x * 3 + y * 2 <= 18 model.optimize 最適化の式をわかりやすい形でコード上で表現できる
  37. 37. なぜRubyを使うのか import gurobi.GRB; import gurobi.GRBEnv; import gurobi.GRBException; import gurobi.GRBLinExpr; import gurobi.GRBModel; import gurobi.GRBVar; public class ProductionPlanning { public static void main(String[] args) throws GRBException { GRBEnv env = new GRBEnv(); GRBModel model = new GRBModel(env); GRBVar x = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.INTEGER, null); GRBVar y = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.INTEGER, null); model.update(); // miximize: 2x + 3y GRBLinExpr expr = new GRBLinExpr(); expr.addTerm(2, x); expr.addTerm(3, y); model.setObjective(expr, GRB.MAXIMIZE); // x + 2y <= 12 expr = new GRBLinExpr(); expr.addTerm(1, x); expr.addTerm(2, y); model.addConstr(expr, GRB.LESS_EQUAL, 12, null); // 3x + 2y <= 18 expr = new GRBLinExpr(); expr.addTerm(3, x); expr.addTerm(2, y); model.addConstr(expr, GRB.LESS_EQUAL, 18, null); model.update(); model.optimize(); } require 'gurobi‘ model = Gurobi::Model.new x = model.add_var(vtype: :integer) y = model.add_var(vtype: :integer) model.maximize x * 2 + y * 3 model.add_constr x + y * 2 <= 12 model.add_constr x * 3 + y * 2 <= 18 model.optimize 最適化の式をわかりやすい形でコード上で表現できる
  38. 38. なぜRubyを使うのか Webアプリケーション部分との使用言語の統一
  39. 39. 本日の内容 1 • 最適化問題とは何か 2 • 応用分野と勤務スケジューリング問題 3 • なぜRubyを使うのか
  40. 40. 最後に

×