Skip to main content

変数の定義 Variable

JijModelingでの変数の定義について紹介します。

Placeholder と Decision Variables

JijModelingでは各データを格納する変数としてPlaceholderを用いることができます。

各Placeholderには一意のlabelをつけてください。

import jijmodeling as jm
d = jm.Placeholder("d")

Placeholderがスカラーである場合は上記のように単純にPlaceholderコンストラクタに変数名labelを指定することで生成できます。しかしいわゆる配列のようなデータ構造を扱いたい場合は少しオプションを指定する必要があります。

多次元配列を作る

まず多次元配列を作る前に多次元配列の特徴を表すshapedimについて説明しておきましょう。 N×M×L配列を例に考えてみます。

JijModelingでは多次元配列において(N, M, L)という配列の大きさを表すタプルをshapeとよび、shapeタプルの長さまたは多次元配列の要素にアクセスするのに必要な添え字の数をdimと呼びます。この用語の使い方はPythonの多次元配列を扱うライブラリであるnumpy由来のものです。

JijModelingではshapeを直接していすることもできますし、shapeは不定でデータが入ってくるまでわからないという時はdimだけを指定することもできます。

例えば2次元配列

d,d_{*, *}

を作ります。

d = jm.Placeholder("d", dim=2)

この場合はdim引数に2を指定します。この2次元配列の大きさはJijModelingにデータを流し込む際にデータから読み取られます。

shapeが何かしらのPlaceholderから確定できる、または数値として確定できる場合はdimではなく、shapeを指定することで多次元配列を表すことができます。

例えば

import jijmodeling as jm
n = jm.Placeholder("n")
m = jm.Placeholder("m")

h = jm.Placeholder("h", shape=(n, m))

のようにして2次元配列を作成できます。

dimshapeの具体的な使い分けについてはJijModelingでの定式化を参照してください。

決定変数 (Decision Variable) はdimによる多次元配列には対応していないので注意してください。

決定変数 (Decision variable)

現在JijModelingではバイナリ変数と整数変数に対応しています。

バイナリ変数

スカラー

import jijmodeling as jm
x = jm.Binary("x")

多次元配列

import jijmodeling as jm
n = jm.Placeholder("n")
x = jm.Binary("x", shape=(n, n))

整数変数

JijModelingではLogEncIntegerクラスを使うことで整数を扱うことができます。こちらはLog encorded integerの略でバイナリ変数を扱うソルバーに変換する際に(つまりQUBOに変換する際に)整数を表現するエンコード方法を表しています。エンコードの詳細についてはJijModelingのクラスリファレンスを参照してください。

また整数の下限(lower)と上限(upper)を設定する必要があります。

スカラー

import jijmodeling as jm
x = jm.LogEncInteger("x", lower=0, upper=10)

多次元配列

import jijmodeling as jm
n = jm.Placeholder("n")
x = jm.LogEncInteger("x", lower=0, upper=10, shape=(n, n))

多次元配列の整数を生成する際に、各整数に対して個別の下限、上限をつけたい場合は定義する整数と同じshapeを持つPlaceholderを使うことで個別の上限下限をつけることができます。例えば整数zi,j`z_{i,j}`に対して

zi,jui,jz_{i,j} \leq u_{i,j}

という上限を設定したい場合は、

import jijmodeling as jm
u = jm.Placeholder("u", dim=2)
n, m = u.shape
# dと同じshapeで整数を作成する
z = jm.LogEncInteger("z", shape=(n, m), lower=0, upper=u)

とすることで各z,`z_{*,*}`に対して上限を設定することができます。

shapeが同じPlaceholderを設定する必要があることと各要素は各Placeholderの要素で上限が設定されることに注意してください。下図のように各要素に対応する上限が設定されます。