ABS3ソルバーの使用方法
式を解く f ABS3ソルバーを使用した式を解くには、以下の3つの手順が必要です:
- 式に対して ABS3 ソルバー (または
qbpp::abs3::ABS3Solver) オブジェクトを作成するf. - パラメータオブジェクト(または
qbpp::abs3::Params)を作成し、解の探索オプションを設定する。 - ABS
search()3ソルバーオブジェクトのメンバ関数を呼び出し、得られた解を取得する
ABS3ソルバーを用いたLABS問題の解法
以下のQUBO++プログラムは、ABS3ソルバーを用いて低自己相関二値列(LABS)問題を解きます:
#include "qbpp.hpp"
#include "qbpp_abs3_solver.hpp"
int main() {
const size_t size = 100;
auto x = qbpp::var("x", size);
auto f = qbpp::expr();
for (size_t d = 1; d < size; ++d) {
auto temp = qbpp::expr();
for (size_t i = 0; i < size - d; ++i) {
temp += (2 * x[i] - 1) * (2 * x[i + d] - 1);
}
f += qbpp::sqr(temp);
}
f.simplify_as_binary();
auto solver = qbpp::abs3::ABS3Solver(f);
auto params = qbpp::abs3::Params();
params("time_limit", "10.0");
params("enable_callback", "1");
auto sol = solver.search(params);
std::cout << sol.energy() << ": ";
for (auto val : sol(x)) {
std::cout << (val == 0 ? "-" : "+");
}
std::cout << std::endl;
}
このプログラムでは、まず式に対してABS3ソルバーオブジェクトがsolver作成される fに対してABS3ソルバーオブジェクトを作成します。
次に、パラメータparamsオブジェクトを作成し、オプション time_limit と enable_callback を設定します。
オプション time_limit オプションは最大探索時間を秒単位で指定し、 enable_callback は、検索中に新たに発見された最適解を報告するコールバック関数を有効にします。
のメンバsearch()関数 solver が引数として呼び出されます。この関数は、指定された時間制限内で見つかった最良解を返します。 params を引数として呼び出されます。
この関数は指定時間内に発見された最適解を返し、それは sol.
プログラムは解のエネルギーと対応する二進数列を出力します。ここで「+」は1を、「-」は0を表します。
このプログラムは以下の出力を生成します:
TTS = 0.002s Energy = 1218
TTS = 0.002s Energy = 1170
TTS = 0.002s Energy = 994
TTS = 0.015s Energy = 958
TTS = 0.018s Energy = 922
TTS = 0.034s Energy = 874
TTS = 4.364s Energy = 834
834: -+--+---++-++-+---++-++--+++--+-+-+++++----+++-+-+---++-+--+-----+--+----++----+-+--++++++---+------
ABS3 Solver オブジェクト
与えられた式に対してABS3ソルバー(または qbpp::abs3::ABS3Solver) オブジェクトが作成されます。
ソルバーオブジェクトの構築時、式は内部データ形式に変換されGPUメモリにロードされます。
したがって、使用するGPUデバイスの数は第二引数として指定可能です:
qbpp::abs3::ABS3Solver(expression, device_count): もしdevice_countが省略された場合、デフォルトですべての利用可能なGPUが使用されます。
パラメータオブジェクト(または qbpp::abs3::Params)は、解の探索中にABS3ソルバーが使用するオプションを格納します。
各オプションは文字列のキーと値のペアで指定されます。
上記の例では:
params("time_limit", "10.0"): 時間制限を10.0秒に設定します。params("enable_callback", "1"): 新たに取得した解のエネルギーを報告するコールバック関数を有効化します。
ABS3 パラメータ
パラメータ(または qbpp::abs3::Param()) オブジェクトは、ABS3 ソルバーが解を検索する際に使用するパラメータオプションを格納します。
オプションはキーと値を文字列として構成します。
上記のプログラムでは、 params("time_limit", "10.0") タイムリミットを10.0秒に設定
および params("enable_callback", "1") コールバック関数を有効化し、新たに得られた解のエネルギーを表示します。
基本オプション
| キー | 値 | 説明 |
|---|---|---|
time_limit |
秒単位の時間制限 | 制限時間に達した時点で検索を終了する |
target_energy |
目標エネルギー値 | 目標エネルギー値に到達したときに検索を終了します |
詳細オプション
| キー | 値 | 説明 |
|---|---|---|
enable_callback |
“1” | コールバック関数を有効化 |
block_count |
GPUあたりのCUDAブロック数 | ソルバーカーネルによって起動されるCUDAブロックの数 |
thread_count |
CUDAブロックごとのスレッド数 | CUDAブロックごとのスレッド数 |