RCSのタスクスケジューリングは、病院の救急トリアージ受付のようなものだと考えてください。患者(タスク)が次々と到着し、トリアージ看護師(スケジューラ)が重症度(優先度)によって誰を先に外傷室(ロボット)へ入れるか決めます。緊急レーンは本物の緊急事態のために存在します。しかし、どの家族も「うちが急ぎだ」と叫べば、トリアージは崩壊します。RCSタスク優先度の設定はまさにこの仕事をします。誰が先に乗り、誰が待つかを決めるのです。

仕組み:キュー、重み、ディスパッチサイクル

RCSはロボットフリートの頭脳です。100 msから約1秒ごとにディスパッチサイクルを実行します。待機中のすべてのタスクにスコアを付け、並べ替え、最高スコアのものを空きロボットに割り当てます。タスクのスコアはおおよそ次のようになります。

task score = priority weight × f(wait time, distance, battery, task type)

急ぎ注文のプリエンプションとは、文字通り「奪う」ことです。何を奪うのかに注意してください。列の中の場所ではなく、キャパシティです。ロボットの時間は固定されています。急ぎ注文が使う1分は、通常タスクが待つ1分です。

高速道路の料金所にたとえることもできます。ETCレーン(高優先度)が先に進み、現金レーン(通常タスク)が並びます。しかし、ETCレーンを増やし続けることはできません。すべてのレーンをETCにすれば、誰も列を抜かせなくなります。それでも料金所は渋滞します。優先度は、希少であるときにのみ意味を持つのです。

式のf()をもう少し詳しく見てみましょう。待機時間は「永遠に待つ」ことを防ぎ、距離は最も近いロボットを選び、バッテリーは充電量の少ない機体を除外し、タスク種別は搬送・昇降・充電の作業を区別します。10分待ったP2タスクは、エージングが働き始めれば、到着したばかりのP1を上回ることがあります。それこそがエージングの存在意義であり、多くの人が何気なく無効化し、後で最も後悔する設定でもあります。

プリエンプション設定の3つの方法と、それぞれのコスト

設定A:優先度重み付け。 急ぎ注文の優先度重みを上げるのです。たとえば通常タスクを5、急ぎ注文を50にします。パラメータは1つだけで、至って簡単です。コストは、上げすぎる(たとえば100)と低優先度タスクが決して処理されなくなることです。それがスタベーション(飢餓状態)であり、通常の波を死に追いやります。

設定B:プリエンプティブな再割り当て。 急ぎ注文が到着したら、低優先度タスクに取り組んでいるロボットを徴用します。中断されたタスクはロールバックして再びキューに入ります。最も速い応答です。コストは空走(デッドヘッド)です。中断された走行は無駄な走行距離であり、今度はもう一度走らなければなりません。

設定C:予備キャパシティ。 フリートの10–20%を通常の波から外し、急ぎ注文専用に確保します。最も安定した選択肢です。コストは閑散期の遊休キャパシティです。千日のために兵士を養い、一日の戦いに備えるようなものです。

設定 急ぎ対応 通常の波への影響 複雑さ 適している場合
A 重み付け 速い 上げすぎると波を壊す 低い 急ぎ比率が安定的に5%未満
B プリエンプション 最も速い 空走が増え、タスクのロールバックが発生 低い 第二レベルの対応を要するまれな急ぎ注文
C 予備キャパシティ 常に速い ほとんどなし 低い ピークが明確な変動する急ぎ比率

私が2025年に調整したプロジェクトの話です。中国東部のEコマース倉庫、180台のAMRです。急ぎ重みを50に設定しました。通常の急ぎ比率3%ではすべて順調でした。しかし、618ショッピングフェスティバルの当日、急ぎ注文は15%に急増し、通常タスクの平均待ち時間は50秒から4分に跳ね上がり、波の定時率は12ポイント低下しました。ログを見ると、低優先度タスクが47分待っていました。まさに教科書通りのスタベーションです。根本原因は、欠けていた部品が1つだけでした。重み付けは設定されていたが、エージングの仕組みがなかったのです。

3つの中からどう選ぶか。急ぎ比率を見てください。安定的に5%未満ならAを使います。安くて十分です。まれだが第二レベルの対応が必要な場合(生産ラインが止まりそうな場合)はBを使います。ピークが明確な変動型(大型セールイベント、四半期末)ならCを使います。ほとんどの倉庫は最終的にA+Cのハイブリッドに落ち着きます。通常日は重み付け、ピークの2週間前から予備キャパシティをオンにします。分かれ目は技術ではなく、ビジネスのリズムです。だからこそ、他の倉庫のパラメータをコピーした10人のうち9人は、結局ロールバックすることになるのです。

倉庫フロアで計画ルートに沿って走行するAMRフリートの俯瞰図

現場で検証済みのRCSタスク優先度設定:ティア、エージング、予備キャパシティ

ティア。 P0は本物の急ぎ(量の5%未満に抑える)/P1は優先波/P2は通常/P3は延期可能(補充、サイクルカウント)。何が「急ぎ」に当たるかの鉄則は、営業が急ぎだと言うことではなく、SLA期限がX時間以内に迫っていることです。営業が「このロットは急ぎだ」と言ったら、まず2つの質問をしてください。「SLAペナルティはいくらで、顧客を失いますか?」答えられなければP2行きです。ここで偽の要件が生まれます。私はそれを指摘することを決して遠慮しません。

エージング。 長く待ったタスクは自動的に昇格します。スタベーションを防ぐ下限です。

effective priority = base weight + factor × wait time / threshold

エージングがなければ、いくら美しく調整された重みでも時限爆弾です。通常日は静かでも、ピーク時には必ず爆発します。

予備キャパシティ。 ピークシーズンは15–20%、オフピークは5–10%で、急ぎ比率に応じて動的に調整します。ハードコードは決してしません。覚えておいてください。重みはキューの順序を変えるだけです。キャパシティを生み出すわけではありません。急ぎ比率が10%を超えても重みの調整だけを続けているなら、間違った道具を使っています。

メンテナンスの罠:一度設定して、永遠に苦しむ

罠1:一度調整して1年間運用する。 ピークシーズンになるとSKUミックスも波のリズムも変わるのに、重みは昨年のままです。優先度設定は波の計画に合わせるべきです。少なくとも四半期ごとにレビューし、ピーク前には必ず再調整します。

罠2:負荷なしでテストするので、スタベーションが決して現れない。 テストでは平均待ち時間しか見ません。平均は最も不誠実な指標です。重要な数字は、低優先度タスクの最大待ち時間です。それが上昇し始めたら、スタベーションが近づいています。

罠3:上限を超えた急ぎ比率に備えて構える。 急ぎ注文が長期的に量の10%を超え続けるなら、それはスケジューリングの問題ではなく、キャパシティの問題です。ロボットを増やすか、一部の「急ぎ」注文をP2に格下げしてください。スケジューラのパラメータでキャパシティの不足を補うことはできません。

罠4:誰でもP0を付けられるようにする。 優先度の最大の敵はパラメータではなく、人です。P0のマーキング権限は制限しなければなりません。誰が付けられるか、承認が必要か、そして真のP0比率の月次監査です。マーキングを開放したままにすれば、P0は3か月以内に20%を超えます。その後はいかなる調整もあなたを救いません。

では、優先度設定はやる価値があるのでしょうか。1組の数字を見てください。急ぎ注文の定時率が目標に達し、かつ通常タスクの平均待ち時間が横ばいであることです。両方とも真なら、設定は正しいです。片方だけ真なら、自分を騙していることになります。

Da Liu(自動化エンジニア)著

英語版からの翻訳。内容に相違がある場合は英語版を優先します。