S4で始める強化学習(第8回)在庫管理問題で使ってみる

NTTデータ数理システム MSIISM Conference 2024 NTTデータ数理システム MSIISM Conference 2024
  • HOME
  • S4で始める強化学習(第8回)在庫管理問題で使ってみる

本記事は当社が発行しているシミュレーションメールマガジンVol. 14の記事です。 シミュレーションメールマガジンの詳細・購読申込はこちらのサポートページから

はじめに

S4 で強化学習を使ったシミュレーションモデルを作成してみようという講座の8回目の記事になります。 今回からシミュレーション&マイニング部の西畑が担当します。よろしくお願いいたします。

第1回から第7回までで、S4で強化学習を行うための基本的な知識についてお伝えしてきました。 第8回からは、これまでの記事の内容を使いながら、よくある課題を例に強化学習を適用して理解を深めていきたいと思います。

在庫管理問題とは

客に対して商品を販売する小売店を考えます。小売店は在庫を持ち、商品が足りなくなる前によいタイミングで上流の業者に発注をかけ、在庫の補充をする必要があります。在庫補充のタイミングが遅れると商品の提供ができず、販売機会の損失となります。在庫には管理費がかかり、多くの在庫を抱えすぎると管理コストが負担になります。

在庫管理問題はよく知られた問題であり、さまざまなアプローチが検討されています。ここでは強化学習を使って在庫管理問題を考えてみたいと思います。

今回は次のような設定の在庫管理問題を考えます。

  • 小売店には毎日確率的に客から注文が入る[1]。小売店の在庫が足りなくなるとただちに失注し、顧客損失となる。
  • 小売店は毎日在庫と発注済みの製品量を確認し、どの程度上流に発注をかけるか決定する。注文された製品は2日後に在庫に補充される。
  • 小売店の在庫管理には毎日在庫の量に応じてコストが発生する。
  • 実際には配送コストなども考える必要がありますが、問題を簡単にするためにここでは省略します。以上の設定で、小売店が上流に発注をかけるタイミングを強化学習によって学習させてみましょう。学習方法はおなじみのQ学習としました。

    強化学習で設定するのは、毎日の上流への発注量です。観測する量は倉庫の在庫量とすでに上流に発注済で到着を待っている製品数(到着待ち製品数)です。ただし、強化学習で観測する状態数が大きくなりすぎないように、製品数を4で割り、例えば0-3個はすべて同じ状態としてみなすように観測値を計算させています。また、同じ理由で観測可能な製品数の上限も定めており、今回であれば16個以上の製品数はすべて同じ状態として観測されます。

    即時報酬としては、毎日の売り上げから商品発注コスト・在庫管理コストを引いたものを与えます。設定する発注の量は、4個単位で0, 4, 8, 12, 16個のいずれかとします。(したがって、到着待ち製品数に対応する観測値が1の時は到着待ち製品数の値は正確に4個となります。)

    • 簡単のため、毎日需要量として3,4,5個のいずれかが等確率に選ばれるものとしました。
    • S4で実行

      このモデルをS4で実装した例をこちらからダウンロードいただけます。S4をお持ちの方は.s4ファイルをS4の画面上にドラッグ&ドロップしてプロジェクトをインポートしてみてください。

      シミュレーション20000日分回す設定になっているため、シミュレーションの実行にはある程度時間がかかります[1]

      シミュレーションの実行後、「累積利益推移」と書かれているグラフ部品をクリックすると累積利益の推移を見ることができます。少しわかりにくいですが5000日手前あたりにグラフの傾きが急になる箇所があり、途中から効率よく利益を獲得できていることが分かります。

      累積利益推移

      「累積顧客損失推移」と書かれているグラフ部品をクリックすると、累積顧客損失の推移を見ることができます。こちらは途中から明らかにグラフの傾きが小さくなり、顧客損失を減らすように学習できていることがわかります。

      累積顧客損失推移

      S4 で始める強化学習(第4回)エージェントシミュレーションで使ってみるで行ったように、学習によって得られた行動価値関数も確認してみましょう。編集画面左のブラウザのワークスペースから「在庫管理(強化学習)」プロジェクトの出力以下にある「エージェント用強化学習モデル-学習モデル」を右クリックし、「学習モデルを閲覧する」を選択します。設定タブ右下の計算ボタンをすことで行動価値関数が表示されます。[1]

      表のままだと分析も難しいので、前回と同じようにこちらも可視化してみてみましょう。この表には、現在の2つの観測値(在庫量、到着待ち製品数)と行動値(発注する量)の3つの値があります。前回の崖歩きモデルの際は「隣のマスに移動する」という行動だったので上手に可視化できていましたが、今回はそううまくはいきません。今回は一つの方法として、「貪欲な選択肢」のみをヒートマップのように表示してみました。

      行動価値に基づく貪欲な行動のヒートマップ

      横軸に到着待ち製品数、縦軸に在庫数が表示されています。各マスは対応する値が観測された場合に「最も価値が高い発注数」に応じた色で塗られています。例えば、到着待ち製品数が0個、在庫が0-3個の場合を表す左下のマスは赤く表示されており、これは最も行動価値が高い行動が(他の場合に比べて比較的大きめな)12個の注文であることを意味します。在庫が4-7個、到着待ち製品数が4個の時は薄い色になっており、注文しないというのが最も行動価値が高い、ということを意味しています。

      上の図は、このs4プロジェクト上で確認することができるようになっています。確認方法は以下の通りです。

      先ほど確認した強化学習モデルビューアの行動価値関数の結果タブの下の方の「モニタとして出力」ボタンを押して、モニタの名前を「行動価値」と設定し、モニタとして出力させます。(この時点で強化学習モデルビューアは閉じて構いません。)メインのエディタ上で右クリックし、分析スクリプトを開始するからshow_RLresultを選択します。すると、上のような「行動価値に基づく発注数」という図と「強化学習履歴カウント」という図の2つが表示されるはずです[3]

      2つ目の図「強化学習履歴カウント」についてもご説明します。こちらは、先ほどと同じ横軸、縦軸が設定されており、各マスには「シミュレーション中にその値を観測した回数」を表示しています。どのぐらいの在庫量が保持されていたのかということがこのカウントを見ると把握できます。例えば今回のシミュレーションでは、在庫数が0-3個、到着待ち製品数が4個の状態が最も観測されており、在庫数が0-7個、到着待ち製品数が4個の状態が定常的になるように学習されたことが分かります。また、この図を見ることでシミュレーション中あまり訪れることのなかった状態についても把握できます。色の薄いマスにあたる観測値の行動価値はあまり更新されていないと考えられるため、行動価値への信頼度も低くなっています。例えば、在庫数が4-7個、到着待ち製品数が8個の状況で最も価値が高い行動は12個の注文でしたが、実際にはこの状態はあまり訪れられておらず、行動価値があまり更新されていないため、本来学習されるべき行動価値の値に十分近づいていないと考えられます。

      強化学習履歴カウント

      • 私の手元の環境ではおよそ2-3分で実行されました。実行環境のCPUは13th Gen Intel Core i5 (基本速度: 3.50 GHz), メモリは32GB, OSはWindows 10 Proとなっています。
      • 行動価値関数の表の観測値(B)は在庫の量を表していますが、実際には在庫の量を4で割った値が観測値になっていることにご注意ください。観測値(w)は到着待ち製品数、行動値は発注数を表しますが、いずれも同じように4で割った値で表示されています。
      • 図が2枚重なって表示されていることがあります。1枚しか表示されないように見える場合は図が表示されているウィンドウ位置をずらしてみてください。
      • おわりに

        今回行ったのは離散イベントシミュレーションですが、以前の待ち行列モデルと比べて複雑になっていることが分かるかと思います。本題の強化学習とは少し外れる部分もありますが、次回はこのモデルの作成について解説していきます。離散イベントシミュレーションのモデリングをする際に参考にしていただけるようなモデルとなっておりますので、ぜひご確認ください。

        監修:株式会社NTTデータ数理システム 機械学習、統計解析、数理計画、シミュレーションなどの数理科学を 背景とした技術を活用し、業種・テーマを問わず幅広く仕事をしています。
        http://www.msi.co.jp NTTデータ数理システムができること
    「数理科学の基礎知識」e-book無料ダウンロードはこちら