シフトをRを使って作成する



@Med_KU

20221210
Japan.R 2022

今日の話

シフト調整は大変




そうだR を使ってやろう

R ならシフト作成も完璧

R を使ってシフトを作成する

シフト作成は大変

20人いる科

毎日2人当直が必要

祝日休日は昼勤務も人員必要

1勤務中\(N\)日以上中日必要

一ヶ月に\(M\)日超えてはならない

休日勤務数も調整したい

リーダー同士や新人同士は同時に当直させられない

統計学的に決められる

\(f(x)=x_1+9x_2+x_3\) を以下の条件で最大化する.

\(\begin{matrix}x_1+2x_2+3x_3\leq 9 \\ 3x_1+2x_2+2x_3 \leq 15 \\x_1, x_2, x_3 \in \mathbb{Z}\end{matrix}\)

整数解に制限した線形計画法

R で線型計画法 1

lpSolve::lp または lpSolve::lp.assign

f.obj f.con \(x\) f.dir f.rhs int.vec
\(\begin{bmatrix}1&9&1\end{bmatrix}\) \(\begin{bmatrix}1&2&3\\3&2&2\end{bmatrix}\) \(\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\) \(\begin{matrix}\leq\\\leq\end{matrix}\) \(\begin{bmatrix}9\\15\end{bmatrix}\) \(\mathbb{Z}\)
# Set up problem: maximize
#   x1 + 9 x2 +   x3 subject to
#   x1 + 2 x2 + 3 x3 <= 9
# 3 x1 + 2 x2 + 2 x3 <= 15
f.obj <- c(1, 9, 1)
f.con <- matrix (c(1, 2, 3, 3, 2, 2), nrow=2, byrow=TRUE)
f.dir <- c("<=", "<=")
f.rhs <- c(9, 15)
lpSolve::lp("max", f.obj, f.con, f.dir, f.rhs, int.vec=1:3)$solution
[1] 1 4 0

R で線型計画法 2

シフト行列\(X\)\(\{0,1\}\)を割り振る.

3人を5日に割り振る.

\(X\) \(d_1\) \(d_2\) \(d_3\) \(d_4\) \(d_5\)
\(m_1\) \(x_{1,1}\) \(x_{1,5}\)
\(m_2\) \(x_{i,j}\)
\(m_3\) \(x_{3,1}\) \(x_{3,5}\)

R で線型計画法 3

シフト行列\(X\)をベクトル\(x\)にして\(\{0,1\}\)を割り振る.

\(X=\begin{bmatrix}\\ x_{*,1} \\\\\end{bmatrix}\begin{bmatrix}\\\cdots\\\\\end{bmatrix}\begin{bmatrix}\\ x_{*,j}\\\\\end{bmatrix}\begin{bmatrix}\\\cdots\\\\\end{bmatrix}\begin{bmatrix}\\ x_{*,5}\\\\\end{bmatrix}\)

\(\begin{align} x &=\{x_{*,1}^\mathsf{T}, \dots, x_{*,j}^\mathsf{T}, \dots, x_{*,5}^\mathsf{T}\}\\ &=\{x_{1,1}, x_{2,1}, x_{3,1}, x_{1,2}, \dots, x_{i,j}, \dots, x_{1,5}, x_{2,5}, x_{3,5}\}\end{align}\)

R で線型計画法 4

シフト行列\(X\)をベクトル\(x\)にして\(\{0,1\}\)を割り振る.

\(X\) \(d_1\) \(d_2\) \(d_3\) \(d_4\) \(d_5\)
\(m_1\) \(x_{1,1}\) \(x_{1,5}\)
\(m_2\) \(x_{i,j}\)
\(m_3\) \(x_{3,1}\) \(x_{3,5}\)
必要人数 2 2 2 2 2

\(\begin{matrix}&&&x_{1,1}&x_{2,1}&x_{3,1}&x_{1,2}&x_{2,2}&x_{3,2}&\dots&x_{3,5}&\\c_k&=&\{&0&0&0&1&1&1&\dots&0&\}\end{matrix}\)

\(c_k x^\mathsf{T} = 2\)

R で線型計画法 5

シフト行列\(X\)をベクトル\(x\)にして\(\{0,1\}\)を割り振る.

\(X\) \(d_1\) \(d_2\) \(d_3\) \(d_4\) \(d_5\) 月回数
\(m_1\) \(x_{1,1}\) \(x_{1,5}\) 3
\(m_2\) \(x_{i,j}\) 3
\(m_3\) \(x_{3,1}\) \(x_{3,5}\) 3

\(\begin{matrix}&&&x_{1,1}&\dots&x_{1,2}&\dots&x_{1,3}&\dots&x_{1,4}&\dots&x_{1,5}&\dots&\\c_k&=&\{&1&0&1&0&1&0&1&0&1&0&\}\end{matrix}\)

\(c_k x^\mathsf{T} \leq 3\)

R で線型計画法 6

シフト行列\(X\)をベクトル\(x\)にして\(\{0,1\}\)を割り振る.

\(X\) \(d_1\) \(d_2\) \(d_3\) \(d_4\) \(d_5\)
\(m_1\) \(x_{1,1}\) \(\times\) \(x_{1,5}\)
\(m_2\) \(x_{i,j}\)
\(m_3\) \(x_{3,1}\) \(\times\) \(x_{3,5}\)

\(\begin{matrix}&&&\dots&x_{1,2}&\dots&x_{3,4}&\dots&\\c_k&=&\{&\dots&-p&\dots&0&\dots&\}\\&&\{&\dots&0&\dots&-p&\dots&\}\end{matrix}\)

最終的にすべての制約条件行列\(C\) を使って

\(\underset{x}{\textrm{max}} f(x)=C x^\mathsf{T}\)

で希望調査,でweb のみで完結

シフト割当が自動で出来る