「Pythonで複雑な最適化問題を解きたいけど、どのライブラリを使えばいいんだろう?」
「計算速度が重要になる大規模な問題を扱いたい」
こんな悩みを抱えていませんか?
本記事では、非線形最適化問題を効率的に解くための強力なツール「CasADi」について、基本的な概念から具体的な使い方まで分かりやすく解説します。
CasADiは「自動微分」という機能を備えており、最適化計算で必要になる勾配(微分)を高速かつ正確に計算できるのが大きな特徴です。
この記事を読めば、CasADiの魅力と便利さを理解し、あなたの問題解決に役立てられるようになります。
最適化計算ライブラリCasADiとは?
CasADi(カサディ)は、数値最適化のためのオープンソースのソフトウェアツールです。
特に、大規模で複雑な非線形最適化問題を得意としています。
もともとはC++で開発されていますが、PythonやMATLAB/Octaveから簡単に利用できるインターフェースが提供されており、多くのエンジニアや研究者に活用されています。
CasADiの最大の特徴は、記号計算の柔軟性と自動微分の計算効率を両立している点にあります。
数式を文字列ではなく「式(expression)」としてオブジェクトで扱えるため、複雑な計算式も直感的に組み立てることが可能です。
ロボットの最適制御や化学プロセスの設計、機械学習モデルのパラメータ最適化など、幅広い分野での応用が期待されています。
CasADiが持つ3つの強力な特徴
CasADiが他の最適化ライブラリと一線を画すのは、以下の3つの特徴があるからです。
これらが組み合わさることで、複雑な問題を効率的に解くことが可能になります。
記号変数の柔軟な定義
CasADiでは、数式を構築するための「記号変数」を扱います。
これには主にSXとMXの2種類があり、問題の特性に応じて使い分けることができます。
- SX (Scalar eXpression): スカラー(単一の数値)ベースの表現です。式の構造が単純で、比較的小さな問題に適しています。内部で式をグラフ構造として保持するため、演算の過程が分かりやすいのが特徴です。
- MX (Matrix eXpression): 行列ベースの表現です。行列演算が多用されるような、大規模でスパース(疎)な問題で高いパフォーマンスを発揮します。
どちらも同じように数式を組み立てられますが、大規模な問題ではMXの方がメモリ効率や計算速度の面で有利になる傾向があります。
初めのうちは、より直感的に扱いやすいSXから使ってみるのがおすすめです。
高速で正確な「自動微分」
最適化計算では、関数の勾配(各変数での微分)情報が不可欠です。
CasADiは「自動微分(Algorithmic Differentiation, AD)」という機能により、この勾配を高速かつ正確に計算します。
自動微分は、数値微分のように誤差を含まず、また手作業で数式を微分する(記号微分)ような手間もかかりません。
コンピューターの計算過程を記録し、その逆演算をたどることで、複雑な関数の微分値でも効率的に求められる優れた手法です。
この機能のおかげで、私たちは微分の計算をCasADiに任せ、問題の定式化に集中できます。
豊富な外部ソルバーとの連携
CasADi自体は、最適化問題を「記述する」ためのモデリングツールです。
実際に問題を「解く」のは、IPOPTやqpOASES、OSQPといった外部の最適化ソルバーの役割です。
CasADiはこれらの多くの有名なソルバーへのインターフェースを提供しており、問題の種類(非線形計画問題、二次計画問題など)に応じて最適なソルバーを簡単に切り替えることができます。
特に、非線形計画問題で広く使われている「IPOPT」との連携は強力で、多くのユーザーに利用されています。
これにより、問題のモデリングと求解が明確に分離され、高い柔軟性が確保されています。
PythonでCasADiを始めるための環境構築
CasADiをPythonで使うための準備は非常に簡単です。
pipコマンドを使えば、必要なパッケージをまとめてインストールできます。
ターミナルやコマンドプロンプトで、以下のコマンドを実行してください。
pip install casadi
これだけでCasADi本体のインストールは完了です。
CasADiのPythonパッケージには、多くの一般的な環境向けに主要な非線形ソルバーであるIPOPTのバイナリが同梱されているため、追加のインストールなしで利用を開始できる場合がほとんどです。
もしソルバーに関するImportErrorなどが発生した場合は、公式サイトの情報を参考に、別途ソルバーのインストールが必要になることもあります。
CasADiによる非線形最適化の基本コード
それでは、実際に簡単な非線形最適化問題をCasADiで解いてみましょう。
ここでは、以下の問題を考えます。
- 目的関数: $ f(x, y) = (x – 1)^2 + (y – 2)^2 $ を最小化する
- 制約条件: $ x + y = 3 $
この問題の最適解が $ (x, y) = (1, 2) $ ではないことは制約条件から明らかですね。
コードと結果を見ながら、CasADiの基本的な使い方を理解していきましょう。
import casadi as ca
# 1. 記号変数の定義
x = ca.SX.sym('x')
y = ca.SX.sym('y')
# 2. 目的関数の定義
f = (x - 1)**2 + (y - 2)**2
# 3. 制約条件の定義
g = x + y - 3
# 4. 最適化問題の形式を作成
# 'x'は最適化変数, 'f'は目的関数, 'g'は制約条件
nlp = {'x': ca.vertcat(x, y), 'f': f, 'g': g}
# 5. ソルバーの選択と設定
# "ipopt"は非線形計画問題を解くためのソルバー
# ソルバーのオプションを設定して、ログ出力を抑制する
opts = {'print_time': False, 'ipopt': {'print_level': 0}}
solver = ca.nlpsol('solver', 'ipopt', nlp, opts)
# 6. 最適化問題の求解
# lbg, ubgは制約条件gの下限と上限
# 今回は等式制約(g=0)なので、下限・上限ともに0
res = solver(x0=[0, 0], lbg=0, ubg=0)
# 7. 結果の表示
print("Optimal solution:")
print(res['x'])
このコードを実行すると、最適解として [1.5, 1.5] が出力されます。
手順としては、まず記号変数を定義し、それらを使って目的関数と制約条件を組み立てます。
そして、それらを辞書形式でnlpsolに渡し、ソルバーを作成します。この際、オプションを指定することで、計算時のログ出力をオフにするなど、ソルバーの挙動を制御できます。
最後に初期値x0や制約条件の上限・下限を与えて実行します。
今回はx + y – 3 = 0という等式制約なので、下限lbgと上限ubgを両方0に設定しました。もしx + y >= 3のような不等式制約を扱いたい場合は、g = x + y – 3としてlbg=0, ubg=ca.infのように設定します。ca.infはCasADiで無限大を表す定数です。
CasADiとScipy.optimizeの比較
Pythonで最適化計算を行う際、よく比較対象となるのがScipy.optimize.minimizeです。
どちらも優れたライブラリですが、得意な領域が異なります。
それぞれの特徴を比較表にまとめました。
特徴 | CasADi | Scipy.optimize |
---|---|---|
記号計算 | 可能(SX, MX) | 不可 |
微分計算 | 自動微分(高速・正確) | 数値微分(近似計算) |
ソルバー | 豊富(IPOPT, OSQPなど) | SciPy内部のソルバーが中心 |
計算速度 | 大規模問題で非常に高速 | 中規模以下の問題では十分 |
使いやすさ | やや学習コストあり | シンプルな問題なら直感的 |
主な用途 | 最適制御、大規模な非線形問題 | パラメータ推定、一般的な最適化 |
手軽に最適化を試したい、比較的小さな問題であれば、SciPyは非常に優れた選択肢です。
一方で、モデル予測制御(MPC)のように微分情報が重要になる複雑な問題や、計算速度が求められる大規模な問題に取り組む場合は、CasADiがその真価を発揮します。
目的に応じて適切なツールを選択することが重要です。
CasADiの使い方をさらに深く学びたい方は、以下のリンクも参考にしてみてください。
- 参考1:CasADi公式ドキュメント
- 参考2:GitHubリポジトリ
まとめ:CasADiで最適化問題の新たな扉を開こう
本記事では、Pythonの非線形最適化ライブラリCasADiについて、その特徴から基本的な使い方、他のライブラリとの比較までを解説しました。
CasADiは、記号変数による柔軟な式表現、自動微分による高速・正確な勾配計算、そして豊富な外部ソルバーとの連携という強力な特徴を兼ね備えています。
最初は少しとっつきにくい部分もあるかもしれませんが、一度使い方を覚えれば、これまで難しかった複雑な最適化問題を解くための心強い味方になってくれるはずです。
特に、ロボティクスやプロセス制御などの分野で研究・開発を行っている方にとっては、必須のツールと言えるでしょう。
まずはこの記事のサンプルコードを動かしてみて、CasADiのパワーを体感してみてください。