変数のベクトルとベクトル関数
QUBO++ は変数のベクトルとベクトル演算をサポートしています。
変数のベクトル定義
二値変数のベクトルは、関数qbpp::var()を使用して作成できます。
qbpp::var("name", size)指定された変数のベクトルを返します。size変数のベクトルを返しますname.
以下のプログラムは、5つの変数からなるベクトルを定義し、xその名前をとします。
出力することで x を std::coutを印刷することで、5つの変数 x[0], x[1],x[2] x[3], , がx[4]含まれていることを確認できます。
次に、型qbpp::expr()推論を用いた関数を使用して、初期f値qbpp::Exprが 0とする。
forループから i = 0 から 4までのforループで、各変数 x[i] を f が複合演算子
を用いて
に+=追加されます。
最後に、 f は簡略化され、 std::cout.
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x", 5);
std::cout << x << std::endl;
auto f = qbpp::expr();
for (int i = 0; i < 5; ++i) {
f += x[i];
}
std::cout << "f = " << f.simplify_as_binary() << std::endl;
}
このプログラムの出力は以下の通りです:
{x[0],x[1],x[2],x[3],x[4]}
f = x[0] +x[1] +x[2] +x[3] +x[4]
NOTE
qbpp::var(name, size)はqbpp::Vector<qbpp::Var>size型qbpp::Varの要素を含む オブジェクトを返します。qbpp::Vector<T>クラスはほぼ互換性があります。std::vector<T>型T.
合計関数
ベクトルユーティリティ関数を使用するとqbpp::sum()、二値変数のベクトルの和を取得できます。
以下のプログラムは qbpp::sum() を使用してベクトル内の全変数の和を計算します。このプログラムの出力は前のプログラムと完全に同一です。 x:
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x", 5);
std::cout << x << std::endl;
auto f = qbpp::sum(x);
std::cout << "f = " << f.simplify_as_binary() << std::endl;
}
このプログラムの出力は、前のプログラムと全く同じです。
ワンホット制約に対するQUBO
二値変数のベクトルは、1つの要素のみが1である場合(つまり要素の和が1である場合)にワンホットベクトルとなります。 $X = (x_0, x_1, \ldots, x_{n-1})$ を $n$ 個の二値変数からなるベクトルと定義します。 以下の式 $f(X)$ は、$X$ がワンホットである場合に限り最小値0を取ります:
\[\begin{align} f(X) &= \left(1 - \sum_{i=0}^{n-1}x_i\right)^2 \end{align}\]以下のプログラムは式 $f$ を生成し、全ての最適解を見つける:
#include "qbpp.hpp"
#include "qbpp_exhaustive_solver.hpp"
int main() {
auto x = qbpp::var("x", 5);
auto f = qbpp::sqr(qbpp::sum(x) - 1);
std::cout << "f = " << f.simplify_as_binary() << std::endl;
auto solver = qbpp::exhaustive_solver::ExhaustiveSolver(f);
auto sol = solver.search_optimal_solutions();
std::cout << sol << std::endl;
}
関数 はベクトル内のqbpp::sum()全変数の和を計算する。
関数 は引数のqbpp::sqr()二乗を計算する。
網羅的ソルバーはエネルギー値が0となる全最適解を見つけ、std::coutを用いて以下のように出力する:
f = 1 -x[0] -x[1] -x[2] -x[3] -x[4] +2*x[0]*x[1] +2*x[0]*x[2] +2*x[0]*x[3] +2*x[0]*x[4] +2*x[1]*x[2] +2*x[1]*x[3] +2*x[1]*x[4] +2*x[2]*x[3] +2*x[2]*x[4] +2*x[3]*x[4]
(0) 0:{{x[0],0},{x[1],0},{x[2],0},{x[3],0},{x[4],1}}
(1) 0:{{x[0],0},{x[1],0},{x[2],0},{x[3],1},{x[4],0}}
(2) 0:{{x[0],0},{x[1],0},{x[2],1},{x[3],0},{x[4],0}}
(3) 0:{{x[0],0},{x[1],1},{x[2],0},{x[3],0},{x[4],0}}
(4) 0:{{x[0],1},{x[1],0},{x[2],0},{x[3],0},{x[4],0}}
5つの最適解すべてが表示されます。