jijzepttools.blackbox_optimization.utils.to_optuna_distribution

jijzepttools.blackbox_optimization.utils.to_optuna_distribution#

Functions#

bb_problem_to_optuna_distribution(→ dict[str, ...)

BlackboxProblemの変数をOptunaの分布に変換する関数

Module Contents#

bb_problem_to_optuna_distribution(problem: jijzepttools.blackbox_optimization.problem.BlackboxProblem) dict[str, optuna.distributions.BaseDistribution]#

BlackboxProblemの変数をOptunaの分布に変換する関数

Note

ommxインスタンスからの変換のほうがbbo_ommx.pyのコードとの相性はいいが、BlackBoxProblemからの変換としている。 理由は * カテゴリカル変数の情報がBlackBoxProblemの方が使いやすい形で保持しているから(ommxだとバイナリ変数 + onehot制約になってしまっている)

Parameters:

problem – BlackboxProblemのインスタンス

Returns:

変数名をキー、Optunaの分布を値とする辞書

Return type:

dict[str, optuna.distributions.BaseDistribution]

Example

optuna TPESamplerで解く例。以下は所与とする。 ``` import optuna from optuna.samplers import TPESampler from jijzepttools.blackbox_optimization.utils.to_optuna_distribution import bb_problem_to_optuna_distribution

def sense_to_optuna_direction(sense: jm.ProblemSense) -> str:
if sense == jm.ProblemSense.MINIMIZE:

return “minimize”

elif sense == jm.ProblemSense.MAXIMIZE:

return “maximize”

else:

raise ValueError(f”Unsupported problem sense: {sense}”)

sampler = TPESampler(seed=seed, multivariate=True)

distribution = bb_problem_to_optuna_distribution(bb_model)

study = optuna.create_study(

study_name=”jztools_optuna_study”, sampler=sampler, direction=sense_to_optuna_direction(bb_problem.sense)

)

for x_init, y_init in zip(dataset[0], dataset[1]):
trial = optuna.trial.create_trial(

params=x_init, distributions=distribution, value=float(y_init[“obj1”]), state=optuna.trial.TrialState.COMPLETE,

) study.add_trial(trial)

for _ in range(n_iter):

trial = study.ask(fixed_distributions=distribution) value = float(blackbox_func(trial.params)[“y”]) study.tell(trial, value)

best_trial = study.best_trial ```