commit cf58824 病院:職員の動き方を持ち場ごとの型と用事の表にした・ほかの階の職員を3つに分けた・清掃と警備の人を足した(依頼157 の前) diff --git a/tools/hospital_sim/README.md b/tools/hospital_sim/README.md index ec540a5..7c26407 100644 --- a/tools/hospital_sim/README.md +++ b/tools/hospital_sim/README.md @@ -70,3 +70,11 @@ Unity 依頼134 で、外来の混む時間は裏口の道で廊下の問題が エイイチの指摘(搬送ロボットは部屋の中にも入っていく前提)で、フロアの形を h1(`../hospital_layouts/hospital_h1.json`)に替えた。積む所・届け先は扉の前ではなく、部屋の中の台の前になり、道は部屋の中の分だけ延びる(緑 21→29m・青 86→100m・青の裏口 153→177m・赤 109→119m)。人が歩いて運ぶときも同じ台から台まで歩く。h1 は裏口の道(blue_back)も同じファイルに持つので、h0b は使わない。 `export_unity_params.py` は、4つの道(`routes_all`)と、1台が全部の道を回すときの便の時刻表(`day_schedule.trips_all`)も書き出す。 + +## 職員の動き方を持ち場ごとの型にした(2026-11-12) + +依頼155 の記録で、職員が全員同じ決まり(1人が1時間に1回、同じ役割の持ち場からくじ引きで行き先を選ぶ)で科をまたいで動き、ロボットの問題の相手の約6割が職員だった。エイイチと決めて、`people_flow.staff_moves` を持ち場ごとの型(1 持ち場の中だけ/2 決まった相手先と行き来/3 患者に付いて動く/4 フロアを回る)と用事の表に替えた。型2 の頻度は新しく決めず、試算の便と人が運ぶ回につなぐ。 +- `hospital_sim.py` は人が歩いて運んだ回を `walk_log` に記録する(記録だけで、結果は変わらない)。`export_unity_params.py` はロボット1台のときの時刻表を `day_schedule.staff_walks_all` に書き出す +- `people_flow.elevator_traffic` のほかの階の職員を、運ぶ人・通り抜ける人・用事で来る医師に分けた(3:5:2。仮置き) +- `people_flow.cleaning_security` を足した(清掃の人2人・警備の人2人。仮置き) +- 分け方と用事の台帳は iCloud の `hospital/staff_classification.md` diff --git a/tools/hospital_sim/assumptions.json b/tools/hospital_sim/assumptions.json index c95627c..03cfe4e 100644 --- a/tools/hospital_sim/assumptions.json +++ b/tools/hospital_sim/assumptions.json @@ -1052,23 +1052,169 @@ "basis": "仮置き", "source": "hospital_staff(病院全体)× 日中にいる割合 0.75 のうち、この階の仕事の分を持ち場に割り当てた。医師は診察室1つに1人と、救急・内視鏡・化学療法・生理検査。看護師は医療法の外来の標準(外来患者30人に1人。この階の外来・化学療法・救急で約430人→15人以上)を下回らないように持ち場に置いた(33人。病院全体の日中約500人の約7%)。薬剤師は薬剤部が病院全体の調剤をするので多く置いた(日中約36人のうち、病棟に出ている分を除いた20人。医療法の外来の処方せん75枚に1人も満たす)。臨床検査技師は日中約43人のうち、病理・細菌など別の階を除いた27人。事務職員は日中約115人のうち、受付・会計・医事の38人。外来化学療法は施設基準『専任の医師・看護師または薬剤師が常時1人以上』を満たす", "n": null, - "updated": "2026-11-10", + "updated": "2026-11-12", "range": [ 0.7, 1.3 ], - "note": "合計 141人。役割の当てはめ:看護業務補助者は看護師、診療放射線技師は検査技師、事務職員は事務の access を使う" + "note": "合計 141人。役割の当てはめ:看護業務補助者は看護師、診療放射線技師は検査技師、事務職員は事務の access を使う。2026-11-12:動き方は持ち場ごとに staff_moves の型で決める。診療放射線技師は、入れる所は検査技師の access を使うが、動き方は別(X線室の中だけ)" }, "staff_moves": { "value": { - "持ち場の中": "いつも", - "職員の廊下を通る(1人あたり)": "1時間に1回", - "中待合へ患者を呼びに出る(看護師)": "診察1回ごと", - "ふだんの行き先": "持ち場の所だけ。付き添い・通り抜けのために『入る』にした所(化学療法・生理検査・救急の処置の場所・X線室など)へは、ふだんの行き来では行かない" + "型": { + "1": "持ち場の中だけ(部屋から出ない)", + "2": "決まった相手先と行き来(用事と行き先が決まっている)", + "3": "患者に付いて動く(中待合へ呼びに出る・検査へ付き添う。依頼154 までの動きのまま)", + "4": "フロアを回る・通り抜ける" + }, + "持ち場ごと": [ + { + "no": 1, + "role": "医師", + "post": "内科の診察室・ほかの外来の診察室", + "n": 13, + "type": 1 + }, + { + "no": 2, + "role": "医師", + "post": "内視鏡室・外来化学療法室・生理検査の検査室", + "n": 4, + "type": 1 + }, + { + "no": 3, + "role": "医師", + "post": "救急室", + "n": 2, + "type": 1 + }, + { + "no": 4, + "role": "看護師", + "post": "内科(中待合・診察室)・ほかの外来(中待合・診察室)", + "n": 14, + "type": 3, + "errand": "診察1回ごとに中待合へ患者を呼びに出る。処置・検査室、内視鏡室へ付き添う(案A)" + }, + { + "no": 5, + "role": "看護師", + "post": "ほかの外来の処置・検査室、内視鏡室・回復室", + "n": 6, + "type": 1 + }, + { + "no": 6, + "role": "看護師", + "post": "内科の処置室", + "n": 4, + "type": 2, + "errand": "青の便ごとに1人が処置室の中の台でロボットに積む(load_s)。部屋から出ない" + }, + { + "no": 7, + "role": "看護師", + "post": "外来化学療法室", + "n": 5, + "type": 2, + "errand": "赤の便が着くたびに1人が受付の台で受け取る(pickup_wait_s のあと unload_s)。部屋から出ない" + }, + { + "no": 8, + "role": "看護師", + "post": "救急室", + "n": 4, + "type": 2, + "errand": "緑の便ごとに1人が救急室の中の台でロボットに積む(load_s)。部屋から出ない" + }, + { + "no": 9, + "role": "看護業務補助者", + "post": "内科の処置室・器材室、救急室", + "n": 2, + "type": 2, + "errand": "ロボットが運ばない依頼を歩いて運ぶ。時刻と道は staff_walks_all(試算の決まり:至急の依頼が出たとき、その出発地に空いているロボットがいなければ人が運ぶ)。積む所で受け取り、届け先で渡し(staff_handoff_s)、持ち場へ戻る。薬剤部と中央検査室には入らず、払い出し口・検体受付の扉の所で受け渡す。2人のうち手の空いている方が行く" + }, + { + "no": 10, + "role": "薬剤師", + "post": "薬剤部", + "n": 14, + "type": 1, + "errand": "赤の便ごとに1人が払い出し台でロボットに積む(load_s)。人が運ぶ回は払い出し口で渡す" + }, + { + "no": 11, + "role": "薬剤師", + "post": "薬剤部の無菌調製室", + "n": 4, + "type": 1 + }, + { + "no": 12, + "role": "薬剤師", + "post": "お薬の窓口の内側", + "n": 2, + "type": 1 + }, + { + "no": 13, + "role": "臨床検査技師", + "post": "中央検査室", + "n": 15, + "type": 1, + "errand": "緑・青の便が着くたびに1人が検体受付の台で受け取る(pickup_wait_s のあと unload_s)。人が運ぶ回は検体受付で受け取る" + }, + { + "no": 14, + "role": "臨床検査技師", + "post": "生理検査の検査室", + "n": 8, + "type": 1 + }, + { + "no": 15, + "role": "臨床検査技師", + "post": "内科の処置室(採血)", + "n": 4, + "type": 1 + }, + { + "no": 16, + "role": "診療放射線技師", + "post": "X線室", + "n": 2, + "type": 1 + }, + { + "no": 17, + "role": "事務職員", + "post": "総合受付・会計・各科の受付", + "n": 16, + "type": 1 + }, + { + "no": 18, + "role": "事務職員", + "post": "医事・事務", + "n": 20, + "type": 1 + }, + { + "no": 19, + "role": "事務職員", + "post": "正面玄関の案内", + "n": 2, + "type": 4, + "errand": "正面玄関と総合受付の間を歩く(1人あたり1時間に2回・仮置き)。ふだんは正面玄関に立つ" + } + ], + "やめたこと": "依頼147〜155 の『持ち場から動く』(1人が1時間に1回、同じ役割の持ち場からくじ引きで行き先を選ぶ)は全部やめる" }, - "what": "職員が持ち場から動く頻度と、ふだんの行き先", + "what": "職員の動き方:持ち場ごとの型と用事", "basis": "仮置き", - "source": "根拠なし。職員の廊下の人の数は、これと依頼134 の職員通路の間隔(平均60秒)が近くなるか見て確かめる", + "source": "2026-11-12 エイイチ了承(分け方の表と用事の表。台帳は iCloud の hospital/staff_classification.md)。依頼155 の記録で、職員が全員同じ決まり(1時間に1回・くじ引き)で科をまたいで動き、ロボットの問題の相手の約6割が職員だったため。型2 の頻度は新しく決めず、試算の便と人が運ぶ回につないだ。慈恵医大柏病院の発表(DFA Robotics。https://prtimes.jp/main/html/rd/p/000000111.000028572.html):導入前は看護師・看護補助者が運び、看護師は補助者に電話で頼んでいた。薬剤部→外来化学療法室は補助員。外来の看護師・補助者が1日に何回運ぶかの公開の数字は見つからなかった", "n": null, "updated": "2026-11-12" }, @@ -1150,19 +1296,56 @@ "per_hour": 30 }, "ほかの階の職員(エレベーター⇔職員の持ち場。大廊下を通る)": { - "per_hour": 20 + "per_hour": 20, + "split": { + "運ぶ人": { + "share": 0.3, + "what": "病棟の検体を検査部へ出す・薬剤部へ薬を取りに来る。エレベーター⇔検査部の検体受付/薬剤部の払い出し口(半々)。部屋には入らず扉の所で受け渡す(1〜2分)" + }, + "通り抜ける人": { + "share": 0.5, + "what": "出勤・昼・帰り・ほかの棟へ。エレベーター⇔正面玄関(大廊下を通る)" + }, + "用事で来る医師": { + "share": 0.2, + "what": "救急・内視鏡・検査へ呼ばれて来る。エレベーター⇔救急の処置の場所/内視鏡室/生理検査の検査室。5〜15分いて戻る" + } + } } }, "what": "エレベーターからこの階を通る人(1時間あたり。日中)", "basis": "仮置き", - "source": "根拠なし。ほかの階との行き来がなく、大廊下を通る人がいなかったため足した。面会の時間帯は多くの病院の『13時から』に合わせた", + "source": "根拠なし。ほかの階との行き来がなく、大廊下を通る人がいなかったため足した。面会の時間帯は多くの病院の『13時から』に合わせた。2026-11-12:ほかの階の職員を3つに分けた(割合 3:5:2 は根拠なしの仮置き。エイイチ了承)。依頼155 までは全員が持ち場に2〜3分立って戻るだけだった", "n": null, - "updated": "2026-11-11", + "updated": "2026-11-12", "range": [ 0.5, 1.5 ] }, + "cleaning_security": { + "value": { + "清掃の人": { + "n": 2, + "what": "7:30〜8:00 に外来の大廊下と待合を清掃する(清掃のカートを押して歩く。人が歩く速さの半分)。8:00 までに終える。日中はトイレ3か所(西・東・化学療法)の見回りとごみ集めを1日3回(10:00・13:00・15:30 ごろ。1か所5〜10分)。それ以外は場面にいない", + "access": "外来の患者と化学療法の患者の入れる所に入れる(座らない)", + "cart_m": { + "w": 0.6, + "d": 1.0 + } + }, + "警備の人": { + "n": 2, + "what": "1人は 8:00〜16:00 に正面玄関に立つ。もう1人は1時間に1回、外来の大廊下を端から端まで歩いて見回り、玄関へ戻る", + "access": "外来の患者の入れる所に入れる(座らない)" + } + }, + "what": "清掃の人・警備の人(職員141人とは別)", + "basis": "仮置き", + "source": "2026-11-12 エイイチ:清掃や警備の人も入れる。加古川中央市民病院(600床)の清掃業務委託仕様書(https://www.kakohp.jp/wp-content/uploads/02_76_setumeisyo.pdf):外来部門と通路は外来の受付が始まる 8:00 までに清掃を終える・外来の廊下 1回/日・共用トイレ 3〜8回/日(表が崩れていて回数は確かでない)・清掃用カートを使う。同病院の警備業務仕様書(https://www.kakohp.jp/wp-content/uploads/03_jigyosya_193_ojfs851vglk_siyousyo3.pdf):立つ人は 8〜11時が最多、院内の見回りの回数は書かれていない。見回り1時間に1回は市川市急病診療所の警備業務仕様書(https://www.city.ichikawa.lg.jp/common/pub01/file/0000485676.pdf)。人数(2人ずつ)・トイレ1日3回・カートの大きさは根拠なし", + "n": null, + "updated": "2026-11-12" + }, "unity_only_147": { "value": "依頼147 で Unity が決めた値(開いた上の端は下の端の2倍、救急の滞在の分け方、化学療法の患者の行き先の順、職員の持ち場の当て方、職員が動く間とどまる時間)", "what": "Unity だけの値", diff --git a/tools/hospital_sim/export_unity_params.py b/tools/hospital_sim/export_unity_params.py index 252248a..50ba11e 100644 --- a/tools/hospital_sim/export_unity_params.py +++ b/tools/hospital_sim/export_unity_params.py @@ -30,8 +30,13 @@ def day_schedule(A): out["plans"][plan][str(sp)].append([{"depart": t["depart_s"], "from": t["from"]} for t in d.trip_log if t["route"] == "blue"]) out.setdefault("trips_all", {}).setdefault(plan, {}).setdefault(str(sp), []).append( [{"route": t["route"], "depart": t["depart_s"], "from": t["from"]} for t in d.trip_log]) + out.setdefault("staff_walks_all", {}).setdefault(plan, {}).setdefault(str(sp), []).append( + [{"route": t["route"], "depart": t["depart_s"], "from": t["from"], "to": t["to"]} for t in d.walk_log]) out["trips_all_what"] = ("1台のロボットが緑・青・赤の全部を回すときの便の時刻表(h3 から)。plan × 速さ × 種。" "route は green/blue/red、from は積む所。道は routes_all を使う") + out["staff_walks_all_what"] = ("ロボット1台のとき、人(看護業務補助者)が歩いて運ぶ回の時刻表(試算の決まり:至急の依頼が出たとき、" + "その出発地に空いているロボットがいなければ人が運ぶ)。plan × 速さ × 種。depart は 7:30 からの秒。" + "from で受け取り、to へ歩いて渡し、持ち場へ戻る。2026-11-12 職員の用事の表(people_flow.staff_moves)で使う") return out diff --git a/tools/hospital_sim/hospital_sim.py b/tools/hospital_sim/hospital_sim.py index 7f35061..c1b8789 100644 --- a/tools/hospital_sim/hospital_sim.py +++ b/tools/hospital_sim/hospital_sim.py @@ -126,6 +126,7 @@ class Day: self.L = json.loads((HERE / "../hospital_layouts/hospital_h0b.json").read_text(encoding="utf-8")) self.back_hours = [(hm(a) - self.day0, hm(b) - self.day0) for a, b in self.r.get("back_door_hours", [])] self.trip_log = [] # ロボットの便(Unity に渡す時刻表) + self.walk_log = [] # 人が歩いて運んだ回(Unity に渡す時刻表。記録だけで、結果は変えない) def robot_from(self, k, t): """ロボットが積む所。青だけ、決め方により裏口になる。人が歩くときはいつも表(routes の from_point)""" @@ -169,6 +170,8 @@ class Day: d = self.route_dist(k) v = self.c["staff_speed"] extra = self.c["staff_extra_s"] + self.walk_log.append({"route": k, "depart_s": round(self.env.now, 1), "from": self.routes[k]["from_point"], + "to": self.routes[k]["to_point"], "items": len(items)}) yield self.env.timeout(d / v + extra + self.c["staff_handoff_s"]) for q in items: self.finish(q, "staff")