SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Rubyによる組合せ最適化
Masaki Takeuchi @m4i
2015-11-13 RubyWorld Conference 2015
Masaki Takeuchi
竹内 真樹
@m4i
ウィンワークス株式会社
Chief Scientist
本日の内容
1
• 最適化問題とは何か
2
• 応用分野と勤務スケジューリング問題
3
• なぜRubyを使うのか
本日の内容
1
• 最適化問題とは何か
2
• 応用分野と勤務スケジューリング問題
3
• なぜRubyを使うのか
利益を最大化するには?
製品X
製品Y
原料A
原料B
2kg
1kg
2kg
3kg 12kg
18kg
利益を最大化するには?
製品X 製品Y 利用可能量
利益 2 3
原料A 1 2 12
原料B 3 2 18
利益を最大化するには?
製品X 製品Y 利用可能量
利益 2 3
原料A 1 2 12
原料B 3 2 18
6個
×6 = 12
×6 = 6
×6 = 18
利益を最大化するには?
製品X 製品Y 利用可能量
利益 2 3
原料A 1 2 12
原料B 3 2 18
6個
18 = 6×
12 = 6×
12 = 6×
利益を最大化するには?
製品X 製品Y 利用可能量
利益 2 3
原料A 1 2 12
原料B 3 2 18
利益を最大化するには?
製品X 製品Y 利用可能量
利益 2𝑥 + 3𝑦
原料A 𝑥 + 2𝑦 ≤ 12
原料B 3𝑥 + 2𝑦 ≤ 18
定式化 (formulation)
maximize
subject to
2𝑥 + 3𝑦
𝑥 + 2𝑦 ≤ 12
3𝑥 + 2𝑦 ≤ 18
𝑥, 𝑦 ≥ 0
𝑥, 𝑦 は整数
目的関数
(objective function)
制約条件
(constraint)
最適化問題 (optimization problem) とは
条件を満たす解の中で最適なものを求める問題
数理最適化 (mathematical optimization)
目的関数と制約条件が線形式
線形最適化 (linear optimization)
変数が整数
整数最適化 (integer optimization)
最適化ソルバ
• 定式化した数理モデルを与えると結果を返してくれる
• 無料のものから有料のものまでさまざま
• 本日は Gurobi Optimizer を利用
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 を利用
本日の内容
1
• 最適化問題とは何か
2
• 応用分野と勤務スケジューリング問題
3
• なぜRubyを使うのか
最適化の事例
試合スケジュール決定
• NFLの17週間の256試合のスケジュール作成
ガスの生産最適化
• ガス経路計画
• ガスの仕様、未精製ガスの生産バランスに関する将来計画
発電所用ダムへの水の流路、流量の決定
• コロンビア川に直列に並ぶ6つの発電所ダムへの最適配水
• 環境保護、保養、洪水制御などの制約を満たしダムを最適管理
引用元: http://www.octobersky.jp/casestudy/
勤務スケジューリング
勤務スケジューリングは何が大変?
分類 具体例
1 就業規則に基づいた休日割り当て 連続勤務日数、各月の公休日数
2 現場の運用に合った適切なスタッフの配置 開店、閉店時のスタッフ、催事対応
3 繁閑に整合した人数配分 平日、週末の忙しさに応じた人数配分
4 各スタッフの希望
公休の希望、アルバイトスタッフの勤務可能
日
5 公平で、無理のないシフト割り当て
早番/遅番の回数、休日の公休割り当て、遅
番の翌日は早番にしない
6 総就業時間予算以内のシフト割り当て 繁忙月と閑散月の人件費のコントロール
勤務スケジューリングの定式化
変数 𝑤𝑖𝑗𝑘 は
「𝑖 日にスタッフ 𝑗 がシフト 𝑘 に
就くかどうか」
𝑤𝑖𝑗𝑘 ∈ {0,1}
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
勤務スケジューリングの定式化
1人のスタッフが1日に就くことが
できるシフトは1つだけ
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
勤務スケジューリングの定式化
1人のスタッフが1日に就くことが
できるシフトは1つだけ
勤務スケジューリングの定式化
1人のスタッフが1日に就くことが
できるシフトは1つだけ
∀𝑖∀𝑗 ෍
𝑘
𝑤𝑖𝑗𝑘 = 1
෍ = 1
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
スキルA
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
スキルA
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
金曜日
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
金曜日
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
昼に勤務しているシフト
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
𝑤𝑖𝑗𝑘
スタッフ𝑗
日にち 𝑖
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
෍ ≥ 1
勤務条件を表す制約式の例
金曜日の昼はスキルAを持った人が1人以上いなくてはならない
必要人数と勤務人数のGap最小化
9:00 15:00 21:00
オーバースタッフ
(余剰時間)
アンダースタッフ
(不足時間)
必要人員数 実際の勤務人数
目標関数:ペナルティの合計を最小化
必要人員数と割当てた
スタッフ数の差(Gap)を
最小化
働きやすい勤務の
組み合わせなどの
違反回数の合計を最小化
シフト割り当て回数の公平化
勤務人数の平準化
勤務効率 働きやすさ 公平性
 
i h
ij MaximumNdPenaltycPenaltybGapaMinimize ...21:
a, b. c, d… は評価の重み係数
本日の内容
1
• 最適化問題とは何か
2
• 応用分野と勤務スケジューリング問題
3
• なぜRubyを使うのか
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 の歴史
なぜ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
最適化の式をわかりやすい形でコード上で表現できる
なぜ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
最適化の式をわかりやすい形でコード上で表現できる
なぜRubyを使うのか
Webアプリケーション部分との使用言語の統一
本日の内容
1
• 最適化問題とは何か
2
• 応用分野と勤務スケジューリング問題
3
• なぜRubyを使うのか
最後に

Weitere ähnliche Inhalte

Was ist angesagt?

Inverse Reward Design の紹介
Inverse Reward Design の紹介Inverse Reward Design の紹介
Inverse Reward Design の紹介Chihiro Kusunoki
 
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎Seiichi Uchida
 
学位論文の書き方メモ (Tips for writing thesis)
学位論文の書き方メモ (Tips for writing thesis)学位論文の書き方メモ (Tips for writing thesis)
学位論文の書き方メモ (Tips for writing thesis)Nobuyuki Umetani
 
DeepLearning 輪読会 第1章 はじめに
DeepLearning 輪読会 第1章 はじめにDeepLearning 輪読会 第1章 はじめに
DeepLearning 輪読会 第1章 はじめにDeep Learning JP
 
ひたすら楽してスライド作成
ひたすら楽してスライド作成ひたすら楽してスライド作成
ひたすら楽してスライド作成Masanori Morise
 
5 クラスタリングと異常検出
5 クラスタリングと異常検出5 クラスタリングと異常検出
5 クラスタリングと異常検出Seiichi Uchida
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話Tokoroten Nakayama
 
データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度Seiichi Uchida
 
CatBoost on GPU のひみつ
CatBoost on GPU のひみつCatBoost on GPU のひみつ
CatBoost on GPU のひみつTakuji Tahara
 
異常検知と変化検知 9章 部分空間法による変化点検知
異常検知と変化検知 9章 部分空間法による変化点検知異常検知と変化検知 9章 部分空間法による変化点検知
異常検知と変化検知 9章 部分空間法による変化点検知hagino 3000
 
[DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions [DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions Deep Learning JP
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木 Miyoshi Yuya
 
パターン認識と機械学習入門
パターン認識と機械学習入門パターン認識と機械学習入門
パターン認識と機械学習入門Momoko Hayamizu
 
全体セミナー20170629
全体セミナー20170629全体セミナー20170629
全体セミナー20170629Jiro Nishitoba
 
簡単な算数でできる文章校正
簡単な算数でできる文章校正簡単な算数でできる文章校正
簡単な算数でできる文章校正hirokiky
 
バンディット問題について
バンディット問題についてバンディット問題について
バンディット問題についてjkomiyama
 
第1回Rを使って統計分析を勉強する会
第1回Rを使って統計分析を勉強する会第1回Rを使って統計分析を勉強する会
第1回Rを使って統計分析を勉強する会Nobuto Inoguchi
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015SaitoTsutomu
 

Was ist angesagt? (20)

Inverse Reward Design の紹介
Inverse Reward Design の紹介Inverse Reward Design の紹介
Inverse Reward Design の紹介
 
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎
データサイエンス概論第一=3-1 線形代数に基づくデータ解析の基礎
 
学位論文の書き方メモ (Tips for writing thesis)
学位論文の書き方メモ (Tips for writing thesis)学位論文の書き方メモ (Tips for writing thesis)
学位論文の書き方メモ (Tips for writing thesis)
 
DeepLearning 輪読会 第1章 はじめに
DeepLearning 輪読会 第1章 はじめにDeepLearning 輪読会 第1章 はじめに
DeepLearning 輪読会 第1章 はじめに
 
ひたすら楽してスライド作成
ひたすら楽してスライド作成ひたすら楽してスライド作成
ひたすら楽してスライド作成
 
5 クラスタリングと異常検出
5 クラスタリングと異常検出5 クラスタリングと異常検出
5 クラスタリングと異常検出
 
15 人工知能入門
15 人工知能入門15 人工知能入門
15 人工知能入門
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話
 
データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度
 
劣微分
劣微分劣微分
劣微分
 
CatBoost on GPU のひみつ
CatBoost on GPU のひみつCatBoost on GPU のひみつ
CatBoost on GPU のひみつ
 
異常検知と変化検知 9章 部分空間法による変化点検知
異常検知と変化検知 9章 部分空間法による変化点検知異常検知と変化検知 9章 部分空間法による変化点検知
異常検知と変化検知 9章 部分空間法による変化点検知
 
[DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions [DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木
 
パターン認識と機械学習入門
パターン認識と機械学習入門パターン認識と機械学習入門
パターン認識と機械学習入門
 
全体セミナー20170629
全体セミナー20170629全体セミナー20170629
全体セミナー20170629
 
簡単な算数でできる文章校正
簡単な算数でできる文章校正簡単な算数でできる文章校正
簡単な算数でできる文章校正
 
バンディット問題について
バンディット問題についてバンディット問題について
バンディット問題について
 
第1回Rを使って統計分析を勉強する会
第1回Rを使って統計分析を勉強する会第1回Rを使って統計分析を勉強する会
第1回Rを使って統計分析を勉強する会
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
 

Rubyによる組合せ最適化