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