.. -*- coding: utf-8 -*- 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