--- /tmp/claude-0/-home-claude/2afc91f9-ca44-5f2d-a1f2-8ded1ee7eedd/scratchpad/v2_6/haizen_sim.py 2026-10-23 18:12:52.750476718 +0900 +++ /tmp/claude-0/-home-claude/2afc91f9-ca44-5f2d-a1f2-8ded1ee7eedd/scratchpad/v2_7/haizen_sim.py 2026-10-23 20:26:49.112509336 +0900 @@ -94,7 +94,8 @@ "warmup_min": 60, # 回るかの確かめで、数えない慣らしの時間(分) "util_sample_s": 10, # 手がふさがっている人数・台数を数える間隔(秒) "max_extra_min": 600, # 数える時間のあと、追いかけるのを打ち切る上限(分)。店が回らない条件の保険 - "model": "v2.4", # モデルの版(前の版の結果を使い回さないための印) + "robot_first_wait_s": 120, # v2.7 ロボット優先:料理はロボットを待つ。これだけ待っても来なければスタッフが運ぶ(秒) + "model": "v2.7", # モデルの版(前の版の結果を使い回さないための印) } # --------------------------------------------------------------- @@ -292,35 +293,46 @@ yield self.env.process(self.staff_job(0, d, p["rescue_s"])) # ---- 配膳 - # 料理ができたら、ロボットとスタッフのうち先に空いた方が運ぶ(同時ならロボット)。 + # v2.7 ロボット優先(2026-10-23 エイイチと決めた):料理ができたら、まずロボットを待つ。スタッフは料理を持たず、 + # ほかの仕事(案内・片付け・会計)を続ける。robot_first_wait_s(2分)待ってもロボットが空かなければ、 + # そこからはロボットとスタッフのうち先に空いた方が運ぶ(料理が冷める前の逃げ道)。 + # 割れ物を人が運ぶ設定(fragile_by=staff)と、ロボット0台のときは、今までどおりスタッフが運ぶ。 + # v2.6 までは、はじめから「先に空いた方」だったため、受け渡し口の横で待つスタッフが多く運んでいた。 # ロボットが出るときは、受け渡し口で待っている料理を段の数までまとめて載せ、近い卓から回る。 def deliver(self, d, fragile=False, counted=True): env, p = self.env, self.p rec = {"d": d, "ready": env.now, "fragile": fragile, "counted": counted, "taken": env.event(), "arrived": env.event()} robot_ok = self.robots is not None and not (fragile and p["fragile_by"] == "staff") - sreq = self.staff.request(priority=1) if not robot_ok: + sreq = self.staff.request(priority=1) yield sreq yield env.process(self._staff_carry(rec, sreq)) return rreq = self.robots.request(priority=0) - rec["sreq"], rec["rreq"] = sreq, rreq + rec["sreq"], rec["rreq"] = None, rreq self.pass_q.append(rec) - yield rreq | sreq | rec["taken"] + yield rreq | rec["taken"] | env.timeout(p["robot_first_wait_s"]) # まずロボットだけを待つ + if not (rreq.triggered or rec["taken"].triggered): # 2分たった:ここからはスタッフも運べる + sreq = self.staff.request(priority=1) + rec["sreq"] = sreq + yield rreq | sreq | rec["taken"] + sreq = rec["sreq"] if rec["taken"].triggered: # ほかの料理と一緒にロボットに載った yield rec["arrived"] return self.pass_q.remove(rec) if rreq.triggered: # ロボットが運ぶ - self._drop(sreq, self.staff) + if sreq is not None: + self._drop(sreq, self.staff) batch = [rec] for o in list(self.pass_q): if len(batch) >= p["trays"]: break self.pass_q.remove(o) self._drop(o["rreq"], self.robots) - self._drop(o["sreq"], self.staff) + if o["sreq"] is not None: + self._drop(o["sreq"], self.staff) o["taken"].succeed() batch.append(o) env.process(self._robot_run(batch, rreq))