QUBO++: QUBO/HUBOによる組合せ最適化のためのモデリング・求解フレームワーク

QUBO++ は、組合せ最適化問題をバイナリ変数の多項式(QUBO/HUBO)として定式化・求解するフレームワークです。 制約条件を cons() で明示すると、バンドルされたソルバーが制約を満たす解を効率よく探索します。

QUBO++ の紹介(7:17・YouTube)
QUBO++ をブラウザで試す(Python)(7:15・YouTube)

ほかの動画は動画(チュートリアル)と動画(ケーススタディ)のページにあります。

  • C++ と Python — C++(QUBO++)でもPython(PyQBPP)でも使えます。
  • 簡単インストール — C++は sudo apt install qbpp、Pythonは pip install pyqbpp。ソースからのビルドは不要です。
  • シンボリックDSL — 行列のインデックスではなく、数式を書くように最適化モデルを構築。自然なforループで制約を記述することも、ベクトル演算でループなしに記述することもできます。
  • ネイティブ制約 — 制約条件を cons() で囲んで宣言すると、制約として特別に処理され、バンドルされたソルバーが制約を満たす解を効率よく探索します。ペナルティ式の重み調整の負担が減り、同じ宣言を厳密ソルバーやMIPソルバーではハード制約として扱えます。詳細はネイティブ制約(Python版)をご覧ください。
  • ネイティブ整数変数 — 有界整数変数をバイナリ変数に展開せず、ソルバーが整数値のまま直接探索します。範囲のビット数に上限はなく(任意精度整数と組み合わせれば $10^{20}$ を超える範囲も扱えます)、MIP ソルバーへも整数変数のまま渡せます。詳細はネイティブ整数変数(Python版)をご覧ください。
  • 非線形関数 — 絶対値 abs・relu・max・min を式の中で直接使えます。補助変数やペナルティ多項式を設計しなくても、バンドルされたソルバーが関数値を直接扱って探索します。詳細は非線形関数とネイティブ制約(Python版)をご覧ください。
  • 次数無制限のHUBO — 二次だけでなく任意の次数の高次項をサポート。否定リテラル(~x)をネイティブにサポートし、$\overline{x}$ を $1-x$ に置き換えることによる項数爆発を回避します。
  • 大規模な変数数 — 1つのモデルでバイナリ変数・整数変数をそれぞれ最大 1,073,741,823 個($2^{30}-1$)扱えます。
  • 任意精度の整数係数 — ビット数に上限のない整数係数を扱えます。32ビットから数千桁まで、オーバーフローの心配なく計算可能。
  • 実数(double)係数 — 整数だけでなく double 係数もサポート。式は double のまま構築し、求解時に自動で整数ソルバーへスケーリング・量子化され、エネルギーも double で返るため、整数バックエンドを意識せず実数で計算できます。
  • 3つの内蔵ソルバー — Easy Solver(高速ヒューリスティック)、Exhaustive Solver(最適性保証付き完全探索)、ABS3(GPU+CPUヒューリスティック)。
  • GPU加速 — 内蔵のABS3ソルバーがGPUリソースをフル活用して並列探索を実行。マルチGPUにも対応。Exhaustive SolverもCUDA GPUを自動的に使用します。
  • CPU並列加速 — すべてのソルバーがマルチコアCPU上でマルチスレッド並列実行されます。
  • 実験的なサードパーティソルバー連携 — SCIP, HiGHS, GLPK, CBC, IBM Qiskit Optimization, dimod ExactSolver, D-Wave samplers (Neal / Tabu / Steepest), OpenJij, TYTAN-SDK MIKAS, qubovert, Simulated Bifurcation, Google OR-Tools CP-SAT を統一された Solver.search() プロトコルで呼び出せます。SCIP・HiGHS・GLPK・CBC は C++(QUBO++)からも利用でき、その他は PyQBPP から利用できます。詳細は MILP ソルバー、CP ソルバー をご覧ください。
  • どこでも実行 — Raspberry PiからノートPC、GPUサーバー、スーパーコンピュータまで。amd64 (x86_64) および arm64 Linux で利用可能。

QUBO++ ソルバー: Easy Solver, Exhaustive Solver, ABS3 Solver

Easy Solver

  • QUBO/HUBO に最適化されたヒューリスティックソルバー: マルチコア CPU 上で QUBO/HUBO モデルの解を探索します。
  • マルチスレッド加速: マルチコアCPU上で並列探索。
  • 任意精度の整数係数: 任意の大きさの整数係数をサポート。

Exhaustive Solver

  • マルチコア CPU と CUDA GPU 上で QUBO/HUBO 定式化の全解を列挙します。
  • 最適性保証: 大域最適解が発見・証明されます。
  • マルチスレッド加速: マルチコアCPU上で並列探索。
  • 任意精度の整数係数: 任意の大きさの整数係数をサポート。
  • GPU 加速: CUDA GPU が利用可能な場合、GPU ワーカーが CPU スレッドと並行して探索に参加します。128ビット整数までの係数で GPU 加速が利用可能で、それ以上の係数は CPU のみで実行されます。

ABS3 Solver

  • マルチコア CPU と CUDA GPU 上のヒューリスティックソルバー: CPU スレッドと CUDA GPU の両方を使用して QUBO/HUBO インスタンスの解を探索します。
  • 任意精度の整数係数: 任意の大きさの整数係数をサポート。
  • マルチ GPU スケーリング: Linux ホスト上の検出されたすべての GPU を使用。128ビット整数までの係数で GPU 加速が利用可能で、それ以上の係数は CPU のみで実行されます。

対応 GPU アーキテクチャ(ABS3・Exhaustive Solver)

  • sm_70 : NVIDIA V100, TITAN V (Volta)
  • sm_75 : NVIDIA T4, Quadro RTX 6000/8000, GeForce RTX 2080 Ti/2080/2070/2060 (Turing)
  • sm_80 : NVIDIA A100, A30 (Ampere)
  • sm_86 : NVIDIA RTX A6000, A40, A10, GeForce RTX 3090/3080/3070 (Ampere)
  • sm_89 : NVIDIA L4, L40, L40S, RTX 6000 Ada, GeForce RTX 4090/4080/4070 (Ada)
  • sm_90 : NVIDIA H100 / H200 / GH200 (Hopper)
  • sm_100 : NVIDIA B200 / GB200 (Blackwell, データセンター)。B300 / GB300 (sm_103) も sm_100 用のコードで動く見込みです
  • sm_120 : GeForce RTX 5090/5080/5070(Ti)/5060(Ti)/5050、RTX PRO 6000/5000/4500/4000/2000 Blackwell (ワークステーション)
  • sm_121 : NVIDIA DGX Spark などの GB10 搭載機 (Blackwell、arm64 版)
  • 一覧にない GPU: 上の型番は代表例で、すべてを挙げてはいません。GPU が使えるかは Compute Capability で決まります(sm_XY が X.Y に当たります。nvidia-smi --query-gpu=name,compute_cap --format=csv で表示できます)。一覧にない GPU でも、Compute Capability の整数部が一覧のどれかと同じで、小数部がそれ以上なら動く見込みです。例えば GeForce RTX 3060(8.6)は sm_86 のコードで、GeForce RTX 4060(8.9)は sm_89 のコードで動きます。整数部が一覧にない GPU(6.x 以前の世代や、今後登場する新しい世代)では動きません。
  • NVIDIA ドライバ: 525 以降(CUDA 12 対応)で、お使いの GPU に対応した版が必要です。CUDA のランタイムは QUBO++ のライブラリに含まれているので、CUDA Toolkit のインストールは不要です。
  • 検証について: 実機で検証済みなのは V100、RTX 2080 Ti、A100、RTX A6000、RTX 3090、H200、GB200、RTX 5090、GB10 です。sm_89 の GPU と B300 / GB300 は未検証です。

性能に関する注意

  • パフォーマンスを最大化するため、算術オーバーフローチェックは省略されています。

ビルド環境

以下の環境を使用して QUBO++ をビルドしています。 QUBO++ は Ubuntu 20.04 に限定されません。Ubuntu 22.04/24.04/26.04 およびその他の Linux ディストリビューション(CentOS/RHEL系を含む)でもテスト済みです。 実行に必要な glibc は 2.28 以上です(RHEL / Rocky Linux 8 系でも動作します)。 C++ のプログラムをコンパイルするコンパイラと Boost は、以下と同じかそれ以降のバージョンをお使いください。 CUDA は QUBO++ のビルドに使った版です。実行には CUDA Toolkit は要らず、NVIDIA ドライバだけが必要です(上の「対応 GPU アーキテクチャ」を参照)。

  • オペレーティングシステム: Ubuntu 20.04.6 LTS
  • C++ 標準: C++17
  • glibc: 2.31(ビルドしたライブラリが実行時に必要とするのは 2.28 以上です)
  • コンパイラ: g++ 9.4.0
  • Boost: 1.71.0
  • CUDA: 12.8

QUBO++ ライセンス

無料の Trial ライセンス(30日間、10,000変数)は QUBO++ User Portal で取得できます。 QUBO++ をインストールしたら qbpp-license -s を実行して本日のサインアップコードを取得し、portal で登録すると Trial キーが受け取れます。portal の Start/Renew ボタンを押すと Trial が始まります。

ライセンスの有効化、ライセンスの種類、条件の詳細は License Management をご覧ください。

サードパーティライブラリ

以下のライブラリは QUBO++ の共有ライブラリ (qbpp_*.so) にリンクされています:

PyQBPP の Python 拡張モジュール(_nb_*.so)には、次のライブラリが組み込まれています:

オプションのソルバーバックエンド

3 つの組み込みソルバーに加え、QUBO++ は外部ソルバーへモデルを渡せます。 各ソルバーが受け取るモデルの形でグループ分けしています:

  • QUBO/HUBO ソルバー — モデルを直接受け取る(OpenJij, dimod サンプラ ほか。PyQBPP のみ)。
  • MILP ソルバー — QUBO を純 MILP に線形化してから渡す(SCIP, HiGHS, GLPK, CBC)。
  • CP ソルバー — 制約プログラミング(Google OR-Tools CP-SAT)。

サードパーティソルバーは、ライセンス条件が明確な下記のオープンソースのものに 限定しています。いずれも QUBO++ には同梱されず、別途インストールが必要です:

ソルバー ライセンス
OpenJij Apache-2.0
dimod / dwave-samplers Apache-2.0
qubovert Apache-2.0
TYTAN-SDK Apache-2.0
simulated-bifurcation MIT
Qiskit Optimization Apache-2.0
SCIP Apache-2.0
HiGHS MIT
GLPK GPL
CBC EPL
Google OR-Tools CP-SAT Apache-2.0

これらの連携は Experimental で、仕様(API)は将来予告なく変更される可能性が あります。ソルバーの全一覧・インストール方法・注意点は上記の各ページを 参照してください。


Back to top

Page last modified: 2026.11.01.

© 2026 中野浩嗣, 広島大学