1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python in Excel で数理最適化問題を解いてみる

Last updated at Posted at 2025-05-10

はじめに

Python in Excelは,2023年3月にプレビュー版が発表され,2024年3月にGA(General Availability)として正式リリースされた機能である.この機能により,Excel上でPythonコードを直接実行できるようになった.従来はVBAや外部ツールを必要としていた数理最適化やデータ分析を,より柔軟に実装できるようになった.

本記事では,PuLPなどの外部ライブラリを使用せず,標準的なSciPyライブラリとNumPyによって,簡単な線形最適化問題をExcel上で解決する手法を紹介する.外部ライブラリを使用しない理由としては,現在のPython in ExcelがMicrosoft提供の標準ライブラリセットに制限されており,PuLPのような特殊なライブラリは自由にインストールできないためである.しかし,基本的な数理最適化であれば,すでに利用可能なSciPyライブラリで十分対応できることを本記事で示す.

なお,本記事で扱うような線形計画問題は,従来からExcelのソルバーアドインを使用して解くことも可能である.ソルバーはシンプルな問題を視覚的に解くには便利だが,Pythonを用いることで複雑なロジックの組み込みが可能になり,大規模な問題や繰り返し計算が必要なケースでより柔軟に対応できる利点がある.

問題設定

以下のような最適化問題を想定する.

  • 目的関数:コストの最小化
  • 制約条件:特定の制約を満たす選択肢(バイナリ変数)を選ぶ
  • バイナリ変数:選ぶか選ばないかを0か1で表現する

Excel上では以下のように設定される(画像参照):

image.png

  • セルD5:G5:コスト
  • セルD9:G12:制約係数行列
  • セルI9:I12:制約の上限値

Python in Excelの準備

  1. Excelの「数式」タブ → 「Pythonエディター」を開く
  2. 以下のライブラリをインポートする:
import numpy as np
import pandas as pd
from scipy.optimize import linprog

Pythonスクリプトの構成

以下に示すのは,Excelのセルから読み取ったデータをもとに最適解を求めるコードである.バイナリ変数を用いており,まず連続変数として解いた後にバイナリに丸め,制約を満たすように調整を行う.

# Excelからデータを取得
c_values = np.array(excel("D5:G5")).flatten()
A_values = np.array(excel("D9:G12"))
b_values = np.array(excel("I9:I12")).flatten()

# 線形計画法で連続変数として最適化
result = linprog(c_values, A_ub=A_values, b_ub=b_values, bounds=(0, None), method='highs')
continuous_x = result.x

# バイナリに丸める
best_x = np.round(continuous_x).astype(int)

# 制約違反がある場合の調整
while np.any(A_values.dot(best_x) > b_values):
    violated = np.where(A_values.dot(best_x) > b_values)[0][0]
    impacts = [(i, A_values[violated, i]) for i in range(len(best_x)) if best_x[i] == 1]
    impacts.sort(reverse=True)
    for i, _ in impacts:
        best_x[i] = 0
        if np.all(A_values.dot(best_x) <= b_values):
            break

# 最適解のみを返す(シンプルなリスト形式)
best_x.reshape(1, -1)  # 1行×N列の横向き配列に変換

最終行をbest_x.reshape(1, -1)としている理由は,計算結果をExcelのセル範囲(例:D3:G3)に直接返すためである.これにより,最適化で得られた0/1のバイナリ値を横一列のセルに表示することができ,Excelでの可視化や後続の計算に利用しやすくなる.

image.png

クラウドのウェアハウスとの連携の可能性

Python in Excelの現状では,外部ライブラリやドライバのインストールに制限があるため,Snowflakeや Microsoft Fabricなどのクラウドサービスと直接連携することはまだ難しい.しかし,今後のアップデートでは,以下のような連携が期待される:

  1. Microsoftエコシステムとの連携強化
    Microsoft Fabricや Azure Synapse Analyticsとの統合が進み,Python in Excelから直接これらのサービスにアクセスできるようになる可能性がある.

  2. サードパーティのデータサービス連携
    Snowflakeなどの主要なデータプラットフォーム用のコネクタがPython in Excelの標準ライブラリとして追加される可能性がある.

  3. カスタムパッケージのサポート
    将来的には,独自のPythonパッケージをインストールする機能が追加され,必要なコネクタライブラリを自由に使えるようになることが期待される.

これらの機能が実装されれば,Excel上での最適化計算結果を直接クラウドのウェアハウスにデータを送信し,データ分析パイプラインの一部として組み込むことが可能となる.

おわりに

Python in Excelは,これまで表計算ツールとして利用されていたExcelに,より柔軟な数値計算・最適化を行えるようになる.

本記事ではPuLPやOR-Toolsのような最適化ライブラリを用いずに,標準的なSciPyライブラリのみで解法を示した.今後のアップデートにより,さらに高度なライブラリが利用可能になることが期待される.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?