はじめに
本記事では、線形相補性問題(linear complementarity problem; LCP)において重要な行列クラスであるQ行列の判定方法を紹介します。Q行列はLCPが解を持つための必要十分な条件となる行列クラスです。所与の行列がQ行列であるかを判定できるということは、その行列を入力とするLCPが解を持つかを判定できることになります。
前提知識
本記事では、以下に示す事柄を前提知識といたします。詳細は[1]をご参照ください。内容の復習と記号の確認のために、定義と定理のみを以下に記載いたします。
線形相補性問題
所与のベクトルと行列に対して、以下の条件を満たすベクトルを探す問題を線形相補性問題と呼ぶ。
相補行列
所与の行列と添え字に対して、以下の条件を満たすベクトルを横に並べた行列を相補行列と呼ぶ。
ここで、ベクトルは番目の要素が1の単位ベクトル、ベクトルは行列の番目の列ベクトルである。
相補錐
所与の行列と添え字に対して、以下の条件を満たす集合を相補錐と呼ぶ。
また、任意の相補錐の和集合を集合とする。
簡略化のため、も単に相補錐と呼ぶ。
相補錐とQ行列の関係
であるとき、かつ、そのときのみ、行列はQ行列である。
Q行列の判定方法
定理1より、行列がQ行列であるかどうかは、であるかどうかで判定できます。
これは、が小さい場合()には、相補錐を図示することで確認できます。例として、以下の行列の相補錐を図1に示します。行列は相補錐が全体を埋めているのでQ行列ですが、行列は相補錐が埋まっていない領域があるのでQ行列ではありません。
でのQ行列判定の例
一方で、が大きい場合()には、相補錐を図示することができません。したがって、同様の方法で確認することはできません。以降では、が大きい場合にも適用できるQ行列の判定方法[2]を説明します。
方針としては、相補錐がであるかどうかを、その補集合が空集合であるかどうかで判定します。を補相補錐と呼ぶことにします。
ここで、補相補錐は一般には非凸であり、これが空集合であるかを高速に判定できる方法は知られていません。そのため、補相補錐を複数の凸集合に分割して、それぞれの集合が空集合であるかどうかを確認します。凸集合であれば、内点法や楕円体法などを用いて、空集合であるかを高速に判定できます。
補相補錐を複数の凸集合に分割するために、定義式を変形していきます。まずは、元の相補錐の定義を再掲します。
各相補錐は以下のように半空間の積集合としても表現できます。ここで、ベクトルは行列の番目の行ベクトルです。
ここで、相補錐が半空間の積集合として表現できるのは、相補錐が凸多面体であることに由来します。また、半空間を解析的に求められることは、相補錐が次元空間上の本のベクトルで生成される凸錐であることに由来します。詳細についての説明は省略させていただきます。
したがって、相補錐の定義式は以下のように変形できます。
このとき、その補集合は以下となります。
最後に、テクニカルかつ本質的な変形になるのですが、和集合と積集合の分配法則を使うと、補相補錐が凸多面体の和集合になります。したがって、補相補錐を複数の凸集合に分割できました。
最後の変形をイメージしやすいように、での例を以下に記載します。
以上より、任意のに対して凸多面体が空集合であるかどうかを確認することで、行列がQ行列であるかどうかを判定できます。
ここで、には通りの組合せがありますので、高速な判定方法ではないことにご注意ください。
プログラム
上記の判定方法を実装したプログラムを
ここ
に置いておきます。is_q_matrixに判定したい行列を入力してください。また、show_complementary_coneで、の場合に限り、相補錐の可視化もできます。