8. 射影とスライス#

8.1. 説明#

射影は多次元集合の各成分をそれぞれ高々 \(1\) つ選び出して,より小さい次元へと落とす写像のことである. 一方で我々が以下で述べるところのスライスはその限りではなく,必要な成分を望む順序で必要な数だけ選び出すことを許容する写像である. 数理最適化ではスライスが基本的な演算になっており,これに慣れることで自由度の高い定式化にも慣れ親しむことができる.

8.1.1. 射影とは#

多次元集合 \(M\) の要素を \((a_1,\ldots,a_m)\) とするとき, 第 \(i_1\) 成分から第 \(i_n\) 成分についての次の写像を射影とよぶ. 但し \(i_1<\cdots<i_n\) とする.

(8.1)#\[\pi_{i_1,\ldots,i_n}\colon M \to \{(a_{i_1},\ldots,a_{i_n})\}\]

例えば \(M=\{(1,2,3),(4,5,6),(7,8,9)\}\) である場合に,次の写像は何れも射影である.

(8.2)#\[\begin{split}\pi_{1}(M) &= \{1,4,7\}, \\ \pi_{3}(M) &= \{3,6,9\}, \\ \pi_{2,3}(M) &= \{(2,3),(5,6),(8,9)\}\end{split}\]

上記は PySIMPLE では次のように対応している.

1from pysimple import Set
2M = Set(value=[(1, 2, 3), (4, 5, 6), (7, 8, 9)])
3print(M(0))    # M(0)=Set(value=[1, 4, 7])
4print(M(2))    # M(2)=Set(value=[3, 6, 9])
5print(M(1,2))  # M(1,2)=Set(value=[(2, 3), (5, 6), (8, 9)])

8.1.2. スライスとは#

射影は幾何学的な事柄を背景に持っており, 高次の図形を低次の空間へと影を落としたように得られる図形に対応させる写像としての意味合いが強い. このため例えば \(M=\{(1,2,3),(4,5,6),(7,8,9)\}\) から \(M^{\prime}=\{(3,2),(6,5),(9,8)\}\) という集合を得る操作は, 射影 \(\pi_{2,3}\) と二つの成分を互換する写像 \(\sigma\) の合成になっている. というように,射影だけでない他の写像も必要になってくる.

しかし数理最適化の文脈では,幾何学的な背景を考慮してもあまり実りあるものではなく, どちらかと言えば,そのようなことを気にするあまり,正確を期すほどより煩雑な記述になってしまう.

我々はこのような徒労を避けるために,スライスとよぶ操作を定め,より複雑な定式化を柔軟に行うために用いている.

スライスとは多次元集合の要素の組み合わせを維持しながら,各成分を任意の順序で,任意の数だけ選択する操作として定める.

(8.3)#\[\mathrm{slice}_{s_1,\ldots,s_k}\colon \{(a_1,\ldots,a_m)\} \to \{(a_{s_1},\ldots,a_{s_k})\}\]

ここで \(s_1<\ldots<s_k\)\(k\leq m\) といった制約はなく,自由度の高い操作になっている.

例えば \(M=\{(1,2,3),(4,5,6),(7,8,9)\}\) である場合に,次の写像は何れもスライスである.

(8.4)#\[\begin{split}\mathrm{slice}_{1,1}(M) &= \{(1,1),(4,4),(7,7)\}, \\ \mathrm{slice}_{3,2}(M) &= \{(3,2),(6,5),(9,8)\}, \\ \mathrm{slice}_{1,3,2,1}(M) &= \{(1,3,2,1),(4,6,5,4),(7,9,8,7)\}\end{split}\]

上記は PySIMPLE では次のように対応しており,そもそもスライスを基礎とした記述になっている.

1from pysimple import Set
2M = Set(value=[(1, 2, 3), (4, 5, 6), (7, 8, 9)])
3print(M(0,0))      # M(0,0)=Set(value=[(1, 1), (4, 4), (7, 7)])
4print(M(2,1))      # M(2,1)=Set(value=[(3, 2), (6, 5), (9, 8)])
5print(M(0,2,1,0))  # M(0,2,1,0)=Set(value=[(1, 3, 2, 1), (4, 6, 5, 4), (7, 9, 8, 7)])

Tip

射影を記述する共通に普及した専用の記号は数学にはなく, \(p\), \(\pi\)\(\Pi\) 果ては \(\varpi\) など projection の p を意図した写像を書くことで表現されることが標準的である.

スライスに至っては尚更何かあるわけではない. 数理最適化の定式化では,スライスは頻出するため,できれば専用の記号が欲しいところであるが,残念ながらない.

8.1.3. 要素からの参照#

射影やスライスは集合から新たな集合を導くものであったが, 多成分の要素から,射影やスライスと同様の意味で新たな要素 (の集まり) を対応させる操作も数理最適化の定式化では重要である.

この操作は \(M=\{(a_1,\ldots,a_m)\}\) に対して,次のように書かれるものである.

(8.5)#\[\mathrm{at}_{s_1,\ldots,s_k}\colon (a_1,\ldots,a_m) \mapsto (a_{s_1},\ldots,a_{s_k})\]

この操作によって,例えば次の数式を記述できるようになる.

(8.6)#\[\sum_{m\in M}WT_{\mathrm{at}_1(m)}\cdot x_m\]

これは \(x\) については多成分の要素 \(m\) そのものを添字としている一方で, \(WT\) については \(m\) の第 \(1\) 成分のみを参照する添字についての和であることを意図した数式である.

8.1.4. SIMPLE でのスライスの記述#

PySIMPLE に限らずモデリング言語 SIMPLE ではスライスの記述が提供されている. SIMPLE の実装言語ごとの記述方法は次の表のとおりである.

種別

集合 \(M\) のスライス

要素 \(m\) のスライス

数学

\(\mathrm{slice}_{1,3,2,1}(M)\)

\(\mathrm{at}_{1,3,2,1}(m)\)

PySIMPLE

M(0,2,1,0)

m(0,2,1,0)

C++SIMPLE

M.slice(1,3,2,1)

m.at(1,3,2,1)

8.2. 関連#