jijzepttools.blackbox_optimization.utils.solve_binary_fm_instance#
Attributes#
実装の意図 |
Classes#
OMMX Instance の連続変数を整数変数に置き換えるクラス。 |
Functions#
|
TODO: ommx-openjij-adapterでこの関数をreplaceする。(ommx-openjij-adapterは現状は、事前にlog_encodeが呼ばれた問題を渡すと機能しないのでreplaceできない) |
|
|
|
バイナリ変数のみで表現されたFM目的関数を最小化する。 |
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でこの関数をreplaceする。(ommx-openjij-adapterは現状は、事前にlog_encodeが呼ばれた問題を渡すと機能しないのでreplaceできない)
- 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 のキーチェックは簡略化されている。
- create_binary_fm_instance(instance: ommx.v1.Instance, latent_vectors: numpy.ndarray, linear_coeffs: numpy.ndarray, bias: float, resolution_continuous_to_integer: int, diag_coeffs: numpy.ndarray | None = None)#
- solve_binary_fm_instance(binary_instance: ommx.v1.Instance, continuous_to_integer_converter: ContinuousToIntegerConverter, solver: Callable) ommx.v1.Solution#
バイナリ変数のみで表現されたFM目的関数を最小化する。