🔨

Google AI StudioとGoogle Colabではじめる数理最適化

に公開

春だ!みんなでハンズオン祭り2025

こちらイベント向けの資料です

自己紹介

  • 直近はデータエンジニアリング系の経験も

1. できるようになること

  • 複雑な条件を満たすシフトを一瞬で作るコードが動く
  • 有能バイトくんになれます

2. 前提

  • 最低限
    • pythonを使ったことある
    • チャット型LLMサービスを使ったことある
    • Google アカウントもってる
  • なお可
    • Google AI Studioを使ったことがある
    • Google Colaboratoryを使ったことがある

3. 問題設定

  • バイト先の店長がシフト作成に毎週苦しんでる!
    • 従業員の希望に沿わないと辞められちゃう!
    • 資格有無・経験で時給が違うので、いい感じに組んで費用は最小限にしたい!
  • 追加情報
    • 従業員ごとにシフト希望日がある
    • 従業員ごとに資格有無があり、日ごとに資格保有者を確保する
    • 経験がある従業員を日ごとに確保する

4. 手法の概要

  • 広い状況で組合せを高速に探索する技術、数理最適化を使います
  • パッケージは1個入れるだけ!
  • 入力・出力はすべてエクセルを想定します。
  • 上記をLLM先生に伝えてコードを書いてもらいます。

5. 作業の流れ

  1. Drive, Colaboratory, AI Studioの準備をします。
  2. AI Studioにプロンプトを入力して、コードを生成させます。
  3. Colaboratoryにコードを貼り付けて実行します。
  4. 出力結果を確認します。

6. ハンズオン

6.1 Google Driveの準備

  1. ↗︎教材にアクセスして3エクセルをダウンロードする
    • 00_希望テーブル.xlsx
    • 01_従業員情報テーブル.xlsx
    • 02_必要要員テーブル.xlsx
  2. ↗︎自分のgoogle driveを開いて任意の場所にフォルダを作成する
  3. さっきダウンロードしたエクセルをフォルダにアップロードする

6.2 Google Colaboratoryの準備

  1. Colaboratoryが入っているか確認する
  2. 入ってない場合は「アプリを追加」から「Colaboratory」を検索
  3. Colaboratoryをフォルダ下に作成する

6.3 Google AI Studioの準備

  1. ↗︎Google AI Studioにアクセスして開く
  2. システムプロンプトを入力します
- あなたはシフト最適化を専門とする優秀な数理最適化エンジニアで、言語はpython、ソルバーはpulpを使い、Google DriveにマウントされたGoogle Colaboratoryで実行できるコードを提供する責任を負っています。
- あなたが必要な場合は質問を実施して情報を補完し、正確でシンプルなコードを提供しないと、クライアントはシフトを作成することができず、たくさんの従業員が仕事に入ることができず、クライアントの会社は即座に破産してしまいます。
- pulpはインストールされてないので`!pip install pulp`を冒頭に記述してください。pandas.DataFrameの`append`メソッドは使わず、代わりにpd.concatを使ってください。

下記のように入力

6.4 コードの作成

必要な情報を伝えてコードの作成します。下記のような構成です。

  • 依頼内容
  • 問題設定
  • 諸条件
  • 入力ファイルの情報
  • 出力ファイルの情報

プロンプト全文は以下です。展開してコピーしてください。

プロンプト
# 依頼内容

「背景」を参考にし、「入力ファイル」と「出力ファイル」のフォルダパスをクライアントが書き換えると、「出力ファイル」が出力されるコードを示してほしい。Colaboratoryの実行場所と、入力ファイルと同じフォルダ直下です。出力ファイルの出力先も同じフォルダ直下にしてください。

# 背景

- 下記のようなシフトが欲しい。
    - 従業員の希望を常に満たす。
    - 資格有無・経験で時給が違うので、いい感じに組んで費用は最小限にしたい。

# 入力ファイル

- 00_希望テーブル.xlsx
    - Sheet1だけ含みます。
    - `ID`列の後に、`yyyy/mm/dd`の形で日付の列が続きます。
    - すべての列で欠損値はありません。
    - 列の詳細
        - ID (整数) : 従業員に一意に結びつく文字列です。
        - 2025/4/1 (整数) : この日付を従業員が希望しないなら0, 従業員が希望するなら1。
        - ...
        - 2025/4/15 (整数) : この日付を従業員が希望しないなら0, 従業員が希望するなら1。
- 01_従業員情報テーブル.xlsx
    - Sheet1だけ含みます。
    - すべての列で欠損値はありません。
    - 列の詳細
        - ID (文字列) : 従業員に一意に結びつく文字列です。
        - 資格1 (整数) : 資格1を保有なら`0`, 資格1を保有なら`1`。
        - 資格2 (整数) : 資格2を保有なら`0`, 資格2を保有なら`1`。
        - 経験年数 (整数) : 継続して勤務している期間。長いほどスキルが高い。
        - 日給(円) (整数) : 勤務した場合に支給される給料。
- 02_必要要員テーブル.xlsx
    - Sheet1だけ含みます。
    - すべての列で欠損値はありません。
    - 列の詳細
        - 日付 (文字列) : yyyy/mm/dd。2025/4/1 〜 2025/4/15 が含まれます。
        - 資格1保有最低人数 (整数) : その日付に必要な資格1の最低人数。
        - 資格2保有最低人数 (整数) : その日付に必要な資格1の最低人数。
        - 経験年数1年以上最低人数 (整数) : その日付に必要な経験年数1年以上の最低人数。
        - 経験年数4年以上最低人数 (整数) : その日付に必要な経験年数4年以上の最低人数。

# 出力ファイル
- 03_最適化されたシフト.xlsx
    - Sheet1だけ含みます。
    - `ID`列の後に、`yyyy/mm/dd`の形で日付の列が続きます。
    - 入力ファイルの`00_希望テーブル.xlsx`と同じ期間の日付が列としてあります。
    - すべての列で欠損値はありません。
    - 列の詳細
        - ID (整数) : 従業員に一意に結びつく文字列です。
        - 2025/4/1 (整数) : この日付を従業員に勤務させるなら`0`, 従業員が勤務させないなら`1`。
        - ...
        - 2025/4/15 (整数) : この日付を従業員に勤務させるなら`0`, 従業員が勤務させないなら`1`。

実行中の様子

6.5 テスト

  • 先ほど作成したColaboraotryに、生成させたコードをコピペします。

  • 上部タブ > ランタイム > すべて実行
  • 途中ドライブのマウントの許諾を問われることがあります。接続する旨の選択肢で回答してください。

  • エラーが出た場合

    • エラー文を確認します。短縮されている場合は展開します。
    • エラー部分をコピーして、先ほどコード生成したGoogle AI Studioのチャットに貼り付けて送信。
    • 修正されたコードをColaboratoryに貼り付け直して再度実行
  • Colaboratoryの例

6.6 応用例の紹介

  • 希望テーブル.xlsxの値を変えて試してみる。
    • 希望する日付によっては、実現可能な組合せが見つからずエラーを吐きます。
  • 従業員情報テーブル.xlsx資格3列を加えてみる。
    • 列を増やしていくと、探索対象の組合わせが見つからず動かなくなります。
  • 「いずれの日も最低4人は必要」という条件を加える。
    • プロンプトに含めます。

7. まとめ

  • AIに聞けば結構実装できる
  • もし顧客がGoogle Driveを使っていればすぐ試せる
  • シフトの調整作業(週2時間)削減、費用対効果の高い組合せによる人件費削減

メモ

  • 数理最適化警察の皆さん:ソルバーの範囲です

Discussion