MCP solver vs NLP solver

CGEモデルをGAMSで解く際の方法について。


CGEモデルとは結局のところ均衡条件式(利潤最大化条件、効用最大化条件、市場均衡条件等)から構成される非線型連立方程式体系です(動学モデルの場合には、また話が変わってきますが)。従って、CGEモデルは次のように表現できます。

(A) f(x; a) = 0

ちょっとわかりにくいですが、x は n x 1の内生変数のベクトル(n個の内生変数)、f は n 本の式、a は k 個の外生変数です。外生変数 a を与えてやれば、内生変数の数=式の数であるので(式が独立でないというような場合を除き)、連立方程式を解くことができるはずです。

この連立方程式をGAMSで解くには二つの方法があります。

  1. MCPのソルバーで解く方法
  2. NLPのソルバーで解く方法

MCPソルバーは連立方程式を解くためのソルバーですから(厳密にはMCPを解くためのソルバーですので、少し違うのですが)、1)の方法が最も自然な解き方であると言えます。

一方、NLPソルバーは条件付きの非線型最適化問題を解くためのソルバーですから、それで連立方程式を解くということを変に思われるかもしれませんが、こちらで連立方程式体系(A)を解くには次のような方法をとります。

  1. まず、モデルとは無関係なダミーの変数 y を導入します。
  2. そして次のような最適化問題を設定します。

max y

s.t. y = 1 & f(x; a) = 0

つまり、制約条件として f(x; a) = 0 と y = 1 を設定し、その下で変数 y を最大化するという問題です。この最適化問題を解くと、(A)をそのまま連立方程式として解いたのと同じ解が求まります。

通常の最適化問題では、制約条件を満たす内生変数はユニークに決まりませんが(だからこそその中から目的関数を最大化するものを選べるのですが)、ここでは、「式fの数=xの数」ですので、y とは無関係に f(x; a) = 0 を満す x はユニークに決まることになります。従って、結局 f(x; a) = 0 という連立方程式を解くのと同じことになります。つまり、最適化問題を解くという形式をとりながら、実質的には連立方程式を解くという作業をおこなっていることになります。

実際これを解いた場合、最適化された y の値も形式上は導出されますが、y はCGEモデルとは無関係のダミーの変数ですので、単に無視すればよいだけです(しかも、それは y = 1 という条件より最初から 1 になることは明白です)。

MCPのソルバーを利用しても、NLPのソルバーを利用してもCGEモデルを解くことができるのなら、どちらを利用するかという選択が問題になります。

まず、MCPソルバーのほうがモデルを解きやすい、速く解ける傾向があると思います。これは解くCGEモデルの性質や大きさに依存することで一概に言えないですが、私の経験からすると、大きく、複雑なCGEモデルであるほど MCPソルバーを利用したほうが解きやすい傾向にあると思います。MCPソルバーが連立方程式を解くことための専用のソルバーであることを考えれば、これはある意味当たり前のことだと思います。

従って、大きいCGEモデルをできるだけ楽に解きたいということを優先するのなら、MCPソルバーを利用するのがよいかと思います。

ただ、お金がない場合には NLP のソルバーを購入して、それで解くという選択をとるのがよいかもしれません。

CGE分析などの数値計算をおこなう研究では、連立方程式を解くだけではなく、最適化問題を解く必要もしばしば生じます。一番よいのは、CGEモデルを解くにはMCPソルバーを利用し、最適化問題を解くときはNLP のソルバーを利用するというように二つを入手し使いわけることですが、お金がない場合には、NLPソルバーだけ購入し、CGEモデルを解くのにもNLPソルバーを利用してやれば、費用が安くすむということです。

大きく、複雑なCGEモデルを解きやすいということ以外にMCPソルバーを使う利点がもう一つあるのですが、それについてはまたの機会に。

[注1] ここではNLPソルバーでCGEモデルを解く方法として、ダミーの変数を導入するという方法を紹介しましたが、他の方法もあります。例えば、『テキストブック 応用一般均衡モデリング―プログラムからシミュレーションまで』で利用されている方法です。

[注2] 「競争均衡=社会的な最適化問題の解」という性質を利用して、最低化問題を解くことで均衡を求めるという方法がありますが、ここでとりあげた方法はそれとは関係ありません。


以下、ここに続く。