3.5.3. Printf 関数

Printf 関数は PySIMPLE の構成要素の情報を任意のフォーマットで出力させる機能を有しています. Printf 関数の書式は以下のように定められています.:

Printf(出力指定書式, 出力対象1, 出力対象2, ..)

次の例では,変数の現在値を出力させています.:

i = Element(value=[1, 2])
x = Variable(index=i, init={1: 10, 2: 20})
Printf('{}', x[i].val)

これに対する出力は以下のようになります.:

10
20

次のように記述すると,出力は以下のようになります.:

Printf('x[{}]の値 = {}', i, x[i].val)

出力:

x[1]の値 = 10
x[2]の値 = 20

変数や式に対して .val の有無は意味が異なります.:

Printf('{}', x[i])

この出力は次のようになります.:

x[1]
x[2]

以下は小数を出力する例です.小数を出力するには {:f} を用います.:

Printf('x[{}]の値 = {:f}', i, x[i].val)

出力:

x[1]の値 = 10.000000
x[2]の値 = 20.000000

表示させる桁数を指定することもできます. 以下の例では,小数点以下二桁のみが出力されるよう記述しています.:

Printf('x[{}]の値 = {:.2f}', i, x[i].val)

出力:

x[1]の値 = 10.00
x[2]の値 = 20.00

出力の幅を指定することもできます. 以下の例では,半角15文字に出力が収まるように記述しています.:

Printf('x[{}]の値 = {:15f}', i, x[i].val)

出力:

x[1]の値 =       10.000000
x[2]の値 =       20.000000

桁数と出力幅の両方をまとめて記述することもできます.:

Printf('x[{}]の値 = {:15.2f}', i, x[i].val)

出力:

x[1]の値 =           10.00
x[2]の値 =           20.00

フォーマットには他にもさまざまな書式を使用することができます. 詳細は pysimple.Printf を確認してください.

求解関数 solve の前に Print 関数を記述すると,求解前の初期状態の情報が記述されます. 例えば,次のモデルに対する出力は以下のようになります.

p = Problem(type=min)
i = Element(value=[1, 2, 3])
x = Variable(index=i)
p += Sum(2*x[i])
p += x[i] >= 5
x[i] = 10
Printf('x[{}]の値 = {:f}', i, x[i].val)  # 10
p.solve(silent=True)
Printf('x[{}]の値 = {:f}', i, x[i].val)  # 5

出力:

x[1]の値 = 10.000000
x[2]の値 = 10.000000
x[3]の値 = 10.000000
x[1]の値 = 5.000000
x[2]の値 = 5.000000
x[3]の値 = 5.000000

出力範囲を,条件式で制限する事も可能です. 以下のようにした場合,変数 x[1], x[2] の値のみが出力されます.:

i3 = i<3
Printf('x[{}]の値 = {:f}', i3, x[i3].val)

同じ添字の対象であれば,同時に複数出力することができます. 次の例では,変数 x[1], x[2], x[3],定数 a[1], a[2], a[3] の値を同時に出力させています.:

i = Element(value=[1, 2, 3])
x = Variable(index=i, init=3)
a = Parameter(index=i, value=5)
Printf('x[{:d}] = {:f}, a[{:d}] = {:f}', i, x[i].val, i, a[i])

出力:

x[1] = 3.000000, a[1] = 5.000000
x[2] = 3.000000, a[2] = 5.000000
x[3] = 3.000000, a[3] = 5.000000

次の例は求解結果を表す要素 result の情報を出力させています. 一覧は pysimple.problem.Result を確認してください.:

x = Variable()
y = Variable()
p = Problem()
p += 2*x + 3*y
p += x + 2*y == 15
p += x >= 0
p += y >= 0
p.solve(silent=True)
#print(p.result)
Printf('関数の数         {}', p.result.nfunc)
Printf('内点法の反復回数 {}', p.result.iters)
Printf('関数評価回数     {}', p.result.fevals)
Printf('目的関数値       {}', p.result.optValue)
Printf('収束判定条件     {}', p.result.tolerance)
Printf('最適性条件残差   {}', p.result.residual)
Printf('所要計算時間     {}', p.result.elapseTime)
Printf('終了時ステータス {}', p.result.errorCode)

出力:

関数の数         4
内点法の反復回数 6
関数評価回数     9
目的関数値       22.50000000376254
収束判定条件     1e-08
最適性条件残差   3.762538162000488e-09
所要計算時間     0.004999995231628418
終了時ステータス 0