SlideShare a Scribd company logo
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
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
Rubyによる組合せ最適化
定式化 (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を使うのか
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を使うのか
最後に

More Related Content

PDF
シン モブ・プログラミング 第三形態
PDF
Swaggerで始めるモデルファーストなAPI開発
PDF
Cartesian Closed Category
PPTX
「開発がスクラム導入するんだって!試験どーしよ!?」 -サイボウズQAスクラム奮闘記-
PPTX
ゲート方式量子コンピュータの概要
PPTX
MVCになぞらえて理解するReact
PDF
DX と社会問題解決
PPTX
Οδηγίες για το Scratch 3 και δημιουργία παιχνιδιού
シン モブ・プログラミング 第三形態
Swaggerで始めるモデルファーストなAPI開発
Cartesian Closed Category
「開発がスクラム導入するんだって!試験どーしよ!?」 -サイボウズQAスクラム奮闘記-
ゲート方式量子コンピュータの概要
MVCになぞらえて理解するReact
DX と社会問題解決
Οδηγίες για το Scratch 3 και δημιουργία παιχνιδιού

What's hot (20)

PDF
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
PDF
【技術解説20】 ミニバッチ確率的勾配降下法
PDF
チームで1番弱い子がアジャイルレトロスペクティブやってみたら ・・・
PDF
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
PDF
[DL輪読会]Convolutional Sequence to Sequence Learning
PDF
最近のDQN
PDF
それはYAGNIか? それとも思考停止か?
PPTX
DeNAが取り組む Software Engineer in Test
PPTX
「チーム開発実践入門」勉強会
PDF
The Apollo and GraphQL Stack
PDF
[B15] HiRDBのSQL実行プランはどのように決定しているのか?by Masaaki Narita
PPTX
テストコードの DRY と DAMP
KEY
テスト駆動開発入門
PDF
データ分析基盤運⽤チームの 運⽤業務を改善してみた話
PDF
MySQLの文字コード事情
PPTX
社内でアジャイルと出会った新卒2年目がインフラ部隊でタスク可視化をやってみた話
PDF
サイボウズの開発を支える GitHub × CircleCI
KEY
はじめてのCouch db
PPTX
ChatGPT Impact - その社会的/ビジネス価値を考える -
PPTX
Optimizing cloud firestore reads
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
【技術解説20】 ミニバッチ確率的勾配降下法
チームで1番弱い子がアジャイルレトロスペクティブやってみたら ・・・
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
[DL輪読会]Convolutional Sequence to Sequence Learning
最近のDQN
それはYAGNIか? それとも思考停止か?
DeNAが取り組む Software Engineer in Test
「チーム開発実践入門」勉強会
The Apollo and GraphQL Stack
[B15] HiRDBのSQL実行プランはどのように決定しているのか?by Masaaki Narita
テストコードの DRY と DAMP
テスト駆動開発入門
データ分析基盤運⽤チームの 運⽤業務を改善してみた話
MySQLの文字コード事情
社内でアジャイルと出会った新卒2年目がインフラ部隊でタスク可視化をやってみた話
サイボウズの開発を支える GitHub × CircleCI
はじめてのCouch db
ChatGPT Impact - その社会的/ビジネス価値を考える -
Optimizing cloud firestore reads
Ad

Rubyによる組合せ最適化