solve_binary_fm_instance#
Attributes#
実装の意図 |
Classes#
OMMX Instance の連続変数を整数変数に置き換えるクラス。 |
Functions#
|
TODO: ommxのopenjij-adapterが、連続変数が決定変数に含まれる問題を扱えるようになったら削除する |
|
Module Contents#
- INTEGER_NAME = 'jijzepttools.continuous_to_integer'#
実装の意図 この実装により、連続変数を含む問題を、連続変数をバイナリ変数に変換してopenjijで解くことができる。 連続変数は与えられたresolutionで整数変数になり、log_encodeでバイナリ変数に変換される。
jztoolsのbboの仕様では、基本的にはこのような変換はadapterに押し付ける方針だが、 現状のommx-openjij-adapterは連続変数を扱えないので、暫定的にそのような変換をjztoolsに実装したという位置付け。
連続変数を含む問題に対するこの実装の価値について * SCIP求解に対する優位性の可能性: SCIP求解はサイズが大きい問題に対して非常に遅くなる可能性があるため、そのような場合にバイナリ変数変換 + openjijが活きると思われる。 * JijSolverに対する優位性の可能性: JijSolverでは連続変数SAが実装されている(25年6月時点、移動距離を乱択してメトロポリス)。
JijSolverは連続二次に問題にもヒューリスティクスとして機能するので、バイナリ変換 + openjijがJijSolverに対して優位性が出るかは不明。
- solve_by_openjij(instance: ommx.v1.Instance) ommx.v1.Solution #
TODO: ommxのopenjij-adapterが、連続変数が決定変数に含まれる問題を扱えるようになったら削除する # jztoolsに実装された連続変数→整数変換を使って連続変数が数理モデルにない状態にしても、adapterは問答無用でエラー出る。連続変数が決定変数リストにあるから、と。これが解消されたらadapterを使えばいい # 想定している処理の流れは、jztoolsの連続変数 → 整数変換、ommx_logencodeでバイナリだけの問題、openjijで解く、という流れ # TODO: この関数は制約がある問題には未対応。理由はlog_encodeを複数回呼ぶと失敗する仕様による。これが解消されたら制約対応も行う
- class ContinuousToIntegerConverter(instance_original: ommx.v1.Instance, resolution: int)#
OMMX Instance の連続変数を整数変数に置き換えるクラス。
変換の定義は以下 - 連続変数xの下限をL, 上限をUとする。resolutionをrとする。 - 新しい整数変数zを作成し、zの範囲を[0, r]とする。 - 変数変換は以下を満たすように行う。
x = (U - L) * z / r + L
- Note: このConverterは、以下の条件を満たす場合のみ適用できる。
目的関数が0
線形制約のみ
連続変数を含む等式制約がない
- original_instance: ommx.v1.Instance#
- resolution: int#
- continuous_var_scales: dict[int, float]#
- continuous_var_offsets: dict[int, float]#
- create_integer_instance() ommx.v1.Instance #
連続変数の置き換え処理を実行し、変換後の Instance を構築して返す。 同時に、add_continuous_values_to_state に必要な内部状態を self に設定する。
- add_continuous_values_to_state(state: ommx.v1.State) ommx.v1.State #
State に元の連続変数の値を追加する。create_integer_instance() が事前に呼ばれている必要がある。 State のキーチェックは簡略化されている。
- solve_binary_fm_instance(instance: ommx.v1.Instance, latent_vectors: numpy.ndarray, linear_coeffs: numpy.ndarray, bias: float, resolution_continuous_to_integer: int, solver: Callable)#