FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ゼロから作る量子コンピュータ・シミュレータ(8. 2D +/-イジングモデルでのエネルギー最小化問題をシミュレートする(2))

GoogleのCirqのチュートリアルに記載されている、2Dの+/-イジングモデルの問題を解いてみる。

Tutorial — Cirq 0.1 documentation

f:id:msyksphinz:20181008234606p:plain

前回まででイジングモデルを使ってシミュレーションが完成したので、次はパラメータを動かして、最小のエネルギーになるパラメータを探索する。

具体的には \alpha, \beta, \gamma を0.0から1.0の間で0.2ずつ動かして、最小になる場所を探す。

h, jr, jc = random_instance(length)

print('transverse fields: {}'.format(h))
print('row j fields: {}'.format(jr))
print('column j fields: {}'.format(jc))

min_val = 100.0
min_alpha = 0.0
min_beta  = 0.0
min_gamma = 0.0

for alpha in np.arange(0.0, 1.0, 0.2):
    for beta in np.arange (0.0, 1.0, 0.2):
        for gamma in np.arange (0.0, 1.0, 0.2):
            qbit.clean()
            one_step(h, jr, jc, alpha, beta, gamma)

            energy_hist = collections.Counter()
            func = energy_func(3, h, jr, jc)

            for i in range(0, 1000):
                bits = [0 for i in range(length * length)]
                val = 0
                for idx in range(length * length):
                    bits[idx] = qbit.val(qubits[idx])
                    val = (val << 1) | bits[idx]
                val = func(bits)
                energy_hist[val] += 1

            obj_value = obj_func(energy_hist)
            print('{}, {}, {} : Value of the objective function {}'.format(alpha, beta, gamma, obj_value))

            if obj_value < min_val:
                min_val   = obj_value
                min_alpha = alpha
                min_beta  = beta
                min_gamma = gamma

print('{}, {}, {} : Minimum Value of the objective function {}'.format(min_alpha, min_beta, min_gamma, min_val))

シミュレーションしてみる。

$ ./qbit_simulator ../test/test_cirq_tutorial.py
transverse fields: [[1, -1, -1], [-1, 1, -1], [1, -1, -1]]
row j fields: [[1, -1, 1], [1, 1, -1]]
column j fields: [[-1, 1], [-1, -1], [-1, 1]]
0.0, 0.0, 0.0 : Value of the objective function -3.0
0.0, 0.0, 0.2 : Value of the objective function -3.0
0.0, 0.0, 0.4 : Value of the objective function -3.0
0.0, 0.0, 0.6000000000000001 : Value of the objective function -3.0
0.0, 0.0, 0.8 : Value of the objective function -3.0
0.0, 0.2, 0.0 : Value of the objective function -3.0
0.0, 0.2, 0.2 : Value of the objective function -3.0
0.0, 0.2, 0.4 : Value of the objective function -3.0
0.0, 0.2, 0.6000000000000001 : Value of the objective function -3.0
0.0, 0.2, 0.8 : Value of the objective function -3.0
...
0.8, 0.6000000000000001, 0.0 : Value of the objective function 2.44
0.8, 0.6000000000000001, 0.2 : Value of the objective function 2.404
0.8, 0.6000000000000001, 0.4 : Value of the objective function 2.416
0.8, 0.6000000000000001, 0.6000000000000001 : Value of the objective function 2.328
0.8, 0.6000000000000001, 0.8 : Value of the objective function 2.438
0.8, 0.8, 0.0 : Value of the objective function 2.402
0.8, 0.8, 0.2 : Value of the objective function 2.432
0.8, 0.8, 0.4 : Value of the objective function 2.412
0.8, 0.8, 0.6000000000000001 : Value of the objective function 2.414
0.8, 0.8, 0.8 : Value of the objective function 2.518
0.0, 0.0, 0.0 : Minimum Value of the objective function -3.0

イジングモデルによって結果は変わるのだが、今回の場合は最小のエネルギーは-3.0になった。たぶん動いていると思う。