【事例共有】ホテル客室清掃　担当割り振り業務　の最適化

本記事は [数理最適化Advent Calender 2023](https://qiita.com/advent-calendar/2023/mathematical-optimization ) の14日目の記事です。


:::note info
この記事では、私の取り組んだ最適化問題の一つである
<font color="Tomato">**「ホテルの客室清掃の担当割り振り」の事例共有**</font>をします。
定式化した具体的な制約条件も共有します。
:::
:::note warn
専門家とかではないので、やってみた系の延長線上だと思っていただければ
:::



本来は最適化モデル作成時に課題となる暗黙知と戦いについてリアルに共有できたらと思っていたのですが、~~投稿担当日に大遅刻していた~~大変読みづらくなってきたので記事を分割することにしました。 <font color="LimeGreen">**暗黙知と戦いについては別記事で投稿**</font>します。





#### 暗黙知とは
>経験や勘、直感などに基づく知識で、簡単に言葉で説明できない知識のことです。
特定の業務を円滑に進めるための「コツ」や、長年の経験に基づく「ノウハウ」などがあります。


# はじめに
私は不動産関連企業で、数理最適化を用いて業務の効率化ができないかと、いろいろ挑戦しています。これまでに勤務表の最適化や作業スケジュール作成などに取り組んできました。

ちなみに初めて買った数理最適化の本はこちら

https://www.kindaikagaku.co.jp/book_list/detail/9784764905580/

手前味噌リンク

https://qiita.com/ookamikujira/items/096a868f8f3f58043c66

#### 大まかなこの記事の流れ
1. ホテル客室清掃　担当割り振り業務の概要説明
2. ホテル客室清掃の事前知識
3. 担当割り振りに求められる条件
4. 条件の定式化

ボリュームがあるので斜め読みして頂いて結構です。
ただ、読み終わった感想として以下が達成できればと思います。

:::note info
<font color="Tomato">**伝わってほしいこと**</font>
・客室割り振りは複雑な条件のもと行われている
・複雑な条件も定式化ができること
<font color="Tomato">**残ってほしい疑問**</font>
・どうやって条件を見つけた（現場から抽出した）のか
・どうしてそのような定式化したのか
:::


# ホテル客室清掃　担当割り振り業務
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/2de1089e-bb59-aa06-2747-4517e7670307.png)

## 客室清掃割り振り業務の概要
### 「ホテル客室清掃」とは
利用済みの<font color="LimeGreen">**客室を次のチェックイン時刻までに販売可能な状態（＝商品）を作り、ホテルに納品するお仕事**</font>です。また、連泊客室に入室して清掃を行うこともあります。客室内の業務においては清掃、ベッドメイク、アメニティの補充などがあり、客室外ではリネンの運搬などを担う現場もあります。

https://youtu.be/zH8iW33CEk8?si=_lZxfAalW0PDJ1ek

https://youtu.be/XsXtkYiTAXQ?si=SEbTwNSoO-OXcVWb



### なぜ最適な割り振りが難しいの？
シンプルに組み合わせの数が大爆発です。
加えて客室は様々な部屋のタイプがあり、必要となる作業時間が異なるだけでなく、特別な作業が追加されることもあります。清掃員のスキルや作業導線の効率、公平性に加えて<font color="LimeGreen">**現場固有の条件も多く**</font>、計画作業は現場を熟知していても容易ではありません。

### 現場はどんな対応してるの？
<font color="LimeGreen">**「どのフロアを誰に担当させるか」 という問題に変える**</font>ことで、大まかに業務量を割り振るという現場が多かったりします。このやり方は序盤は良いのですが、<font color="LimeGreen">**終盤になると清掃員は 「まだ清掃されていない部屋がどこにあるか分からない」 状態**</font>になります。

フロアにある客室全てを一人の清掃員でカバーできれば問題ないですが、そのような割り振りでは負担に偏りがでてきたりします。そもそも、フロア割り振りも個別の客室の事情も完全には無視できません。
結局のところ責任者は「あああ～～～～！！！！」と頭を悩ませるわけです。



## 事前知識
全部紹介すると大変骨が折れるので詳細といいつつ主要な部分だけ
ただし全てが定式化に必要な知識という訳ではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/c880f952-559f-00db-7e09-e6100553966e.png)

実際に現場で使用されている略称はちょっと分かりづらいので適当に変更しました。



### 部屋タイプ
<dl>
    <dt>客室はいくつかの部屋タイプに分かれる</dt>
    <dd>客室のランクや和室といった様式、ベッドの数、車いす対応などの機能によって分類される。どんな部屋かを表す。</dd>
</dl>

<details><summary><font color="#0000ee">部屋タイプ詳細</font></summary><div>

| 部屋タイプ |　略称　| 意味 |
|---|---|---|
|ツインルーム|TW|ベッドが二つ供えられた客室|
|ダブルルーム|DB|ダブルサイズベッドが1つ供えられた客室|
|キングルーム|KG|キングサイズベッドが1つ供えられた客室|
|トリプルルーム|TR|TWの客室にエキストラベッド1つを設置客室|
|和室|JP|和室タイプの客室。ベッドではなく布団。インバウンド向け。|
|車椅子|WC|車いす対応の客室。最も低いフロアに一室用意されている。|

| その他仕様 |　 意味 |
|---|---|
|コネクティング|特定の客室はコネクト扉と呼ばれる仕切り戸で区切られており、宿泊客の要望により隣り合う2つの客室をつなげることができる。家族に人気。|
|部屋タイプの変更|TW,TR,KGは宿泊客に合わせて組み替えることができる。TWの2つのベッドを連結させればKG客室になる。|

</div></details>

### 清掃タイプ

<dl>
    <dt>客室への対応（清掃作業）の種類はいくつかの清掃タイプに分かれる</dt>
    <dd>部屋のステータスに該当する。チェックアウト済み、連泊中だけでなくDD(don't disturb)など清掃しない部屋も含まれ客室がどんな状態に置かれているかを表し、<font color="LimeGreen"><b>清掃内容を決める。</b></font></dd>
</dl>

<details><summary><font color="#0000ee">清掃タイプ詳細</font></summary><div>

| 清掃タイプ |　略称　| 意味 |
|---|---|---|
|Out|O|チェックアウト済みの客室清掃。out清掃は基本的に最も時間がかかる。|
|OutVacant|OV|O部屋の内チェックイン予定のない客室。人手が足りないとき優先度は下がる。|
|Stay|S|連泊客室の清掃。時間指定がある場合もある。|
|StaySheet|SS|S部屋の内、シーツ交換の依頼をされた客室。|
|Don't Disturb|DD|連泊客室だが客室清掃を行わない。宿泊の任意のタイミングで変更される。|
|Vacant|V|現在、空室でありチェックイン予定もない客室。客室に異常がないか確認作業（チェック）が発生する。|
|故障|N|何らかの理由で販売が不可能な客室。物凄い香水の匂いが残っている場合など。|


| その他の作業 | 意味 |
|---|---|
|共用部清掃|客室担当の作業員とは別で清掃員が担当する。大浴場や廊下などが当てはまる。客室清掃より早く終わる。|
|チェック|清掃が完了した部屋は、宿泊客が利用する前に一度チェックが入る。清掃不備を見逃すとクレームに繋がることも。主に共用部清掃員が共用部終了後に担当する。|
|特別清掃|通常の客室清掃では行わない冷蔵庫を移動させての清掃やベッドの天地替えなどを行う。|
|在庫調整|本来は清掃する必要のない販売可能な客室であってもホテル全体の部屋タイプの偏りを考慮して部屋タイプの組み換え作業をする。|

</div></details>





### 作業時間

<dl>
    <dt>各客室の標準作業時間が部屋タイプ×清掃タイプ×追加作業の有無によって決まる </dt>
    <dd>作業時間が45分を超えると<font color="LimeGreen"><b>「高負担な客室」</b></font>として扱う。</dd>
</dl>

<details><summary><font color="#0000ee">作業時間詳細</font></summary><div>

同じ清掃タイプでも部屋タイプによって時間は変わる。
加えて部屋タイプの組み替える必要があった場合はその分の作業時間が発生する。
実際の作業時間は作業員の熟練度と部屋の状態などによっても変化する。

| 清掃タイプ |清掃時間(分)|
|---|---|
|O(V)|40~60|
|SS|10~15|
|S|8~10|
|V|3|
|N|0|



</div></details>

### 負担ポイント

<dl>
    <dt>各客室には作業時間、作業内容などを踏まえた負担度合いを表す数値が定められている。 </dt>
    <dd>現場の<font color="LimeGreen"><b>経験則により算出された</b></font>作業時間に代わる数値指標。清掃員の負担できるポイント合計は勤務時間によって決まる。</dd>
</dl>

<details><summary><font color="#0000ee">負担ポイント詳細</font></summary><div>

| 清掃タイプ |負担ポイント|
|---|---|
|O(V)|1pt|
|SS|0.75pt|
|S|0.25pt|
|V|0.1pt|
|N|0pt(作業なし)|

▼作業時間と負担ポイントの対応表
| 作業時間 |負担ポイント|
|---|---|
|45分|1pt|
|270分|6pt|

勤務時間は10時から15時（チェックインスタート時間）までの300分。
内、清掃作業にあてられる時間は270分ほど。退勤が早い清掃員も存在する。
「O清掃6室を担当」や「O清掃3室とS清掃12室を担当」が270分の勤務時間に担当できる作業量。

</div></details>

## 求められる条件
テキトーに、大まかに分類しました。
+ 業務の質を担保する条件 
+ 清掃員の働きやすさのための条件
+ 各従業員の能力、労力による条件
+ 現場固有の条件


### サービスの質を担保する条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/c989b32e-bcaf-ddac-5421-3843f97c4a4b.png)

|🎯  **可能な限りすべての客室を清掃する** | 
| --- |
| 清掃が間に合わない場合はホテル側と相談して翌日に回すこともありますが、<font color="LimeGreen">**チェックイン予定のある部屋や連泊の部屋は避けられない**</font>ため、必要に応じて共用部清掃員のサポートを受けてでも清掃を完遂させます。 | 
|🎯 **コネクティングルームは同一清掃員が担当する** |
|たとえば、304号室と305号室がコネクティングルームの場合、両客室の清掃は同一人物が担当します。これは連泊清掃の際の清掃員の入室回数と人数を最小限にし、<font color="LimeGreen">**クレーム発生を抑える**</font>だけでなく作業効率を高めるためです。その為、チェックアウト（O清掃）の場合はこの条件は適用されません。 とは言え、リネン庫との往復を減らすことに繋がります。|
|🎯 **特定の客室は清掃しない** | 
|「Don't Disturb（DD）」表示のある客室や故障している客室には入室して清掃しません。  | 

### 清掃員の働きやすさのための条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/99b7c01e-9b18-29df-ab9c-6768b96717ae.png)


|🎯 **清掃員の移動をできる限り減らす**  |
| --- |
| フロア間の移動は時間と体力の両方を要するため、可能な限り避けることが望まれます。特に、離れたフロアへの移動に複数人がエレベーター（EV）を利用する場合、<font color="LimeGreen">**EV待ち時間が発生する**</font>ことがあります。連続するフロアを担当することで、階段を利用した移動が可能となり、効率的な作業が実現されます。また、客室間の移動距離もできるだけ短くすることで、清掃員の負担を軽減します。 |
|🎯 **特定の清掃員に負担が偏らないようにする** | 
|業務量に差によって清掃員から不満が出てしまうことは避けるべきです。清掃員の過度な負担を負うことを防ぐことは、そのまま全体の業務効率にも影響を与えます。 |


### 各従業員の能力、労力による条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/876fc274-01af-5a8a-f9b7-455cde200ca7.png)

|🎯 **清掃員はスキルに応じて特定の客室を担当することはできない** |
| --- |
| 例えば、前日がツイン（TW）の客室で、翌日トリプル（TR）に変更する場合、通常の清掃に加えて<font color="LimeGreen">**エキストラベッドの設置作業が必要**</font>です。このような複雑な作業は、熟練度の低い清掃員には任せられないことがあります。また、和室の清掃方法など、清掃員よってはまだ教わっていない特別な技術が必要な作業もあります。 | 
|🎯 **清掃員の担当できる業務量には限界がある** |
| 清掃員は無限に働けるわけではありません。勤務時間に応じた対応可能な負担ポイントの上限が設定されています。状況に応じて<font color="LimeGreen">**少し超えることがあっても問題はありません**</font>が、できるだけ避けることが望ましいです。 |



### 現場固有の条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/b02be882-e4e3-f48b-5801-b439fcb4e484.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/a75658f1-4749-7819-485e-35a076bfb8dd.png)

|🎯 **複数人で1つの客室を担当することはない**  |
| --- |
|  連泊の宿泊客の要望する場合や手の空いている清掃員がいる場合、現場判断で2人で同時に清掃することもありますが、計画段階では1人での担当を前提とします。 |
|🎯 **客室の内一定数を他の清掃組織に割り振る** | 
| <font color="LimeGreen">**一つのホテルに複数の清掃組織が存在する**</font>ことは珍しくありません。清掃組織間で客室を分割する際は、担当フロアを一定程度まとめることが望ましいです。 |
|🎯 **可能な限り清掃員に特別清掃を行わせたい** | 
|ベッドの天地替えといった<font color="LimeGreen">**特別清掃を実施すると売り上げ**</font>に繋がります。清掃員には客室清掃以外の作業にも時間を割けるように調整します。また、特別清掃はまとまった時間がなければ実施できません。 |
|🎯 **同一フロアの清掃員はできるだけ少なくしたい** | 
|各フロアのルームキーが2枚しかなく、3名以上だと鍵の受け渡しにより作業効率が落ちます。O清掃の際は業務開始時に全客室を開錠するので制限はありませんが、清掃員が多いと<font color="LimeGreen">**リネン庫での渋滞が発生**</font>するため、人数が少ないことが望まれます。 |
|🎯 **清掃員の教育目的で担当客室を指定したい** |
| 未熟な清掃員に経験を積ませるために和室など特定の客室を指定することがあります。 その他、宿泊客からの細かなニーズや現場の状況に合わせて客室を個別に指定したいニーズを考慮する必要があります。| 

### そんな気がする（詳しくないけど）
清掃員をビンに見立てればビンパッキング問題
フロアを資材とすれば資材切り出し問題
清掃員を客室を生産する機械とみればジョブショップ問題
清掃員を客室を納品して回る点を考えれば配送計画問題
ただ今回のホテルでは「12時までによろ！」みたいな<font color="LimeGreen">**時間が指定された清掃はあんまりない**</font>




## 条件の定式化と解の求め方
この問題は組合せ最適化問題として定式化し、最適化Solverを用いて求解を行います。しかし、<font color="LimeGreen">**全ての条件をモデルに直接組み込むと計算時間が過度に長くなる**</font>恐れがあります。複数の目的変数を持つ多目的最適化では、各変数に係数を乗じた線形和で目的関数を表現する必要がありますが、変数が多いとこれらの調整は非常に複雑な作業になります。

このため、<font color="LimeGreen">**いくつかの条件は計算プロセスの前後で処理**</font>します。これにより計算時間を抑えつつ、業務条件に適合した解（近似最適解）を導出することができます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/f201a210-2051-6d79-b7f7-640223130e55.png)

先ほど紹介した条件はこの問題において何を求められているかを示しただけのざっくりとした条件です。整理し実際に数理モデルに取り込んだ具体的な条件は以下になります。前処理や後処理で考慮する条件などは含まれていません。

<font color="LimeGreen">**前処理、後処理の詳細は続きの記事で紹介**</font>しようと思います。
複雑そうな条件を整理して定式化できました。という点が伝わればOKです。

```diff:制約条件
+ ハード制約
・ 1つの客室を複数人で担当することはない。
・ 各フロアの清掃員数を3名以下にする。
・ 各フロアのOUT清掃を担当する清掃員数は最少人数で実施する。
・ 各フロアのStay清掃を担当する清掃員数は2名以下で実施する。
・ 1人の清掃員が担当できるフロアの上下幅は6フロア差以下にする。
・ 清掃員のフロア移動回数を3回以下にする。O清掃を担当するものは1回以下にする。
・ 各々の許容できる負担ポイントは6.0以下とする。
・ 高負担の客室は一人3室以下にする。
・ 清掃員に客室が指定された場合はその指示を守る。

+ ソフト制約
・ 可能な限りすべての客室を清掃員に割り付ける。
・ 可能な限り特別清掃に従事できる清掃員数、時間を最大化する。
・ Stay清掃を担当する清掃員数を可能な限り少なくする。
・ 負担ポイントの上限を超える場合は6.2以下とする。可能な限り上限を超える清掃員数を少なくする。
・ 特定の清掃員を特別清掃候補とし、当該清掃員の負担ポイントを最小化する
```


### 問題（インスタンス）サイズと特徴
客室が存在するフロアは2F~13Fまで
各フロアに16室、ただし2Fは1室のみ。合計177室。
1日当たりの出勤清掃員はおおよそ6~10人ぐらい。
別組織に割り振るO清掃客室は40~60室ほど。


### 数理モデルの構築（記号）
※一部の集合、定数、変数における詳細な説明は続編となる記事にて行います。

#### 集合
| $集合$ | $意味$ |
| --- | --- |
| $R$ |　$計算対象の客室集合(Rooms)$ |
| $E$ |　$清掃員集合(Employees)$ |
| $F$ |　$フロア集合(Floors)$ |
| $R^{高負担}$ |　$高負担清掃客室集合(R^{高負担}\subseteq R)$ |
| $R^{Out}$ |　$O清掃客室集合(R^{Out}\subseteq R)$ |
| $R^{Stay}$ |　$S清掃客室集合(R^{Stay}\subseteq R)$ |
| $R^{Floor}_{f}$ |　$フロア_{f}に存在する客室集合(R^{Floor}_{f}\subseteq R)$ |
| $E^{特掃候補}$ |　$特別清掃を実施する清掃員の候補(E^{特掃候補}\subseteq E)$ |
| $F'_{6}$ |　$6フロア差以内で同時に担当不可能なフロア集合を要素に持つ集合$ |


#### 定数
| $定数$ | $意味$ |
| --- | --- |
| $M$ |　$十分大きな定数$ |
| $P_{r}$ |　$客室_{r}の負担ポイント(Points)$ |
| $C_{e}$ |　$従業員_{e}の負担ポイント許容上限（Capacity）$|
| $B$ |　$Cを超えて負担できるポイント。（Buffer）$|
| $L$ |　$すべての客室を割り振る際に最低限必要な清掃員数(Lower)$|
| $L_f^{Floor}$ |　$最低限フロア_fに必要な清掃員数$|
| $L_f^{Out}$ |　$最低限フロア_fのOut清掃に必要な清掃員数$|
| $L_f^{Stay}$ |　$最低限フロア_fのStay清掃に必要な清掃員数。$|



#### 変数
| $変数$ | $意味$ |
| --- | --- |
| $x_{e,r}$ |　$清掃員_{e}が客室_{r}を担当する場合1,そうでない場合0をとる01変数$ |
| $o_{e}$ |　$清掃員_{e}がout清掃(O,OV)を…01変数$|
| $x^{floor}_{e,f}$ |　$清掃員_{e}がフロア_{f}を…01変数$|
| $o^{floor}_{e,f}$ |　$清掃員_{e}がフロア_{f}のout清掃(S,SS)を…01変数$|
| $s^{floor}_{e,f}$ |　$清掃員_{e}がフロア_{f}のstay清掃(S,SS)を…01変数$|
| $z_{e}$ |　$清掃員_{e}が客室清掃を…01変数$ |
| $z^{over}_{e}$ |　$清掃員_{e}がCU_{e}を超えて作業を…01変数$ |
| $w_{e,f,f'}$ |　$清掃員_{e}がフロア_{f}と、フロア_{f'}（fの1つ上の階）を…01変数$ |
| $y_{r}$ |　$客室_{r}が清掃される場合1,そうでない場合0をとる01変数$ |
| $v$ |　$清掃しない客室数を表す整数変数$ |





### 数理モデルの構築（定式化）

#### 変数同士の整合性をとるための関係式
[BIg-M](https://www.msi.co.jp/solution/nuopt/docs/techniques/articles/big-m.html)は偉大。
ただ、Mは可能な限り最小の値で各制約式ごとに異なります。
例えば$xとx^{Floor}の関係式$においては
$M\leq \begin{vmatrix}R^{f}\end{vmatrix}$（$フロア_fの客室数以下$）
です。


これは左辺$\sum_{r\in R^{f}} x_{e,r}$（$清掃員_eがフロア_fで担当する客室数$）は最大でも当該フロアの客室数にしかならず、当該フロアの特定の客室をスキルなどの条件により担当できない場合もあるからです。

$xとx^{Floor}の関係式$　　
$\sum_{r\in R^{f}} x_{e,r} \leq M \times x_{e,f}^{Floor}$
$\sum_{r\in R^{f}} x_{e,r} \geq  x_{e,f}^{Floor}$

▼長いので折りたたんでます。

<details><summary><font color="#0000ee">関係式</font></summary><div>


$xとoの関係式$
$\sum_{r\in R^{out}} x_{e,r} \leq M \times o_{e}$
$\sum_{r\in R^{out}} x_{e,r} \geq  o_{e}$

$xとo^{floor}の関係式$
$\sum_{r\in R^{Out} \cap R^{f}} x_{e,r} \leq M \times o_{e,f}^{floor}$
$\sum_{r\in R^{Out} \cap R^{f}} x_{e,r} \geq  o_{e,f}^{floor}$

$xとs^{floor}の関係式$
$\sum_{r\in R^{Stay} \cap R^{f}} x_{e,r} \leq M \times s_{e,f}^{floor}$
$\sum_{r\in R^{Stay} \cap R^{f}} x_{e,r} \geq  s_{e,f}^{floor}$

$x^{Floor}とwの関係式$
$x_{e,f}^{Floor} + x_{e,f'}^{Floor} \geq 2\times w_{e,f,f'}$
$x_{e,f}^{Floor} + x_{e,f'}^{Floor} -1 \leq w_{e,f,f'}$

$xとzの関係式$
$\sum_{r \in R}x_{e,r} \leq M \times z_e$
$\sum_{r \in R}x_{e,r} \geq  z_e$

$zとz^{over}の関係式$
$z_{e}^{over} \leq z_e$

$o^{floor}とx^{Floor}の関係式$
$o_{e,f}^{floor} \leq x_{e,f}^{Floor}$

$o^{floor}とoの関係式$
$o_{e,f}^{floor} \leq o_{e}$

$s^{floor}とx^{Floor}の関係式$　　
$s_{e,f}^{floor} \leq x_{e,f}^{Floor}$

$xとyの関係式$　　
$\sum_{r\in R} x_{e,r} = y_{r}$

$yとvの関係式$　　
$\begin{vmatrix}R\end{vmatrix} - \sum_{r\in R}y_{r}= v$

</div></details>

#### 制約条件
今まで出てきた条件を現場へのヒアリング、現場からのフィードバックをもらいながら整理したものを定式化していきます。
`・1つの客室を複数人で担当することはない`
$\sum_{r\in R} x_{e,r} \leq 1$

`・負担ポイントの上限制約`
$\sum_{r\in R} (x_{e,r}\times P_{r}) \leq C_{e} + z^{over}_{e} \times B$

`・高負担の客室は一人3室以下にする`
$\sum_{r\in R^{高負担}} x_{e,r} \leq 3$

`・清掃員のフロア移動回数を3回以下にする。O清掃を担当するものは1回以下にする`
$\sum_{f\in F} x_{e,f}^{Floor} \leq 4 - 2 \times o_{e}$

`・1人の清掃員が担当できるフロアの上下幅は6フロア差以下にする`

$\sum_{f\in F_{6}^{'}} x_{e,f}^{Floor} \leq 1$

`・各フロアの清掃員数を3名以下にする`
$\sum_{e\in E} x_{e,f}^{Floor} \leq 3$
$\sum_{e\in E} x_{e,f}^{Floor} \geq L_f^{Floor}$

`・各フロアのOUT清掃を担当する清掃員数は最少人数で実施する`
$\sum_{e\in E} x_{e,f}^{Floor} = L_{f}^{Out}$


`・各フロアのStay清掃を担当する清掃員数は2名以下で実施する`
$\sum_{e\in E} x_{e,f}^{Floor} \leq 2$
$\sum_{e\in E} x_{e,f}^{Floor} \geq L_{f}^{Stay}$

`・客室清掃を担当する人の下限制約`
$\sum_{e\in E} z_{e} \geq L $ 

`清掃員に客室が指定された場合はその指示を守る`
$x_{e,r} = 1 $ 
`※対応する変数すべてが対象。例：rが3F客室であれば`
$x_{e,3}^{Floor} = 1 $ 

`・解の対称性を削減する制約式`
$z_{e_{0}} \leq z_{e_{1}} \leq...\leq z_{e_{n}}$

#### 目的関数
$300v  $`←清掃しない客室数を最小化`
$+50(\sum_{e\in E^{特掃候補}} z_{e} )$`←客室清掃を担当する人を最小化`
$+ 2\sum_{r}\sum_{e\in E^{特掃候補}}(x_{e,r}\times P_{r})$`←特別清掃担当候補の清掃員の負担ポイントを最小化`
$ +0.5\sum_{f}\sum_{e} s_{e,f}^{Stay} $`←Stay清掃を担当する人数、1人当たりの担当フロア数を最小化`
$+0.005(\sum_{e\in E^{特掃候補}} z_{e}^{over} )$`←負担ポイントをオーバーする人数を最小化`
$-10(\sum_{e\in E}\sum_{f\in F}\sum_{f'\in F} w_{e,f,f'} )$`←連続するフロアを担当する箇所を最大化`

なんか抜け漏れありそう・・・

### 出力解
（[GoogleColbo](https://blog.kikagaku.co.jp/google-colab-howto/),[Pulp](https://coin-or.github.io/pulp/)によるモデリング,ソルバーは無料のCBC）60秒で計算を止めて、その時点の暫定最適解を取り出せば使える解になっています。
清掃員の数を固定して計算させるなどいろいろ工夫の余地がありますが、現状問題なさそうなので目的関数にてんこ盛りです。目的変数の符号が揃っていないのも少し厄介なのですが、これも現状問題なさそうなので放置です。



# おわり
私が取り組んだ「ホテル客室清掃　割り振り」の事例紹介はここまです。
いかがだったでしょうか。<font color="LimeGreen">**ホテルの裏側では様々なことが考慮されて日々あなたの部屋が用意されている**</font>ことが分かったのではないでしょうか。また<font color="LimeGreen">**複雑な条件も定式化ができる。**</font>ということが伝わったかと思います。

<br>

ただ、私が本当に書きたかったのは<font color="LimeGreen">**「暗黙知」との戦い(方)**</font>です。この記事ではその暗黙知もとつらつら書いて（負担ポイントの概念など）それらを定式化していますが、実際にはこの暗黙知を取り出す作業が大変です。

<br>

負担ポイントの概念のほかに「フロア人数に関する制約」の背景には「リネン庫の渋滞」「ルームキーの枚数」「O清掃は全開錠して作業開始、S清掃は都度開錠して作業」「キーを持っている人を探すのは困難」など<font color="LimeGreen">**現場の人間でしか知りえない情報**</font>が隠れています。

しかし、これら事情は現場にとって無意識の常識となっています。そのため、ヒアリング内容や（プロタイプの）フィードバックコメントが<font color="LimeGreen">**明確に言語化されることは稀**</font>です。「なんか人が重なってるのヤだな」というコメントだったりします。（←？？？）

この「ヤだな」と感じる背景を深掘り、言語化し定式化できる言葉・条件に変換しなければなりません。そして、条件を列挙するだけでなくその優先順位をも探らなければ、目的関数の係数はもちろん前後処理の内容、数理モデルに取り込むか否か、も決めることはできません。



:::note info
伝わってほしいこと
・客室割り振りは複雑な条件のもと行われている
・複雑な条件も定式化ができること
残ってほしい疑問
・どうやって条件を見つけた（現場から抽出した）のか
・どうしてそのような定式化したのか
:::

# 次の記事で書く
次の記事で、今回紹介したホテル客室清掃割り振り業務における<font color="LimeGreen">**暗黙知との戦い方（暗黙知がどんな表現で現れ、どんなふうに戦ってきたか、どう戦うべきか）**</font>をこの事例をもとに具体的に共有しようと思います。
次回予告（変わるかも）
・あいまいな表現の暗黙知
・暗黙知の分類
・暗黙知を形式知に変換するためには
・形式知の定式化
・計算時間の工夫（前処理、数理モデル、後処理）

↓いずれここら辺に続きの記事リンクが出現する
LINK HERE

それまでおすすめの数理最適化書籍のリンク張っておきます。
全部をしっかり読み込めているわけではないですが。。。

https://www.ohmsha.co.jp/book/9784274227356/

https://www.kspub.co.jp/book/detail/5212707.html

https://www.kindaikagaku.co.jp/book_list/detail/9784764904330/



# 余談
今回紹介した「客室清掃の割り振り」の裏側には<font color="LimeGreen">**「宿泊客の客室割り振り」**</font>と<font color="LimeGreen">**「清掃員のシフトスケジュールリング」**</font>が存在しており、それぞれの結果が「客室清掃の割り振り」の結果に影響を与えます。

（宿泊客への割り振りと清掃員のシフトに加えて）清掃割り振り計画は「ホテルの客室在庫管理」という側面もあり、販売不可能な客室があると予約を受けることができず機会損失につながります。加えて、ゲストのクレームや満足度が口コミにダイレクトに響き、それらはホテルの稼働に影響を与えるのでめぐりズムですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823518/d1f33c40-bc18-0a07-27f6-9c33cc0de521.png)
<font color="Gray",size="1">※ダイナミックプライシングは一ミリも知らない。面白そう。
※予約予測タスクはうちの会社でも僕が入社する前にやってたらしいけどコロナで作ったモデルが使えなくなった模様。
※宿泊客への客室割り振りタスクは私が入社した時にはツールがあった。
※シフトスケジューリングは自分用にモデリングフォーマットを作成したので高速に最適化モデルを作成可能になった。使ってもらってる。</font>

https://www.kao.co.jp/megrhythm/



最後まで読んでいただきありがとうございます。
この記事が誰かの参考になれば幸いです。