3.8.15. コールバック関数

コールバックとは最適化計算が定期的に呼び出すユーザ関数のことです. ユーザが最適化の状態を問い合わせ,最適化計算の挙動を制御することができます.

3.8.15.1. 分枝限定法のユーザ停止

PySIMPLE では分枝限定法の停止を制御するコールバック関数を設定することができます. ユーザは Problem インスタンスのメソッド setCallback の引数 mip_terminate に ユーザの定義した関数(コールバック関数)を渡すと,その関数が分枝限定法の計算内で呼び出されます.

コールバック関数は一つの引数をとり,bool 型を返す関数を想定します. 以下はユーザが定義するコールバック関数の関数定義です.:

def mip_terminate(solver: dict) -> bool:

True を返すと分枝限定法を停止し,False を返すと継続して実行されます. コールバック関数の引数には,本関数が呼び出された時点の最適化計算の情報が辞書型に格納されています. 以下は,引数に渡ってくる辞書型に格納されている最適化計算の情報一覧です.

キー

内容

ElapsedTime

経過時間

RelativeGap

相対ギャップ

AbsoluteGap

絶対ギャップ

Objective

目的関数値

SolutionCount

実行可能解の数

TotalMemory

メモリ消費量(MiB)

MemoryAvailable

利用可能メモリ量 (MiB)

PartialProblemCount

部分問題の数(ノード数)

以下はコールバック関数の記述例です.:

def func(solver):
    # 実行可能解の個数が 1 以上になったら分枝限定法を停止する
    if solver['SolutionCount'] >= 1:
        return True
    return False

上記で定義した関数 func を Problem インスタンス problem に設定します.:

problem.setCallback(mip_terminate=func)

以下では停止条件を設定せず,最適化計算の経過情報をカスタマイズして出力しています.:

def func(solver):
    print(solver['Objective'], solver['RelativeGap'], solver['AbsoluteGap'])
    return False

コールバック関数で停止した場合,ステータス番号 NUOPT 31 あるいは NUOPT 32 で最適化計算が終了します. 例えば,ステータス番号が NUOPT 31 の場合は以下のように出力されます.:

[Result]
STATUS                                            NON_OPTIMAL
ERROR_TYPE  (NUOPT 31) B&B terminated by user (with feas.sol.).

以下は注意事項です.

  • 実行可能解が得られていない場合,AbsoluteGap / RelativeGap は +inf の値になっています.

  • 実行可能解が得られていない場合,Objective は最大化問題の場合 -inf,最小化問題の場合 +inf の値になっています.

  • 最適化計算情報の内,MemoryAvailable は Windows 版のみ有効です.