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
定式化 (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を使うのか
最後に

More Related Content

What's hot

Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
Tokoroten Nakayama
 
Hoare論理
Hoare論理Hoare論理
Hoare論理
Tetsuro Nagae
 
200611material ozaki
200611material ozaki200611material ozaki
200611material ozaki
RCCSRENKEI
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Go Maeda
 
「伝わるチケット」の書き方
「伝わるチケット」の書き方「伝わるチケット」の書き方
「伝わるチケット」の書き方
onozaty
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
Masakazu Matsushita
 
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST APIRedmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Go Maeda
 
GitHubの使い方
GitHubの使い方 GitHubの使い方
GitHubの使い方
Atelier Frameworks
 
エンゲージメントとセルフマネジメント
エンゲージメントとセルフマネジメントエンゲージメントとセルフマネジメント
エンゲージメントとセルフマネジメント
KeiHasegawa2
 
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
Fixstars Corporation
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Kazumi IWANAGA
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
mametter
 
Slideshare Japanese
Slideshare JapaneseSlideshare Japanese
Slideshare Japanese
Hidenori Goto
 
back check
back checkback check
back check
koteratakao
 
ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢
swamp Sawa
 
貪欲法による
単調劣モジュラ関数の最大化
貪欲法による
単調劣モジュラ関数の最大化貪欲法による
単調劣モジュラ関数の最大化
貪欲法による
単調劣モジュラ関数の最大化
Ikumi Shimizu
 

What's hot (20)

Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
Hoare論理
Hoare論理Hoare論理
Hoare論理
 
200611material ozaki
200611material ozaki200611material ozaki
200611material ozaki
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
 
「伝わるチケット」の書き方
「伝わるチケット」の書き方「伝わるチケット」の書き方
「伝わるチケット」の書き方
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST APIRedmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
 
GitHubの使い方
GitHubの使い方 GitHubの使い方
GitHubの使い方
 
エンゲージメントとセルフマネジメント
エンゲージメントとセルフマネジメントエンゲージメントとセルフマネジメント
エンゲージメントとセルフマネジメント
 
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
Slideshare Japanese
Slideshare JapaneseSlideshare Japanese
Slideshare Japanese
 
back check
back checkback check
back check
 
ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢
 
貪欲法による
単調劣モジュラ関数の最大化
貪欲法による
単調劣モジュラ関数の最大化貪欲法による
単調劣モジュラ関数の最大化
貪欲法による
単調劣モジュラ関数の最大化
 

Recently uploaded

20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
Ayachika Kitazaki
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
ooishi1
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
fisuda
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
Yoshitaka Kawashima
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 

Recently uploaded (6)

20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 

Rubyによる組合せ最適化